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的匹配.
试试这个:
$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!
长话短说:这些不是你想要的产出!
| 归档时间: |
|
| 查看次数: |
2026 次 |
| 最近记录: |