【问题标题】:Powershell select-string returns different values depending on number of matchesPowershell 选择字符串根据匹配数返回不同的值
【发布时间】:2013-09-04 20:43:35
【问题描述】:

我有一个生成的报告文件,其中包含各种文件引用。 我正在使用 Select-String 和正则表达式来匹配某些类型的文件并对其执行后续处理。

我遇到的困境是尝试一致地确定匹配数为零 (0)、一 (1) 或多于一 (2+) 的匹配。这是我尝试过的:

(select-string -path $outputfilePath -pattern $regex -allmatches).matches.count

如果有 0 个匹配,则返回“null”,如果匹配一个,则返回“1”,如果匹配多个,则返回“null”。

(select-string -path $outputfilePath -pattern $regex -allmatches).count

如果有 0 或 1 个匹配,则返回“null”,如果有多个匹配,则返回匹配数。


我是 Powershell 的新手,但我试图找到一种一致的方法来测试匹配数,无论是 0、1 还是多于 1 个匹配。

【问题讨论】:

  • 您能否发布导致这种不一致行为的示例数据?
  • 我只是想在这里表达我的意见,因为我不能参加比赛,但我不同意这个话题的迁移。除了 Select-String 的行为之外,这里还有更多的事情发生——这个问题涉及对 Collections 和一些 .NET 类的详细说明。它适用于两者,但它有足够的编程上下文适用于 SO,根据这些元帖子:12
  • @HyperAnthony - 我撤回了我的“迁移”投票。你是对的 - 这个问题的要点似乎适合本网站的范围。
  • @Cyborgx37 谢谢,如果我在这里和 Meta 上显得过于敌对或防御性太强,我深表歉意。在继续收集有关 powershell 相关主题中标记(和站点范围)的反馈时,我会牢记您的 cmets。

标签: regex powershell select-string


【解决方案1】:

试试这个:

$content = Get-Content $outputfilePath
($content -match $regex).Count

Powershell 有许多Comparison Operators,它们可能会让你的生活更轻松。这是一个快速列表:

-eq
-ne
-gt
-ge   
-lt
-le
-Like
-NotLike
-Match
-NotMatch
-Contains
-NotContains
-In
-NotIn
-Replace

在这种情况下,-Match 会将 $content 字符串与您的正则表达式 $regex 进行匹配,并且输出按括号分组。该分组是字符串的集合。然后我们可以对对象进行计数并打印出准确的匹配计数。

那么为什么您的代码没有按预期工作?当您有一个匹配项时,.Matches 实际上会返回一个类似于字符串“test123”的System.Text.RegularExpressions.Match 对象:

Groups   : {test123}
Success  : True
Captures : {test123}
Index    : 15
Length   : 7
Value    : test123

为什么会这样?因为Microsoft.PowerShell.Commands.MatchInfo 对象是Select-String 返回的对象。您可以通过在单匹配输出上尝试一些其他属性(如 .Filename)来验证这一点。

好的,但是为什么我们不能一次完成所有的比赛呢?这是因为多个匹配将返回多个对象,所以现在您有一个要操作的集合。集合有不同的类型,不理解.Matches。在 1 场比赛中没有返回任何集合,而是一个能够理解 .Matches 的对象!

长话短说:这些不是您要寻找的输出!

【讨论】:

    【解决方案2】:

    您可以使用array sub-expression operator @(...) 始终将结果放在带有Count 的集合中:

    (Select-String ...)        # may return $null, one match, or a collection of matches
    (Select-String ...).Count  # only succeeds for two or more matches
    
    @(Select-String ...)       # always returns a collection of matches
    @(Select-String ...).Count # always succeeds
    

    【讨论】:

      猜你喜欢
      • 2021-11-24
      • 1970-01-01
      • 2022-11-03
      • 1970-01-01
      • 1970-01-01
      • 2017-08-02
      • 2021-12-07
      • 1970-01-01
      相关资源
      最近更新 更多