Powershell将变量传递给start-job

jja*_*son 18 variables powershell start-job

在powershell中,我想学习将变量调用到起始作业的最佳方法,因此我不必编辑每个服务器的脚本,因为它将基于我放置脚本的客户端而具体.

$Servername = 'Server1'
    $pingblock = {
      pathping $servername | Out-File C:\client\PS\ServerPing.TXT
    }
    start-job $pingblock
Run Code Online (Sandbox Code Playgroud)

当我运行上面的代码时,我只是得到一个帮助文件,好像我忘了指定$ servername.

Kei*_*ill 29

使用-ArgumentList参数Start-Job例如:

Start-Job -Scriptblock {param($p) "`$p is $p"} -Arg 'Server1'
Run Code Online (Sandbox Code Playgroud)

在你的情况下:

$pingblock = {param($servername) pathping $servername | Out-File C:\...\ServerPing.txt}
Start-Job $pingblock -Arg Server1
Run Code Online (Sandbox Code Playgroud)


mkl*_*nt0 20

PSv3+ 替代方案补充Keith Hill 的有用答案

$using:范围改性剂可被用于引用的在呼叫者的脚本块内部范围内的变量的值传递给Start-Job,作为替代传递参数(默认,作为后台作业执行的脚本程序块并没有看到任何呼叫者的变量或其他定义):

$Servername = 'Server1'
Start-Job { "Target: " + $using:ServerName } | Receive-Job -Wait -AutoRemoveJob
Run Code Online (Sandbox Code Playgroud)

以上产生:

$Servername = 'Server1'
Start-Job { "Target: " + $using:ServerName } | Receive-Job -Wait -AutoRemoveJob
Run Code Online (Sandbox Code Playgroud)

请注意,在传递要在远程计算机上执行的脚本块时可以使用相同的技术来Invoke-Command查看此问题