2017-08-22 3 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

あなたのスクリプトで何が起こっているか/起こっていないことを説明してください。それは何かをしますか?すべてのファイルが1つのフォルダに作成されていますか? – andyb

+0

現在、同じディレクトリにファイルを作成していますが、元のファイル名を保持したいので、 '$ _。FullName'を渡しているので、元のファイルを空のファイルで上書きしています。 元のファイル自体を編集する方法があり、アウトファイルを作成しないのに何も見つからなかった場合は、インターネットで検索しようとしました –

+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にそれをフィルタリングし、それを書いているやっているすべての元のファイルに戻します。

もう1つのオプション(Replacing Contents of a Text File Using Powershell)は、Get-Contentコマンドを括弧で囲むことで、完全な内容を強制的にロードしてからパイプラインを通過させます。これによりコードは短くなりますが、間違いなく理解できません。

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ビットフォーマット(ユニコード)。 '-Encoding'パラメータを' Out-File'に追加することで特定のフォーマットを強制することができます。 – andyb

+0

はい、あなたは正しいですが、Powershellはそれらをユニコードで書き直していました。それを-encoding asciiに変更しました –

関連する問題