使用PowerShell循环访问目录中的文件
如何更改以下代码以查看目录中的所有.log文件,而不仅仅是一个文件?
我需要遍历所有的文件,并删除所有不包含“step4”或“step9”的行。 目前这将创build一个新的文件,但我不知道如何使用这里的for each
循环(新手)。
实际的文件命名如下: 2013 09 03 00_01_29.log 。 我希望输出文件覆盖它们,或者让SAME名称附加“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
试试这个:
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\"
然后你可以遍历这个variables:
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 }
如果您需要recursion循环到某个特定文件types的目录中,请使用以下命令,该命令将doc
文件types的所有文件
$fileNames = Get-ChildItem -Path $scriptPath -Recurse -Include *.doc
如果您需要对多种types进行过滤,请使用以下命令。
$fileNames = Get-ChildItem -Path $scriptPath -Recurse -Include *.doc,*.pdf
现在, $fileNames
variables作为一个数组 ,从中循环并应用您的业务逻辑。
其他答案很好,我只是想添加…在PowerShell中可用的不同方法:安装GNUWin32 utils和使用grep来查看行/redirect输出到文件http://gnuwin32.sourceforge.net/
这会每次覆盖新的文件:
grep "step[49]" logIn.log > logOut.log
这会附加日志输出,以防覆盖logIn文件并希望保留这些数据:
grep "step[49]" logIn.log >> logOut.log
注意:要能够在全局范围内使用GNUWin32 utils,必须将bin文件夹添加到系统path中。