就像Where-Object在PowerShell 2中不起作用一样

时间:2014-09-26 15:28:41

标签: powershell powershell-v2.0

我有一段脚本可以在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服务器的环境)。

知道如何让它正常工作吗?

1 个答案:

答案 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中使用。