次のコードを変更して、ディレクトリ内の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
これを試してみてください。
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')
}
ディレクトリの内容を取得するには、あなたが使用することができます
$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
}
特定の種類のファイルについてディレクトリ内を再帰的にループする必要がある場合は、doc
ファイルタイプのすべてのファイルをフィルタ処理するbelowコマンドを使用します。
$fileNames = Get-ChildItem -Path $scriptPath -Recurse -Include *.doc
複数の種類でフィルタ処理を実行する必要がある場合は、下記のコマンドを使用してください。
$fileNames = Get-ChildItem -Path $scriptPath -Recurse -Include *.doc,*.pdf
$fileNames
変数は array として機能し、そこからループしてビジネスロジックを適用できます。