我正在使用正则表达式来匹配文件内容:
> (get-content $_) -match $somePattern
the line of text that matches the pattern
这返回true,匹配,但是我的$ matches变量保持为null。
> $matches -eq $null
True
$ match不应该包含匹配组吗?
答案 0 :(得分:62)
严格来说,string -match ...
和collection -match ...
是两个不同的运营商。
第一个获取布尔值并填充$matches
。
第二个获取与模式匹配的每个集合项,并且显然不填充$matches
。
如果文件包含一行(第一个操作符有效),您的示例应该按预期工作。
如果文件包含2+行,则使用第二个运算符,并且未设置$matches
。
对于应用于集合的其他布尔运算符也是如此。
即collection -op ...
返回item -op ...
为真的项目。
示例:
1..10 -gt 5 # 6 7 8 9 10
'apple', 'banana', 'orange' -match 'e' # apple, orange
如果使用得当,应用于集合的布尔运算符很方便。 但它们也可能令人困惑,并且容易犯错:
$object = @(1, $null, 2, $null)
# "not safe" comparison with $null, perhaps a mistake
if ($object -eq $null) {
'-eq gets @($null, $null) which is evaluated to $true by if!'
}
# safe comparison with $null
if ($null -eq $object) {
'this is not called'
}
-match
和-notmatch
的另一个例子可能看起来令人困惑:
$object = 'apple', 'banana', 'orange'
if ($object -match 'e') {
'this is called'
}
if ($object -notmatch 'e') {
'this is also called, because "banana" is evaluated to $true by if!'
}
答案 1 :(得分:8)
我遇到了同样的问题,确切的行是从Powershell命令提示符开始的,但不是来自Powershell ISE或正常的命令提示符。如果你不想使用foreach逐个遍历文件的所有行,你可以简单地将它转换为这样的字符串,它应该可以工作:
if([string](Get-Content -path $filePath) -match $pattern)
{
$matches[1]
}