在 powershell 脚本中设置环境变量,从 .bat 文件中读取它们

Setting environment variables in powershell script reading them from a .bat file

我有一个启动进程的 .bat 文件,我想通过使用 powershell 脚本执行一些自动化操作。 bat 文件必须保留不依赖于我的原因。 .bat 文件包含一些环境变量的定义,例如:

@echo Opening solution.
set QTDIR=C:\Environment\Qt.15.2\msvc2019_64
set PHYSX_HEADER=C:\Environment\PhysX-3.3-3.3.4-1.3.4\PhysXSDK\Include
set PHYSX_LIB_DEBUG=C:\Environment\PhysX-3.3-3.3.4-1.3.4\PhysXSDK\Lib\vc16win64
set DDS_ROOT=C:\Environment\OpenDDS-DDS-3.16\
set ACE_ROOT=C:\Environment\OpenDDS-DDS-3.16\ACE_Wrappers\
set TAO_ROOT=C:\Environment\OpenDDS-DDS-3.16\ACE_Wrappers\TAO\

rem Setting doxygen
for /f "delims=" %%i in ('where doxygen') do set DOXYGEN_EXECUTABLE="%%i"

"C:\Program Files (x86)\Microsoft Visual Studio19\Community\Common7\IDE\devenv.exe" /Log "%USERPROFILE%\MyVSLog.xml" MySolution.sln

exit

这是因为不同的项目需要同名不同内容的env变量。

现在我想在 powershell 脚本上下文中创建我在 .bat 文件中创建的相同环境变量,以便编译器和其他需要定义它们的进程可以使用它们。

在 powershell 脚本中,我能够读取存储在 bat 文件中的 environemnts 变量的名称和值,代码如下(出于调试目的而显得冗长):

$startBatFile = "$rootPath/Start_Solution.bat"

# Read environment variables
Select-String '^set ([^=]*)=(.*)' $startBatFile | ForEach-Object {
  "object is $_"
  $splitted = $_.Line.Split("=")
  "splitted is $splitted"
  $nameSplitted = $splitted[0].Split(" ")
  $variableName = $nameSplitted[1]
  $variableValue = $splitted[1]
  "- Set env variable $variableName to value $variableValue"
  Set-Variable -Name "env:$variableName" -Value $variableValue
}

在循环中,我可以将 $variableName 设置为 QTDIR,将 $variableValue 设置为 C:\Environment\Qt.15.2\msvc2019_64

但是我不能将它们设置为环境变量。我希望具有与手动设置相同的行为:

$env:MyEnvVariable = $someValue

但使用 env 似乎不适用于 Set-Variable。我不能直接分配它们,因为我想避免在多个地方定义路径,并且因为我应该能够在脚本中加载包含不同环境变量定义的不同 .bat 文件,所以它们不是固定的而且我不能直接在 powershell 代码中写它们。

如何通过从 .bat 文件中读取环境变量来设置 powershell 脚本中的环境变量?

使用Set-Content,而不是Set-Variable

# Note: Parameters -Path and -Value are implied.
Set-Content "env:$variableName" $variableValue

Set-Variable 仅适用于 PowerShell 自身的变量,不适用于 environment 变量。

PowerShell 通过 provider modelEnvironment 提供程序的形式公开环境变量,它公开 Env: 驱动器(尝试 Get-ChildItem Env:)。

引用环境变量的通常形式,逐字名称(例如$Env:USERNAME)是命名空间变量符号[=43]的实例=],以及 Get-Content 调用的等价物(例如 Get-Content Env:USERNAME),或者在 分配 值的情况下,Set-Content(如图所示多于);有关详细信息,请参阅

由于您提供环境变量的名称 间接 - 通过(常规)变量的值 $variableValue - 命名空间符号是 不是一个选项,需要显式Set-Content调用。