Powershell select-string根据匹配数返回不同的值

use*_*431 4 regex powershell select-string

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

我遇到的困境是在零(0),一(1)或多于一(2+)次匹配时始终确定匹配的数量.这是我尝试过的:

(select-string -path $outputfilePath -pattern $regex -allmatches).matches.count
Run Code Online (Sandbox Code Playgroud)

如果有0个匹配则返回"null",如果匹配则返回"1",如果多个匹配则返回"null".

(select-string -path $outputfilePath -pattern $regex -allmatches).count
Run Code Online (Sandbox Code Playgroud)

如果存在0或1匹配则返回"null",如果匹配多于匹配则返回匹配数.


我对Powershell很新,但我试图找到一种一致的方法来测试匹配的数量,无论是否有0,1或多于1的匹配.

Ant*_*ace 6

试试这个:

$content = Get-Content $outputfilePath
($content -match $regex).Count
Run Code Online (Sandbox Code Playgroud)

Powershell拥有许多比较运算符,可能会让您的生活更轻松.这是一个快速列表:

-eq
-ne
-gt
-ge   
-lt
-le
-Like
-NotLike
-Match
-NotMatch
-Contains
-NotContains
-In
-NotIn
-Replace
Run Code Online (Sandbox Code Playgroud)

在这个例子中,-Match将$ content字符串与正则表达式$ regex匹配,输出按括号分组.此分组是字符串的集合.然后我们可以计算对象并打印出准确的匹配数.

那你的代码为什么不按预期工作呢?当你有一个匹配时,.Matches实际上返回一个System.Text.RegularExpressions.Match对象,对于字符串"test123",它看起来像这样:

Groups   : {test123}
Success  : True
Captures : {test123}
Index    : 15
Length   : 7
Value    : test123
Run Code Online (Sandbox Code Playgroud)

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

好的,但为什么我们不能一次性获得所有比赛?这是因为多个匹配将返回多个对象,因此现在您有一个正在尝试操作的集合.该集合具有不同的类型,并且不理解.Matches.1匹配不返回任何集合,而是确实理解的单个对象.Matches!

长话短说:这些不是你想要的产出!