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

时间:2016-02-10 13:28:13

标签: regex powershell hyper-v

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

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

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

  

指定的通配符模式无效。

似乎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时,只返回$null(如" Machine [text] ip)")。 当我只运行Get-VM时,我有一个列表,其中包含VM" Machine [text(ip)"在它(和" Machinetext"也)。

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

3 个答案:

答案 0 :(得分:2)

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

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

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

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

答案 1 :(得分:2)

刚刚将此测试作为获取通配符匹配的解决方法:

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

$Machine -like $Wildcard

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

答案 2 :(得分:0)

可以找到这个问题的答案here