我有一個啟動行程的 .bat 檔案,我想通過使用 powershell 腳本執行一些自動化操作。bat 檔案必須保留不依賴于我的原因。.bat 檔案包含一些環境變數的定義,例如:
@echo Opening solution.
set QTDIR=C:\Environment\Qt\5.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 Studio\2019\Community\Common7\IDE\devenv.exe" /Log "%USERPROFILE%\MyVSLog.xml" MySolution.sln
exit
這是因為不同的專案需要具有相同名稱但內容不同的環境變數。
現在我想在 powershell 腳本背景關系中創建我在 .bat 檔案中創建的相同環境變數,以便編譯器和其他需要定義它們的行程可以使用它們。
在 powershell 腳本中,我可以使用以下代碼讀取存盤在 bat 檔案中的環境變數的名稱和值(由于除錯目的而冗長):
$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
}
例如,在回圈中,我可以設定$variableNametoQTDIR和$variableValueto C:\Environment\Qt\5.15.2\msvc2019_64。
But I cannot set them as environment variables. I'd like to have the same behaviour as setting them manually:
$env:MyEnvVariable = $someValue
but using env does not seem to work with Set-Variable. I cannot assign them directly because I'd like to avoid to have paths defined in more than one place, and because I should be able to load in the script different .bat files that contains diffferent definitions for environment variables, so they are not fixed and I cannot write them directly in the powershell code.
How can I set environment variables in powershell script by reading them from the .bat file?
uj5u.com熱心網友回復:
使用Set-Content,而不是Set-Variable:
# Note: Parameters -Path and -Value are implied.
Set-Content "env:$variableName" $variableValue
Set-Variable僅適用于 PowerShell 自己的變數,不適用于環境變數。
PowerShell 通過提供者模型以提供者的形式公開環境變數,提供Environment者公開Env:驅動器 (try Get-ChildItem Env:)。
使用逐字名稱(例如)參考環境變數的通常形式是命名空間變數表示法$Env:USERNAME的一個實體,并且等效于呼叫(例如),或者在分配值的情況下(如上所示);有關更多資訊,請參閱此答案。Get-ContentGet-Content Env:USERNAMESet-Content
由于您間接提供環境變數的名稱- 通過(常規)變數的值$variableValue- 命名空間表示法不是一個選項,并且需要顯式Set-Content呼叫。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/435564.html
