Invoke-Command in a background job

15,278

Solution 1

Looks like you should do it the other way:

http://technet.microsoft.com/en-us/library/hh849698.aspx

To run a background job on a remote computer, use the AsJob parameter that is available on many cmdlets, or use the Invoke-Command cmdlet to run a Start-Job command on the remote computer. For more information, see about_Remote_Jobs.

Solution 2

I prefer to use Start-Job to run invoke-command so that I can watch and handle the jobs on the central machine using Get-Job.

When I loop through the "list of remote computers" I use the "current computer name" as the -Name parameter in the Start-Job so that I can watch each job individually and as a group.

Just my two cents from experience.

Edit Example:

$job =
{ 
    $remoteJob = { ##Do Stuff Here }
    Invoke-Command -ComputerName $args[0] -ScriptBlock $remoteJob
}
Start-Job -Name <jobName> -ScriptBlock $job -ArgumentList <remoteComputer>

To your question about why the Job "never finishes" I don't have input other than, make sure the code you are running remotely does actually end.

Hope this helps

Solution 3

This will also work, at least in Powershell 5

invoke-command -asjob -computer $PC -scriptblock { ## do stuff }
Share:
15,278

Related videos on Youtube

bones
Author by

bones

Updated on September 14, 2022

Comments

  • bones
    bones 8 months

    I have a powershell 2.0 script which should run a command on several servers and process the output. I want to run the command and the processing for each server in a background job.

    The comand works without any problems and terminates within half a second or less:

    Invoke-Command -ComputerName $client -ScriptBlock { #do some stuff }
    

    But when I run this in a background job, the job doesn't terminate:

    Start-Job { Invoke-Command -ComputerName $client -ScriptBlock { #do some stuff } }
    

    Has someone a idea what the problem could be?

  • bones
    bones almost 10 years
    But this runs the job on the remote computer. I want to run the job on the executing computer and process the output from the invoke-command in this job.
  • Andy Arismendi
    Andy Arismendi almost 10 years
    @bones I think the effect is the same. Invoke-Command should kick off the job on the remote machine and return immediately. You can use Receive-Job -ComputerName to get the result.