PowerShell在评估switch条件后,会把 $Matches变量重置为 $null

编程语言 2026-07-08

我想在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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章