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

如何在PowerShell中启动新PowerShell窗口并正确解析传递的动态参数

问题根因

你当前的写法有两个硬伤,直接导致变量传不到新窗口里:

  • 新弹出来的PowerShell是完全独立的进程,根本读不到原窗口里的$system、$version变量,你直接把脚本块丢给新进程,块里的变量在新环境里是完全未定义的空值
  • 原脚本块里的Write-Host用单引号包着输出文本,PowerShell里单引号本身就不会解析变量,就算变量存在,文本也会原样输出,不会替换成实际值
    跨进程传参最稳的做法,根本不要指望新进程读原窗口的变量,直接在原窗口把所有变量值都替换成实际内容,拼好完整的命令字符串,再丢给新窗口执行就行。
修正后的单窗口实现

把你当前的C:\temp\SystemWrapper.ps1替换成下面的内容,就能达到你要的输出效果:

$system = "1"
$version = "1.0.0.0"
Write-Host("Triggering system $system / 10 with version $version")

# 在原窗口就把变量值替换掉,拼好新窗口要执行的完整命令
$execCommand = "Write-Host 'Starting system $system / 10 with version $version'; C:\temp\MyScript.ps1 -system '$system' -version '$version'; Read-Host"

# 弹新窗口,把拼好的命令传过去执行
Start-Process powershell -ArgumentList "-NoExit", "-Command", $execCommand

写法逻辑说明

  • 拼接命令的时候用的是双引号,原窗口执行到这行的时候就会自动把$system、$version替换成实际值,新窗口拿到的是已经替换完的成品命令,根本不需要自己找变量
  • 调MyScript.ps1的时候显式写了参数名,不会因为参数位置错了传值失败
  • 加了-NoExit参数,新窗口执行完命令不会直接闪退,比只靠Read-Host卡窗口的写法稳定得多
批量启动10个窗口的适配逻辑

要实现你需求里批量开10个窗口的能力,只要套个循环就行,不需要单独写10行启动命令:

$version = "1.0.0.0"
foreach ($currentSystem in 1..10) {
    Write-Host("Triggering system $currentSystem / 10 with version $version")
    $execCommand = "Write-Host 'Starting system $currentSystem / 10 with version $version'; C:\temp\MyScript.ps1 -system '$currentSystem' -version '$version'; Read-Host"
    Start-Process powershell -ArgumentList "-NoExit", "-Command", $execCommand
}

特殊字符兼容

如果你的$system或者$version值里可能带单引号,得提前做转义,不然会把命令结构搞坏,导致参数解析失败:

# 把内容里的单引号替换成两个单引号转义
$escapedSystem = $currentSystem -replace "'", "''"
$escapedVersion = $version -replace "'", "''"
$execCommand = "Write-Host 'Starting system $escapedSystem / 10 with version $escapedVersion'; C:\temp\MyScript.ps1 -system '$escapedSystem' -version '$escapedVersion'; Read-Host"

内容的提问来源于stack exchange,提问作者philipp-fx

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.22 22:06:03