You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 22:45:30