我希望能够将环境变量从一个 PowerShell 进程传递到另一个。
我有一个“入口点”脚本,我们称之为
Script1.ps1
。从 Script1.ps1
,我想将环境变量传递给 Script2.ps1
,我通过 Start-Process
块启动它。
Script1.ps1
的Start-Process
块:
$MY_ENV_VAR = "hello world!"
$arg_list = @(
"-ExecutionPolicy Bypass",
"-NoExit",
"-Command", ".\Script2.ps1",
"-EnvVar $MY_ENV_VAR",
"-ErrorAction Continue"
)
Start-Process 'PowerShell.exe' `
-NoNewWindow `
-ArgumentList $arg_list `
-Wait
Script2.ps1
Write-Host "The message from Script1 was: $MY_ENV_VAR"
我希望它返回
"The message from Script1 was: hello world!"
,但它返回:
"The message from Script1 was:"
我会使用
-Environment
7.4 版中添加到 Start-Process
的 pwsh
参数,但遗憾的是,我需要使用 Windows 10 的内置 PowerShell,因为它作为虚拟机设置脚本套件的一部分运行在人们可以从互联网上安装任何东西之前运行。
在这种情况下没有理由使用
Start-Process
,但处理方法是,首先将 -Command
更改为 -File
,然后由于您使用的是 -EnvVar
,这将意味着脚本中的一个参数 Script2.ps1
因此您可以使用 param
块添加该参数。
总而言之,调用者可以是:
$MY_ENV_VAR = 'hello world!'
$arg_list = @(
'-ExecutionPolicy Bypass',
'-NoExit',
'-File', '.\script2.ps1',
"-EnvVar $MY_ENV_VAR"
'-ErrorAction Continue'
)
$startProcessSplat = @{
NoNewWindow = $true
ArgumentList = $arg_list
Wait = $true
FilePath = 'PowerShell.exe'
}
Start-Process @startProcessSplat
并且
script2.ps1
应该是:
param($EnvVar)
Write-Host "The message from Script1 was: $EnvVar"
调用脚本的更简单方法是直接调用
powershell.exe
:
$MY_ENV_VAR = 'hello world!'
powershell -File .\script2.ps1 -EnvVar $MY_ENV_VAR -ErrorAction Continue
或者直接调用脚本:
$MY_ENV_VAR = 'hello world!'
.\script2.ps1 -EnvVar $MY_ENV_VAR -ErrorAction Continue