2017-08-22 69 views
0

我试图读取多个子目录中的多个CSV文件,并使用PowerShell脚本执行基于过滤器的一些行删除操作。使用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

解释你的脚本发生了什么/没有发生。它有什么作用吗?是否在一个文件夹中创建了所有文件? – andyb

+0

目前它在相同的目录中创建文件,但问题是它正在传递'$ _。FullName',因为我想保留原始文件名,所以它会用空文件覆盖原始文件。 我试图在互联网上搜索,如果有一种方法来编辑原始文件本身,而不是产生一个out-file,但没有发现任何东西 –

+0

所以你想要替换原来的文件? – andyb

回答

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 
    } 
+0

感谢@andyb,它的工作,但我的文件大小增加到几乎翻了一番 –

+0

我的猜测是原始文件是8位格式(ascii),PowerShell将它们重写为16位格式(unicode)。您可以通过在'Out-File'中添加'-Encoding'参数来强制执行特定的格式。 – andyb

+0

是的,你是对的,Powershell正在用unicode重写这些文件。将其更改为-encoding ascii –

相关问题