我有一段脚本可以在VM上做一些事情。这是:
$powered = Get-VM VM-TEST4-* | Where-Object { $_.PowerState -eq 'PoweredOn'
ForEach-Object -InputObject $powered { Shutdown-VMGuest -VM $_ }
# taking snapshots etc etc
# BELOW FAILS
# start up machines in order
Where-Object -Like -Property Name -InputObject $powered -Value "VM-TEST4-DB*" | ForEach-Object { if ($_ -ne $null) { Start-VM -VM $_ } }
sleep -Seconds 180
Where-Object -Like -Property Name -InputObject $powered -Value "VM-TEST4-AUX*" | ForEach-Object { if ($_ -ne $null) { Start-VM -VM $_ } }
sleep -Seconds 180
Where-Object -Like -Property Name -InputObject $powered -Value "VM-TEST4-WEB*" | ForEach-Object { if ($_ -ne $null) { Start-VM -VM $_ } }
sleep -Seconds 180
我对这段代码的问题是什么都没有开始,我只等待。现在它背后的想法是过滤掉正确的服务器类型,以便DB比AUX和WEB更早启动,而$_ -ne $null
检查保护我,如果Where-Object
没有返回结果(我们有一个没有AUX服务器的环境)。
知道如何让它正常工作吗?
答案 0 :(得分:3)
3.0中引入了简化的where-object语法(包括-like switch参数)。 -like运算符在标准where-object语法中工作正常。你想要这样的东西:
Where-Object {$_.Name -like "VM-TEST4-WEB*"}
编辑:
在3.0中添加了where-object(在简化语法中看起来像运算符)的-Like参数。执行字符串比较的-Like运算符自1.0以来一直在PowerShell中使用。