如何使用ArgumentList将环境变量传递给Start-Process?

问题描述 投票:0回答:1

我希望能够将环境变量从一个 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,因为它作为虚拟机设置脚本套件的一部分运行在人们可以从互联网上安装任何东西之前运行。

https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.management/start-process?view=powershell-7.4

windows powershell scripting environment-variables start-process
1个回答
0
投票

在这种情况下没有理由使用

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
© www.soinside.com 2019 - 2024. All rights reserved.