【问题标题】:Get line and line number from Select-String从 Select-String 中获取行号和行号
【发布时间】:2016-03-07 20:18:21
【问题描述】:

我有这个脚本很好用,但我还需要它来返回行号和行。

如果我这样做

Select-String w:\test\york\*.* -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([\w\W]*)$pattern([\w\W]*)<h2>Stay Connected"
        } elseif (Get-Content $_.FullName | Select-String -Pattern "<h2>Soyez branch") {
            Select-String -InputObject (Get-Content $_.FullName | Out-String) -Pattern "(?sm)<main([\w\W]*)$pattern([\w\W]*)<h2>Soyez branch"
        } else {
            Select-String -InputObject (Get-Content $_.FullName | Out-String) -Pattern "(?sm)<main([\w\W]*)$pattern([\w\W]*)<\/main>"
        }
    }
} | Select Fullname | ? {$_.FullName -notlike $exclude}

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

#TYPE Selected.System.IO.FileInfo
全名
W:\test\york\test.html

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


根据 Ansgar Wiechers 的回答进行了编辑。

$pattern 是“教科书”。

这是我当前的代码:

param(
    [string]$pattern,
    [string]$path,
    [string]$name  
) 
$expr = "(?sm)<main([\w\W]*)$pattern([\w\W]*)" +
        '(?:<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:\test\search_results\$name.csv" -NoType

如果我替换

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

通过

$expr = $pattern

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

【问题讨论】:

  • 哇,那是.... 提示:变量(用于存储文件内容)和foreach ($file in $files) 没有任何问题。您不必使用管道。学习一门新语言时最重要的部分是可读性。 :-)
  • 如果你只使用"(?sm)&lt;main([\w\W]*)$pattern([\w\W]*)",你会得到匹配吗?你能提供样本输入吗?
  • 如果我只使用它,我不会得到任何匹配。我也尝试使用 Select-String -Pattern "(?sm)
  • 如果该正则表达式是多行结果会导致问题吗?
  • 是的。或者更确切地说,问题是由Select-String 将每个文件读取为行数组而不是单个字符串引起的。查看更新的答案。

标签: powershell get-childitem select-string


【解决方案1】:

不要让事情变得过于复杂。

$expr = "(?sm)<main([\w\W]*)$pattern([\w\W]*)" +
        '(?:<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:\path\to\your.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:\path\to\your.csv' -NoType
}

但是,在处理后过滤输出是一种资源浪费,因为您可以过滤输入并避免一开始就产生不想要的结果。

【讨论】:

  • 好的,如果我使用你的代码,我不会让表达式工作。它总是返回空文件,但如果我只放 $pattern 变量,我会得到一些东西。 param( [string]$pattern, [string]$path, [string]$name) $expr = "(?sm)
    保持联系|

    Soyez 分支|)' Get-ChildItem -Path $path -Recurse -Filter *.html |选择字符串模式 $expr |选择对象路径、行号、行 |导出-Csv "W:\test\search_results\$name.csv" -NoType

  • 我发布的代码是一个sn-p,可以解决您问题中描述的问题。它不是一个可立即运行的脚本,也不打算成为一个。
  • 对不起,我是 powershell 的新手,我面临着使用 powershell 提出解决方案的压力。我怎样才能让你的解决方案运行?如果我只用变量替换您的代码,它可以工作,但我需要正则表达式搜索。我怎样才能让它工作?谢谢你的一切!
  • “仅用变量替换代码”是什么意思?请编辑您的问题,显示您当前拥有的代码并解释什么不起作用。
猜你喜欢
  • 2020-09-21
  • 1970-01-01
  • 2019-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多