如何更改以下代码以查看目录中的所有.log文件,而不仅仅是一个文件?
我需要遍历所有文件并删除不包含“step4”或“step9”的所有行。目前这将创建一个新文件,但我不确定如何使用这里的for每个循环(新手)。
实际文件命名如下:2013 09 03 00_01_29.log。我想输出文件要么覆盖它们,要么有相同的名称,附加“out”。
$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
获取您可以使用的目录的内容
$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
}
其他的答案都很好,我只是想补充……PowerShell中使用的不同方法:
安装GNUWin32 utils并使用grep查看这些行/将输出重定向到文件http://gnuwin32.sourceforge.net/
这样每次都会覆盖新文件:
grep "step[49]" logIn.log > logOut.log
这将附加日志输出,以防你覆盖logIn文件并想要保留数据:
grep "step[49]" logIn.log >> logOut.log
注意:为了能够全局使用GNUWin32 utils,你必须将bin文件夹添加到你的系统路径中。