Powershell cleanup env
Wer öfter schon Build-Scripte für VisualStudio oder ähnliches geschrieben hat, kenn vielleicht das Problem. Nach jedem ausführen einse scriptes, batches oder was auch immer, sind die Umgebungsvariablen "verpfuscht". Ein neuer Build mit einer anderen VisualStudio Version schlägt dann fehl.
Deshalb habe ich meine Build-Scripte um eine Cleanup funktion erweitert, welche die Umgebung for jedem Neuen Prozess zurücksetzt:
$global:oAllEnv = Get-ChildItem Env:
function CleanupEnv
{
$oCurrentEnv = Get-ChildItem Env:
foreach($oCurrent in $oCurrentEnv)
{
$bFound = $false
foreach($oAll in $oCurrentEnv)
{
if($oAll.Name -eq $oCurrent.NAME)
{
$bFound = $true
break
}
}
if($bFound)
{
[System.Environment]::SetEnvironmentVariable($oAll.Name, $oAll.Value)
}
else
{
Remove-Item ("Env:\" + $oCurrent.Name)
}
}
}
In der $global:oAllEnv werden alle Umgebungsvariablen gesichert und mit der Funktion CleanupEnv werden diese Einstellungen wieder geladen und alle anderen gelöscht.
Beispiel aus meinem build script für Openssl:
###############################################################################
# Example to build many different types of one Version
###############################################################################
$Version = "1.1.1.7"# 1.1.1g
$VisualStudios = @("2015","2017", "2019") #
$Architectures = @("x64", "x86")
$Static = $false
$StaticRuntime = $true
$DoPackage = $true
Set-Content "Build.log" ""
$global:oAllEnv = Get-ChildItem Env:
function CleanupEnv
{
$oCurrentEnv = Get-ChildItem Env:
foreach($oCurrent in $oCurrentEnv)
{
$bFound = $false
foreach($oAll in $oCurrentEnv)
{
if($oAll.Name -eq $oCurrent.NAME)
{
$bFound = $true
break
}
}
if($bFound)
{
[System.Environment]::SetEnvironmentVariable($oAll.Name, $oAll.Value)
}
else
{
Remove-Item ("Env:\" + $oCurrent.Name)
}
}
}
function VerifyLastExit()
{
if($LASTEXITCODE -eq 0)
{
Add-Content "Build.log" "Succeeded"
}
else
{
Add-Content "Build.log" "Failed"
throw "Build failed"
}
CleanupEnv
}
foreach($VisualStudio in $VisualStudios)
{
foreach($Architecture in $Architectures)
{
.\Make.ps1 -VisualStudio $VisualStudio -Version $Version -Architecture $Architecture -Static $true -StaticRuntime $StaticRuntime -DoPackage $DoPackage -DebugBuild $false
VerifyLastExit
.\Make.ps1 -VisualStudio $VisualStudio -Version $Version -Architecture $Architecture -Static $true -StaticRuntime $StaticRuntime -DoPackage $DoPackage -DebugBuild $true
VerifyLastExit
.\Make.ps1 -VisualStudio $VisualStudio -Version $Version -Architecture $Architecture -Static $false -StaticRuntime $StaticRuntime -DoPackage $DoPackage -DebugBuild $false
VerifyLastExit
.\Make.ps1 -VisualStudio $VisualStudio -Version $Version -Architecture $Architecture -Static $false -StaticRuntime $StaticRuntime -DoPackage $DoPackage -DebugBuild $true
VerifyLastExit
}
}