Start-Job调用Invoke-Command时$using变量无法生效的疑问
在嵌套的Start-Job和Invoke-Command中正确使用
$using:变量 问题原因
$using:关键字的作用是跨越一层会话边界传递变量:
- 最外层会话 →
Start-Job后台会话:$using:x能正常工作,因为它跨越了从当前会话到后台作业会话的边界。 - 但在后台作业会话里调用
Invoke-Command时,$using:x会被解析为后台作业会话中的$x变量,而后台作业会话里并没有直接定义$x(只有通过$using:x拿到的值,但没有存为本地变量),所以会触发报错。
解决方案
要让$using:在嵌套的Invoke-Command中生效,需要在中间的后台作业会话里,把要传递的变量存为本地变量,再通过$using:引用这个本地变量(此时$using:跨越的是后台作业会话到远程PC会话的边界)。
修正后的代码示例
$x = "yeah" $sb = { param($n) # 最外层→后台作业:$using:x正常生效 '{0}: {1}' -f $n, $using:x # 步骤1:把最外层传递来的值存为后台作业会话的本地变量 $localX = $using:x # 步骤2:后台作业→远程PC:用$using:localX引用后台会话的变量 Invoke-Command -ComputerName PC -ScriptBlock { 'invoke: {0}' -f $using:localX } # 后台作业内定义的变量,直接用$using:y传递到远程PC $y = 'foo' Invoke-Command -ComputerName PC -ScriptBlock { 'invoke2: {0}' -f $using:y } } Start-Job -ScriptBlock $sb -ArgumentList 'job' | Receive-Job -Wait -AutoRemoveJob
关键说明
$using:只能跨越一层会话边界,无法直接跨两层(最外层→远程PC),必须通过中间会话的本地变量中转。- 不需要传递整个会话给
Invoke-Command,只需要在中间会话中显式保存要传递的变量即可。
内容的提问来源于stack exchange,提问作者Silex
相关产品推荐
相关产品推荐

