使用PowerShell

时间:2017-08-22 06:05:28

标签: powershell csv powershell-v3.0

我正在尝试在多个子目录中读取多个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

我有办法吗?

1 个答案:

答案 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
    }