Difference between revisions of "Background Jobs (PowerShell)"

Jump to navigation Jump to search
m
→‎Overview: Minor rewording
m (→‎Gotchas: Rewording of "VMware PowerCLI 64 bit")
m (→‎Overview: Minor rewording)
 
(2 intermediate revisions by the same user not shown)
Line 1: Line 1:
== Overview ==
== Overview ==
This feature allows Cmdlets to run as background jobs.  Its fairly easy to work out how to make individual Cmdlet's or PowerShell scripts to run as jobs (see [http://technet.microsoft.com/en-us/library/dd315273.aspx about_Jobs], but running functions are a bit more of a pain as the job runs in a new scope (so any functions, variables etc that are defined in your scripts scope, have no meaning in the background job's scope).  Therefore functions, etc, have to explicitly included as a script block in the background job...
This feature allows Cmdlets, script blocks, or entire scripts to run as background jobs.  Its fairly easy to work out how to make individual Cmdlet's or PowerShell scripts to run as jobs (see [http://technet.microsoft.com/en-us/library/dd315273.aspx about_Jobs], but running script blocks can be a bit more of a pain as the job runs in a new scope (so any functions, variables etc that are defined in your scripts scope, have no meaning in the background job's scope - which is a bit counter-intuitive).  Therefore functions, etc, have to explicitly included as a script block in the background job...


<source lang="powershell">
<source lang="powershell">
Line 7: Line 7:
     function TestJob {
     function TestJob {
         $processList = Get-Process
         $processList = Get-Process
         Return $processList                          # Yes could be achieved in one line, but wouldn't be much of a function!
         Return $processList                          # Yes, this could be achieved in one line, but wouldn't be much of a function!
     }
     }
}
}
Line 15: Line 15:


$job | Format-List *                                # Displays created $job object
$job | Format-List *                                # Displays created $job object
</source>


Wait-Job -job $job                                  # Wait on completion of job
=== Basic Commands ===
Receive-Job -job $job                                # Gets result of $job (ie result of Get-Process)
<source lang="powershell">
Wait-Job -job $job                                  # Wait on completion of job - pause script processing until complete
Receive-Job -job $job                                # Gets result of $job (ie what would have been presented to the console had the job run in an interactive PowerShell session)
Get-Job                                              # Shows list of jobs (current and completed)
Get-Job                                              # Shows list of jobs (current and completed)
Get-Job | Remove-Job                                # Clears list of jobs
</source>
</source>


Arguments have to be passed through to the job through the <code> -InputObject </code> parameter, which isn't particularly pretty.  For further info see http://robertrobelo.wordpress.com/2010/03/14/background-jobs-input-gotcha/ for a decent explanation, though I do kind of cover this below.
=== Passing Arguments / Parameters to Jobs ===
Arguments have to be passed through to the job through the <code> -InputObject </code> parameter, which isn't particularly pretty (see below for how this works in practice)Background jobs run in a completely separate session, so objects/variables etc exists only in the scope of that job.
 
For further info see http://robertrobelo.wordpress.com/2010/03/14/background-jobs-input-gotcha/ for a fuller explanation.
 
=== Job Priority ===
Background jobs normally run with Below Normal priority (most processes, including PowerShell normally run as Normal priority). 
 
For more info on checking or changing see [[Getting_Started_(PowerShell)#Process_Priority|PowerShell Process Priority]].
 
=== Script Block or Script File ? ===
Your background task can either take the form of a script block, or a script file.  Personally I prefer to keep everything in one script as it makes organisation and maintenance easier, up to an extent.  However, there is a limit to size of a script block, though I've no idea what it is (it may relate to maximum script line length that PowerShell can handle).


'''Script Block''' or '''Script File'''...?
A script I was trying to mangle into running as a background job was large (20 KB, nearly 1000 lines), and it wouldn't run.  Unfortunately I was short on time and didn't have a convenient way to test where the breaking point was.  But your jobs will fail if they're too big.
Your background task can either take the form of a script block, or a script file.  Personally I prefer to keep everything in one script as it makes organisation easier, up to an extent.  There is a limit to size of a script block, no idea what it is, as the script I as trying to mangle into running as jobs was large (20 KB, nearly 1000 lines) and I didn't have a convenient way to test.  But your jobs will fail if they're too big.


== Job Control ==
== Job Control ==

Navigation menu