Question:
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
1 2 |
newtask addvm -id 12345 |
I then invoke Add-VM and pass $args as a string like so
1 2 |
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.
Answer:
That error is from Invoke-Expression not Add-VM and you just need quotes around the argument:
1 2 |
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:
1 2 3 4 5 6 7 8 9 |
function newtask { params([string]$command) switch ($command) { "addvm" { Add-VM @args } "deletevm" { Remove-VM @args } } } |