Passing parameters while using invoke-command

This topic contains 4 replies, has 3 voices, and was last updated by Profile photo of Curtis Smith Curtis Smith 2 months ago.

  • Author
    Posts
  • #69039
    Profile photo of marius
    marius
    Participant

    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

  • #69084
    Profile photo of Curtis Smith
    Curtis Smith
    Participant

    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

  • #69102
    Profile photo of marius
    marius
    Participant

    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

  • #69160

    Hi Marius,
    You can pass arguments like this

    Invoke-Command -ComputerName rwlvri001sv0022 -ScriptBlock {Get-Process -Name $args[0],$args[1]} -ArgumentList "lsass","svchost"
  • #69483
    Profile photo of Curtis Smith
    Curtis Smith
    Participant

    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.

You must be logged in to reply to this topic.