如何在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
相关产品推荐
相关产品推荐

