web-dev-qa-db-ja.com

PowerShellを使用してディレクトリ内のファイルをループスルーする

次のコードを変更して、ディレクトリ内の1つのファイルだけでなくすべての.logファイルを調べることができますか?

すべてのファイルをループ処理し、 "step4"または "step9"を含まない行をすべて削除する必要があります。現在これで新しいファイルが作成されますが、ここでfor eachループを使用する方法がわかりません(newbie)。

実際のファイル名は、 2013 09 03 00_01_29.log のようになります。出力ファイルに上書きするか、または「out」を追加したSAME名を付けます。

$In = "C:\Users\gerhardl\Documents\My Received Files\Test_In.log"
$Out = "C:\Users\gerhardl\Documents\My Received Files\Test_Out.log"
$Files = "C:\Users\gerhardl\Documents\My Received Files\"

Get-Content $In | Where-Object {$_ -match 'step4' -or $_ -match 'step9'} | `
Set-Content $Out
194
user2725402

これを試してみてください。

Get-ChildItem "C:\Users\gerhardl\Documents\My Received Files" -Filter *.log | 
Foreach-Object {
    $content = Get-Content $_.FullName

    #filter and save content to the original file
    $content | Where-Object {$_ -match 'step[49]'} | Set-Content $_.FullName

    #filter and save content to a new file 
    $content | Where-Object {$_ -match 'step[49]'} | Set-Content ($_.BaseName + '_out.log')
}
297
Shay Levy

ディレクトリの内容を取得するには、あなたが使用することができます

$files = Get-ChildItem "C:\Users\gerhardl\Documents\My Received Files\"

その後、この変数もループすることができます。

for ($i=0; $i -lt $files.Count; $i++) {
    $outfile = $files[$i].FullName + "out" 
    Get-Content $files[$i].FullName | Where-Object { ($_ -match 'step4' -or $_ -match 'step9') } | Set-Content $outfile
}

もっと簡単な方法はforeachループです(@Soapyと@MarkSchultheissのおかげで)。

foreach ($f in $files){
    $outfile = $f.FullName + "out" 
    Get-Content $f.FullName | Where-Object { ($_ -match 'step4' -or $_ -match 'step9') } | Set-Content $outfile
}
60
PVitt

特定の種類のファイルについてディレクトリ内を再帰的にループする必要がある場合は、docファイルタイプのすべてのファイルをフィルタ処理するbelowコマンドを使用します。

$fileNames = Get-ChildItem -Path $scriptPath -Recurse -Include *.doc

複数の種類でフィルタ処理を実行する必要がある場合は、下記のコマンドを使用してください。

$fileNames = Get-ChildItem -Path $scriptPath -Recurse -Include *.doc,*.pdf

$fileNames変数は array として機能し、そこからループしてビジネスロジックを適用できます。

22
Sarath Avanavu