如何通过ArgumentList向Start-Process传递环境变量?
解决PowerShell 5.1进程间传递环境变量的问题
问题根源
你的代码存在两个核心问题:
- 试图通过自定义命令行参数
-EnvVar $MY_ENV_VAR传递值,但PowerShell不会自动将其转换为环境变量,且Script2.ps1也没有读取该参数的逻辑。 - Windows 10内置的PowerShell 5.1不支持
pwsh 7.4新增的-Environment参数,无法直接通过Start-Process指定子进程环境变量。
解决方案1:在启动命令中先设置环境变量再执行脚本
这种方式直接在子进程启动时设置环境变量,完全匹配你传递环境变量的需求:
修改后的Script1.ps1
$MY_ENV_VAR = "hello world!" # 构造命令:先设置环境变量,再调用Script2.ps1 $command = @" `$env:MY_ENV_VAR='$MY_ENV_VAR'; .\Script2.ps1 "@ $arg_list = @( "-ExecutionPolicy Bypass", "-NoExit", "-Command", $command, "-ErrorAction Continue" ) Start-Process 'PowerShell.exe' ` -NoNewWindow ` -ArgumentList $arg_list ` -Wait
Script2.ps1无需修改
保持原代码即可:
Write-Host "The message from Script1 was: $MY_ENV_VAR"
解决方案2:通过命令行参数传递并转换为环境变量
如果需要更灵活的参数传递逻辑,可以先将值作为命令行参数传给Script2.ps1,再在脚本内将其转为环境变量:
修改后的Script1.ps1
$MY_ENV_VAR = "hello world!" $arg_list = @( "-ExecutionPolicy Bypass", "-NoExit", "-File", ".\Script2.ps1", $MY_ENV_VAR, "-ErrorAction Continue" ) Start-Process 'PowerShell.exe' ` -NoNewWindow ` -ArgumentList $arg_list ` -Wait
修改后的Script2.ps1
# 读取命令行参数并设置为环境变量 $env:MY_ENV_VAR = $args[0] Write-Host "The message from Script1 was: $MY_ENV_VAR"
说明
- 方案1更贴合你“传递环境变量”的核心需求,子进程内的所有后续操作都能直接使用该环境变量。
- 方案2适合需要传递多个参数,或需要在脚本内对参数做额外处理的场景。
内容的提问来源于stack exchange,提问作者jkix
相关产品推荐
相关产品推荐

