calling Invoke-Expression with Parameters in Powershell

19,171

Solution 1

That error is from Invoke-Expression not Add-VM and you just need quotes around the argument:

Invoke-Expression "Add-VM $argstr"

This has the drawback of forcing all objects into string format. This might be acceptable for simple types like ints and strings but if you want to pass through a more complex object it won't work. An alternative would be to splat the arguments with @args but I don't think you can do this through Invoke-Expression or Invoke-Command. You need to directly call the cmdlet:

function newtask {
    params([string]$command)

    switch ($command) {
        "addvm" { Add-VM @args }
        "deletevm" { Remove-VM @args }
    }
}

Solution 2

I know this is a little old now, but I was having a similar issue and a co-worker showed me that escaping $argstr prevents the object from getting converted to a string.

Invoke-Expression "Add-VM `$argstr"
Share:
19,171

Related videos on Youtube

anoopb
Author by

anoopb

Updated on June 04, 2022

Comments

  • anoopb
    anoopb almost 2 years

    I've written a powershell module in c# that has a bunch of cmdlets like

    Add-VM

    The cmdlets reach out to an API and pull data back.

    but for the sake of uniformity with the ssh CLI of the product, i've written a function called newtask that accepts 'addvm' as an argument and $args.

    for example

    newtask addvm -id 12345
    

    I then invoke Add-VM and pass $args as a string like so

    Invoke-Expression Add-VM $argstr
    

    The problem is that Add-VM throws an error that it cannot find a positional parameter that accepts argument System.Object[]

    A positional parameter cannot be found that accepts argument 'System.Object[]'

    While I could easily alias 'addvm' to 'Add-VM', i'm trying to maintain uniformity with the ssh CLI so that new users can quickly start utilizing this module.

    I figured that sending a string like '-id 12345' would suffice but it's not. Does the pscmdlet expect to receive something else?

    Thanks in advance.

    • Mike Zboray
      Mike Zboray over 9 years
      I'm pretty sure that error is from Invoke-Expression not Add-VM and you just need quotes around the argument: Invoke-Expression "Add-VM $argstr".
    • Mike Zboray
      Mike Zboray over 9 years
      As an aside, why would I not just use Add-VM directly? This way just seems to add more typing.
  • anoopb
    anoopb over 9 years
    This is great. Thanks for posting. Another option, which i'm using, is an array and simply check to see if $command is an element in $cmdlist.