我正在使用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"也)。
我怎样才能让它发挥作用?
答案 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