Tamer SL
Tamer SL

Reputation: 25

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?

Upvotes: 0

Views: 424

Answers (2)

Mike Shepard
Mike Shepard

Reputation: 18176

I think the actual issue here (shown by the error message) is that start-vm doesn't accept pipeline input. I'm guessing this is the Hyper-V Start-VM cmdlet, by the way.

You could do this to get around the lack of pipeline-aware parameters:

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

Upvotes: 0

Ansgar Wiechers
Ansgar Wiechers

Reputation: 200473

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

Upvotes: 1

Related Questions