从选择字符串中获取行号和行号



我有这个脚本,它工作得很好,但我也需要它来返回行号和行。

如果我这样做

Select-String w:testyork*.* -pattern "mistake"

我得到

W:\test\
york\test.html:179:

如果您发现信息单上有错误,请联系该单据的雇主、付款人或管理员。

W:\test\york\test.html:180:

如果您发现税务相关信息有误或对其他税务相关信息有账户特定问题,请致电个人所得税和信托查询热线 1-800-959-8281.

这是完美的。但是,在我的脚本中,它是这样的:

param(
    [string]$pattern,
    [string]$path  
) 
$exclude = '*test*'
Get-ChildItem -Path $path -Recurse -Filter *.html | Where-Object {
    ForEach-Object {
        if (Get-Content $_.FullName | Select-String -Pattern "<h2>Stay Connected") {
            Select-String -InputObject (Get-Content $_.FullName | Out-String) -Pattern "(?sm)<main([wW]*)$pattern([wW]*)<h2>Stay Connected"
        } elseif (Get-Content $_.FullName | Select-String -Pattern "<h2>Soyez branch") {
            Select-String -InputObject (Get-Content $_.FullName | Out-String) -Pattern "(?sm)<main([wW]*)$pattern([wW]*)<h2>Soyez branch"
        } else {
            Select-String -InputObject (Get-Content $_.FullName | Out-String) -Pattern "(?sm)<main([wW]*)$pattern([wW]*)</main>"
        }
    }
} | Select Fullname | ? {$_.FullName -notlike $exclude}

我只在我的 CSV 中得到这个结果:

#TYPE 选定.系统.IO.文件信息全名W:\test\york\test.html

如何使用脚本在 CSV 文件中获取简单搜索的结果?


根据Ansgar Wiechers的回答编辑。

$pattern是"教科书"。

这是我当前的代码:

param(
    [string]$pattern,
    [string]$path,
    [string]$name  
) 
$expr = "(?sm)<main([wW]*)$pattern([wW]*)" +
        '(?:<h2>Stay Connected|<h2>Soyez branch|</main>)'
Get-ChildItem -Path $path -Recurse -Filter *.html |
    Select-String -Pattern $expr |
    Select-Object Path, LineNumber, Line |
    Export-Csv "W:testsearch_results$name.csv" -NoType

如果我更换

$expr = "(?sm)<main([wW]*)$pattern([wW]*)" +
        '(?:<h2>Stay Connected|<h2>Soyez branch|</main>)'

$expr = $pattern

我得到 6 个结果(这是正确的),但如果我使用 Ansgar 提供的表达式,我没有得到任何结果。我缺少什么才能使表达式正常工作?

不要让事情变得比他们需要的更复杂。

$expr = "(?sm)<main([wW]*)$pattern([wW]*)" +
        '(?:<h2>Stay Connected|<h2>Soyez branch|</main>)'
$files = Get-ChildItem -Path $path -Recurse -Filter *.html
foreach ($filename in $files) {
    Get-Content $filename -Raw |
        Select-String -Pattern $expr } |
        Select-Object @{n='Path';e={$filename}}, LineNumber, Line |
        Export-Csv 'C:pathtoyour.csv' -NoType
}

无需检查每个文件两次。或者使用不同的表达方式。只需遍历 Get-ChildItem 的输出,将每个文件的内容通过管道传输到Select-String并选择生成的MatchInfo对象的相关属性。

原则上,Select-String甚至可以自己读取文件。但是,它会将内容处理为行数组,从而防止多行匹配。因此,必须使用 Get-Content -Raw(或 PowerShell v2 及更早版本中的Get-Content | Out-String)读取文件,才能在一个字符串中获取内容。

如果您需要过滤掉包含文件夹的路径test则应在Get-ChildItem之后立即执行此操作:

$files = Get-ChildItem -Path $path -Recurse -Filter *.html |
         Where-Object { $_.FullName -notlike $exclude }
foreach ($filename in $files) {
    Get-Content ...
}

从技术上讲,也可以在Select-String之后执行此操作:

$files = Get-ChildItem -Path $path -Recurse -Filter *.html
foreach ($filename in $files) {
    ...
        Where-Object { $_.Path -notlike $exclude } |
        Export-Csv 'C:pathtoyour.csv' -NoType
}

但是,在处理后过滤输出是浪费资源,而您也可以过滤输入并避免生成您首先不想要的结果。

相关内容

  • 没有找到相关文章

最新更新