Author Posts

April 20, 2017 at 1:39 pm

I need to use invoke-command to execute a PowerShell script as a job and to pass a list of values.
I found several samples in forums and blogs but none works for me.
My code should look like:

$name = "Jojn"
$familyname = "Doe"
$age = 40
invoke-command -FilePath c:\myscripts\script1.ps1 -Argumentlist $name, $familyname, $age -Asjob

while the script to be invoked (c:\myscripts\script1.ps1) should look like

param($myname, $myfamilyname, $myage)
... 

The script should run with PowerShell 4 but working with PowerShell 2 whould be a plus.
Can anybody provide an hint?
Regards
marius

April 20, 2017 at 7:05 pm

Hi Marius,
Use get-help to look at the usage for invoke-command. You will see there are 3 different parameter sets that use the parameters you have specified in your example

Invoke-Command [[-Session] ] [-FilePath]  [-ThrottleLimit ] [-AsJob] [-HideComputerName] [-JobName ] [-InputObject ] [-ArgumentList ]  []
Invoke-Command [[-ComputerName] ] [-FilePath]  [-Credential ] [-Port ] [-UseSSL] [-ConfigurationName ] [-ApplicationName ] [-ThrottleLimit ] [-AsJob] [-InDisconnectedSession] [-SessionName ] [-HideComputerName] [-JobName ] [-SessionOption ] [-Authentication  {Default | Basic | Negotiate | NegotiateWithImplicitCredential | Credssp | Digest | Kerberos}] [-EnableNetworkAccess] [-InputObject ] [-ArgumentList ]  []
Invoke-Command [-FilePath]  -Credential  -VMName  [-ThrottleLimit ] [-AsJob] [-HideComputerName] [-InputObject ] [-ArgumentList ]  []
Invoke-Command [-VMId]  [-FilePath]  -Credential  [-ThrottleLimit ] [-AsJob] [-HideComputerName] [-InputObject ] [-ArgumentList ]  []
Invoke-Command [[-ConnectionUri] ] [-FilePath]  [-Credential ] [-ConfigurationName ] [-ThrottleLimit ] [-AsJob] [-InDisconnectedSession] [-HideComputerName] [-JobName ] [-AllowRedirection] [-SessionOption ] [-Authentication  {Default | Basic | Negotiate | NegotiateWithImplicitCredential | Credssp | Digest | Kerberos}] [-EnableNetworkAccess] [-InputObject ] [-ArgumentList ] []
Invoke-Command [-FilePath]  -ContainerId  [-ThrottleLimit ] [-AsJob] [-HideComputerName] [-JobName ] [-RunAsAdministrator] [-InputObject ] [-ArgumentList ]  []
Invoke-Command [-FilePath]  -ContainerName  [-ThrottleLimit ] [-AsJob] [-HideComputerName] [-JobName ] [-RunAsAdministrator] [-InputObject ] [-ArgumentList ]  []

As a result Powershell cannot determine which parameter set to use. You should be getting an error indicating this.

Invoke-Command : Parameter set cannot be resolved using the specified named parameters.
At line:4 char:1
+ invoke-command -FilePath c:\temp\script1.ps1 -Argumentlist @($name, $ ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Invoke-Command], ParameterBindingException
    + FullyQualifiedErrorId : AmbiguousParameterSet,Microsoft.PowerShell.Commands.InvokeCommandCommand

You need to define additional parameters for the cmdlet such as -ComputerName or -Session

April 20, 2017 at 8:51 pm

Many thanks.
Let me ask for some further details:
– I see the use of [-ArgumentList ]: given I need to pass 3 parameters like in my sample cose, what is the right way to specify them?
– Is -FilePath the right way to use a file instead of a scriptblock?
– Is invoke-command the right way to run a scriptblock or a script to be executed in background?
Regards
marius

April 21, 2017 at 11:48 am

Hi Marius,
You can pass arguments like this

Invoke-Command -ComputerName rwlvri001sv0022 -ScriptBlock {Get-Process -Name $args[0],$args[1]} -ArgumentList "lsass","svchost"

April 25, 2017 at 4:14 pm

Invoke-Command is usually used if you want to run something on a remote machine. If you just want to run something in the background on the local machine, you might want to look into Start-Job or using RunSpaces.