在 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 model 以 Environment
提供程序的形式公开环境变量,它公开 Env:
驱动器(尝试 Get-ChildItem Env:
)。
引用环境变量的通常形式,逐字名称(例如$Env:USERNAME
)是命名空间变量符号[=43]的实例=],以及 Get-Content
调用的等价物(例如 Get-Content Env:USERNAME
),或者在 分配 值的情况下,Set-Content
(如图所示多于);有关详细信息,请参阅 。
由于您提供环境变量的名称 间接 - 通过(常规)变量的值 $variableValue
- 命名空间符号是 不是一个选项,需要显式Set-Content
调用。
我有一个启动进程的 .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 model 以 Environment
提供程序的形式公开环境变量,它公开 Env:
驱动器(尝试 Get-ChildItem Env:
)。
引用环境变量的通常形式,逐字名称(例如$Env:USERNAME
)是命名空间变量符号[=43]的实例=],以及 Get-Content
调用的等价物(例如 Get-Content Env:USERNAME
),或者在 分配 值的情况下,Set-Content
(如图所示多于);有关详细信息,请参阅
由于您提供环境变量的名称 间接 - 通过(常规)变量的值 $variableValue
- 命名空间符号是 不是一个选项,需要显式Set-Content
调用。