PowerShell作业传参问题:脚本块赋值后调用为何失效?
PowerShell Start-Job 脚本块调用问题解决方法
你的第二个写法无法运行的核心原因是:-ScriptBlock {$scriptblock}并没有传递你预先定义好的脚本块对象,而是创建了一个新的脚本块——这个脚本块里只是引用了$scriptblock变量,但后台作业运行在独立的PowerShell会话中,该会话不存在这个变量,就算存在也只会输出变量本身,不会执行脚本块逻辑。
下面是两种可行的解决方法:
方法一:直接传递脚本块变量
不需要额外用花括号包裹,直接将定义好的$scriptblock作为参数传给-ScriptBlock:
$scriptblock = {param($name);Write-Host $name} $job = start-job -ScriptBlock $scriptblock -ArgumentList "Test" Receive-Job -Job $job
方法二:结合$using:引用父会话变量并执行脚本块
如果需要在后台作业中添加额外逻辑,同时调用原脚本块,可以用$using:关键字让后台作业访问父会话的$scriptblock变量,再用&操作符执行脚本块,@args用来传递参数:
$scriptblock = {param($name);Write-Host $name} $job = start-job -ScriptBlock {& $using:scriptblock @args} -ArgumentList "Test" Receive-Job -Job $job
$using:的作用是突破后台作业的会话隔离,让它能读取发起作业的父会话中的变量;@args则会把-ArgumentList传递的参数原样转发给被调用的脚本块。
内容的提问来源于stack exchange,提问作者Laerte Junior
相关产品推荐
相关产品推荐

