PowerShell启动新作业调用脚本失败,寻求解决方案
问题描述
我尝试创建一个调用脚本的新作业,使用的代码如下:
Write-Output "start" $j1 = Start-Job -ScriptBlock { Write-Output "Thread1 running"; & ${PSScriptRoot}\script.ps1 -ARG1 ${arg1} -ARG2 ${arg2}; Write-Output "Thread1 finish" } $j1 | Wait-Job | Receive-Job Write-Output "done"
运行失败后报错(德语翻译):未识别名称“\script.ps1”,请检查名称拼写或路径是否正确,然后重试。问题出在& ${PSScriptRoot}\script.ps1 -ARG1 ${arg1} -ARG2 ${arg2};这一行,且已确认根路径正确,求解决方案。
解决方案
问题核心是Start-Job启动的后台作业是独立的PowerShell进程,当前会话的$PSScriptRoot、$arg1、$arg2等变量不会自动传递到新进程中,导致$PSScriptRoot为空,路径变成无效的\script.ps1。
提供两种可行解决办法:
方法1:通过-ArgumentList传递变量
将需要的路径和参数通过Start-Job的-ArgumentList传入脚本块,在脚本块内用参数接收:
Write-Output "start" $j1 = Start-Job -ScriptBlock { param($scriptRoot, $arg1Val, $arg2Val) Write-Output "Thread1 running" & "$scriptRoot\script.ps1" -ARG1 $arg1Val -ARG2 $arg2Val Write-Output "Thread1 finish" } -ArgumentList $PSScriptRoot, $arg1, $arg2 $j1 | Wait-Job | Receive-Job Write-Output "done"
方法2:使用using:作用域引用当前变量
PowerShell 3.0及以上版本支持用using:前缀直接引用当前会话的变量,无需手动传参:
Write-Output "start" $j1 = Start-Job -ScriptBlock { Write-Output "Thread1 running" & "$using:PSScriptRoot\script.ps1" -ARG1 $using:arg1 -ARG2 $using:arg2 Write-Output "Thread1 finish" } $j1 | Wait-Job | Receive-Job Write-Output "done"
注意:需确保当前会话中$PSScriptRoot有有效值(比如脚本从文件运行,而非交互式控制台直接输入代码),否则即使传递引用也会是空值。
内容的提问来源于stack exchange,提问作者BeanBoy
相关产品推荐
相关产品推荐

