within powershell I'd like to learn the best way to call a variable to a start job so I don't have to edit the script for each server as it will be specific based on the client I've placed my script on.
$Servername = 'Server1'
$pingblock = {
pathping $servername | Out-File C:\client\PS\ServerPing.TXT
}
start-job $pingblock
when I run my code above I just get a file with the help as if I forgot the specify the $servername.
Use the -ArgumentList
parameter on Start-Job
e.g.:
Start-Job -Scriptblock {param($p) "`$p is $p"} -Arg 'Server1'
In your case:
$pingblock = {param($servername) pathping $servername | Out-File C:\...\ServerPing.txt}
Start-Job $pingblock -Arg Server1
To complement Keith Hill's helpful answer with a PSv3+ alternative:
The $using:
scope modifier can be used to reference variables in the caller's scope inside the script block passed to Start-Job
, as an alternative to passing arguments (by default, a script block executed as a background job does not see any of the caller's variables or other definitions):
PS> $Servername = 'Server1'; Start-Job { "Targeting server " + $using:ServerName } |
Receive-Job -Wait -AutoRemoveJob
Targeting server Server1
Note that the same technique can be used when passing a script block for execution on a remote computer to Invoke-Command
- see this question.
来源:https://stackoverflow.com/questions/10075943/powershell-pass-variable-to-start-job