我正在尝试在多个子目录中读取多个CSV文件,并使用PowerShell脚本基于过滤器进行一些行删除。
Get-ChildItem -Path J:\new -Recurse -Filter daq*.csv | ForEach-Object {
Get-Content $_.FullName | Where {
$_ -notmatch "serverTime"
} | Out-File $_.FullName
}
但我希望输出与源文件位于相同的目录结构中。 目录结构如下:
root/ sub_dir1/ 1.csv 2.csv sub_dir2/ 1.csv 2.csv
我有办法吗?
答案 0 :(得分:0)
可能不是最佳的,甚至不是惯用的,但以下是快速测试:
Get-ChildItem -Path J:\new -Recurse -Filter daq*.csv |
ForEach-Object {
$origFile = $_
$filteredContent = Get-Content $origFile.FullName | Where{$_ -notmatch "serverTime"}
$filteredContent | Out-File $origFile.FullName
}
我们所做的就是加载每个文件的内容并将其过滤到$filteredContent
,然后将其写回原始文件。
另一个选项(由Replacing Contents of a Text File Using Powershell提供)是将Get-Content
命令包装在parens中,这会强制加载完整内容然后传递给管道。这将提供更短的代码,但可以说它不太容易理解,例如。
Get-ChildItem -Path J:\new -Recurse -Filter daq*.csv |
ForEach-Object {
$origFile = $_
( Get-Content $origFile.FullName ) |
Where{$_ -notmatch "serverTime"} |
Out-File $origFile.FullName
}