使用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

现在, $fileNamesvariables作为一个数组 ,从中循环并应用您的业务逻辑。

其他答案很好,我只是想添加…在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中。