Search code examples
powershellpowershell-3.0

Execute a different command depending on the output of the previous


I am trying out something which is quite simple, yet I can't find an answer or rather can't figure out how to ask the question on Google. So I thought it would be better to just show what I'm doing with pictures, here.

Here is the script I'm working on:

screenshot

What it does is simple: get all virtual machines depending on their state (running, saved or off) and then starting them or stopping them. That is where I am having trouble.

I tried to pipe it with different commands, but it keeps giving an error which is

The input object cannot be bound to any parameters for the command either because the command does not take pipeline input or the input and its properties do not match any of the parameters that take pipeline input.

So what I want is if the machine are running then save them. Is there a way to do so?


Solution

  • Use a ForEach-Object loop and a switch statement:

    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)
            }
        }
    }