字符串被解释为通配符表达式

String is interpreted as wildcard expression

我正在使用 PowerShell 管理 Hyper-V 远程服务器。 它有一个名为 "Machine[text(ip)" 的虚拟机,并且正在尝试通过 Get-VM 获取虚拟机实例,如下所示:

Invoke-Command  -Session $session -ScriptBlock {
    $machine = "Machine[text(ip)"
    $vm = Get-VM -Name $machine             
}

但我得到的只是一个错误:

The specified wildcard character pattern is not valid.

powershell 似乎认为 [ char 是元字符,所以我尝试了以下所有情况:

$machine = [System.Text.RegularExpressions.Regex]::Escape($machine)
$machine = "Machine`[text(ip)"
$machine = "Machine``[text(ip)"
$machine = "Machine\[text(ip)"
$machine = 'Machine[text(ip)'
$machine = @'
Machine[text(ip)
'@

但这对我没有任何作用。

当我关闭方括号 Get-VM 时,只是 returns $null(如 "Machine[text]ip)")。 当我 运行 只是 Get-VM 时,我有一个包含 VM "Machine[text(ip)" 的列表(还有 "Machinetext")。

我怎样才能让它发挥作用?

字符串中的特殊字符被解释为wildcards,而不是正则表达式。避免此类问题的最佳方法是避免在 VM 名称中使用特殊字符。

话虽如此,我希望 "Machine`[text(ip)" 可以工作(或者 "Machine```[text(ip)" 如果字符串被解释两次)。但是无法测试,因为我手边没有安装 Hyper-V。

如果转义根本不起作用,请使用 Where-Object 过滤器:

Get-Vm * | Where-Object { $_.Name -eq "Machine[text(ip)" }

刚刚测试了这个作为获取通配符匹配的解决方法:

$Wildcard = "Machine[[]text(ip)"
$Machine = 'Machine[text(ip)' 

$Machine -like $Wildcard

它似乎有效。您需要在您的系统上对其进行测试。