使用PowerShell遍历目录中的文件

use*_*402 218 powershell

如何更改以下代码以查看目录中的所有.log文件而不仅仅是一个文件?

我需要遍历所有文件并删除所有不包含"step4"或"step9"的行.目前这将创建一个新文件,但我不知道如何在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
Run Code Online (Sandbox Code Playgroud)

Sha*_*evy 325

尝试一下:

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')
}
Run Code Online (Sandbox Code Playgroud)

  • 对于v1,您可以使用以下命令提取基本名称:[io.path] :: GetFileNameWithoutExtension($ name) (6认同)

PVi*_*itt 66

获取可以使用的目录的内容

$files = Get-ChildItem "C:\Users\gerhardl\Documents\My Received Files\"
Run Code Online (Sandbox Code Playgroud)

然后你也可以遍历这个变量:

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
}
Run Code Online (Sandbox Code Playgroud)

更简单的方法是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
}
Run Code Online (Sandbox Code Playgroud)

  • 你也可以做`foreach(Get-ChildItem中的$ f"C:\ Users\gerhardl\Documents\My Received Files \"){...}` (2认同)
  • 或使用`ForEach ($f in $files){...}` (2认同)

Sar*_*avu 26

如果需要以递归方式为特定类型的文件循环内部目录,请使用以下命令,该命令筛选doc文件类型的所有文件

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

如果需要对多种类型进行过滤,请使用以下命令.

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

现在$fileNames变量充当一个数组,您可以从中循环并应用业务逻辑.

  • 令我烦恼的是隐藏和/或系统文件的遗漏。要查看它们,您必须使用 Get-ChildItem 的“-Force”参数。请参阅其文档 https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/get-childitem?view=powershell-7 。 (3认同)