我有一个生成并包含各种文件引用的报表文件。我使用String和正则表达式来匹配某些类型的文件,并对它们执行后续处理。
当有0 (0)、1 (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或多个匹配。
发布于 2013-09-04 20:50:12
试试这个:
$content = Get-Content $outputfilePath
($content -match $regex).CountPowershell有许多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的对象!
长话短说:这些不是你想要的结果!
发布于 2013-09-06 23:53:06
可以使用@(...)将结果始终放置在带有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 succeedshttps://stackoverflow.com/questions/18623419
复制相似问题