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

为何Dot Sourcing PowerShell脚本失败,直接运行却正常?

PowerShell点源运行带参数脚本失败的解决方法

问题原因

你使用.(点源操作符)时,PowerShell会把整个$scriptToRunPathWithArgs字符串当作单个脚本路径处理,而非自动拆分路径和后续参数。它会尝试寻找一个包含参数的完整文件名(比如G:\CAPTURE_SCRIPTS\STAGE_3\copy-unattend-file-to-recovery-partition.ps1 -edition HOME ...),显然这个文件不存在,因此抛出“未识别为有效命令/脚本”的错误。

而直接在控制台运行命令时,PowerShell的解析器会自动拆分路径和参数,所以能正常执行。

解决方案

方法1:分开传递脚本路径与参数数组(推荐)

不要将路径和参数拼接成单个字符串,而是用数组存储参数,点源时分别传递:

$scriptToRunPath = "${scriptDrive}:\CAPTURE_SCRIPTS\STAGE_3\copy-unattend-file-to-recovery-partition.ps1"
# 用数组存储参数,避免字符串解析问题
$scriptToRunArgs = @(
    "-edition", $edition,
    "-recoveryDriveLetter", $recovery_drive,
    "-ErrorAction", "SilentlyContinue"
)

Write-host "$scriptToRunPath $($scriptToRunArgs -join ' ')"
if(Test-Path -Path $scriptToRunPath) {
    Write-Host "Running copy-unattend-file-to-recovery-partition.ps1..."
    # 点源时分开传递路径和参数数组
    . $scriptToRunPath @scriptToRunArgs
}

方法2:使用调用操作符&(无需点源作用域时)

如果不需要将被调用脚本的变量、函数导入当前会话作用域,可改用&(调用操作符),它同样支持参数数组:

& $scriptToRunPath @scriptToRunArgs

注:点源(.)会让脚本在当前作用域执行,变量/函数会保留在当前会话;&则在子作用域执行,执行后子作用域内容会被清理,可根据需求选择。

额外修复:拼写错误

你的代码中存在拼写错误:silentyContinue应改为SilentlyContinue(少了一个l),虽然这不是本次报错的直接原因,但会影响后续错误处理逻辑。

验证效果

修改后,PowerShell会正确识别脚本路径,并将参数数组传递给目标脚本,执行效果与你直接在控制台运行命令完全一致。

内容的提问来源于stack exchange,提问作者David Fear

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 19:03:23