根据前一个的输出执行不同的命令

时间:2018-01-11 12:11:04

标签: powershell powershell-v3.0

我正在尝试一些非常简单的事情,但我无法找到答案,或者无法弄清楚如何在Google上提问。 所以我认为在这里展示我对图片做的事情会更好。

以下是我正在处理的脚本:

screenshot

它的作用很简单:根据状态(运行,保存或关闭)获取所有虚拟机,然后启动它们或停止它们。那是我遇到麻烦的地方。

我尝试使用不同的命令来管道它,但它不断给出错误

  

输入对象也不能绑定到命令的任何参数   因为该命令不接受管道输入或输入及其属性与管道输入的任何参数都不匹配。

所以我想要的是如果机器正在运行然后保存它们。有办法吗?

2 个答案:

答案 0 :(得分:1)

使用ForEach-Object循环和switch语句:

Get-VM -VMName $name | ForEach-Object {
    switch ($_.State) {
        'running' {
            # do some
        }
        'saved' {
            # do other
        }
        'off' {
            # do something else
        }
        default {
            throw ('Unrecognized state: {0}' -f $_.State)
        }
    }
}

答案 1 :(得分:0)

我认为这里的实际问题(由错误消息显示)是start-vm不接受管道输入。顺便说一下,我猜这是Hyper-V Start-VM cmdlet。

您可以这样做以避免缺少管道感知参数:

Get-VM -VMName $name | where {$_.State -eq $state} | foreach-object {Start-VM -VM $_}