首页 文章

使用PowerShell遍历目录中的文件

提问于
浏览
174

如何更改以下代码以查看目录中的所有.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

4 回答

  • 49

    尝试一下:

    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')
    }
    
  • -1

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

    $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
    }
    
  • 16

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

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

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

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

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

  • 267

    其他答案很棒,我只想添加...在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文件夹添加到系统路径中 .

相关问题