我有一個啟動行程的 .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。
但我不能將它們設定為環境變數。我希望具有與手動設定相同的行為:
$env:MyEnvVariable = $someValue
但 usingenv似乎不適用于Set-Variable. 我不能直接分配它們,因為我想避免在多個地方定義路徑,并且因為我應該能夠在腳本中加載包含不同環境變數定義的不同 .bat 檔案,所以它們不是固定的而且我不能直接在 powershell 代碼中撰寫它們。
如何通過從 .bat 檔案中讀取它們來設定 powershell 腳本中的環境變數?
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/qiye/431811.html
上一篇:如何在CMD中顯示錯誤輸入?
