PowerShell在评估switch条件后,会把 $Matches变量重置为 $null
我想在switch语句的条件通过 -match进行求值后,获取捕获组的值。然而,当离开条件检查的作用域时,$Matches哈希表似乎会被重置为 $null。
例如,当我这样做时:
$text = "Hello World!"
if($text -match "(?<Greeting>\w{5}) World!"){
$Matches
}
它的结果是:
Name Value
---- -----
Greeting Hello
0 Hello World!
但在使用switch语句时:
$text = "Hello World!"
switch ($text){
{$_ -match "(?<Greeting>\w{5}) World!"}{
$Matches -eq $null
}
}
评估为 $true
有什么原因可能会这样吗?我确定这只是我对作用域的误解,或者对switch脚本块条件与if语句条件之间差异的理解有误。
另外,我知道有 -Regex参数,但我还有多项其他条件并非用正则表达式来评估,因此我在前面大约三个条件中使用 {$_ -match "insert-regex"}。
解决方案
你所说的是正确的,在一个 switch 语句 的scriptblock条件确实会发生在一个不同的作用域中,实际上,该作用域中的 $Matches 与调用者的作用域中的 $Matches 并不相同。这很像这样做:
$sb = { $null = 'Hello World!' -match '(?<Greeting>\w{5}) World!'; $Matches['Greeting'] }
$Matches.Clear()
$Matches # empty
$sb.InvokeReturnAsIs() # Hello
$Matches # empty
然而,解决你问题的一个非常简单的方法是使用 -Regex switch,这正是为你要做的事情而设计的:
$text = 'Hello World!'
switch -Regex ($text) {
'(?<Greeting>\w{5}) World!' {
$Matches['Greeting'] # Hello
}
}
使用它并不一定意味着你不能继续使用脚本块条件,例如,这完全有效:
$tests = 'Hello World!', '0123'
switch -Regex ($tests) {
'^[0-9]' {
'starts with a number'
}
{ $_.StartsWith('Hello') } {
'starts with hello'
}
}
如果这对你不起作用,那么我的建议是不要使用一个 switch 语句,而改用串联的 if 条件来替代……否则你只会让代码变得比应该的更复杂、也更难理解。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。