Public/Mock-EnvironmentVariable.ps1
function Restore { param ( [string] $Variable, [EnvironmentVariableTarget[]] $Targets, [hashtable] $Backup ) foreach ($target in $targets) { [Environment]::SetEnvironmentVariable($Variable, $Backup[$target], $target) } } function Set-Values { param ( [string] $Variable, [EnvironmentVariableTarget[]] $Targets, [string] $value ) $Backup = @{} foreach ($target in $Targets) { $OriginalValue = [Environment]::GetEnvironmentVariable($Variable, $target) $Backup.Add($target, $OriginalValue) if ($Value) { [Environment]::SetEnvironmentVariable($Variable, $Value, $target) } } return $Backup } function Mock-EnvironmentVariable { param ( [parameter(Mandatory = $true)] [string] $Variable, [Parameter(Mandatory = $true)] [ScriptBlock] $Fixture, [Parameter(Mandatory = $false)] [string] $Value, [Parameter(Mandatory = $false)] [EnvironmentVariableTarget[]] $Targets = @([EnvironmentVariableTarget]::Process) ) $Backup = Set-Values -Variable $Variable -Targets $Targets -value $Value try { Invoke-Command -ScriptBlock $Fixture } catch { throw $_ } finally { Restore -Variable $Variable -Targets $Targets -Backup $Backup } <# .PARAMETER Variable The environment variable to mock. .PARAMETER Value The initial value of the mocked environment variable. .PARAMETER Fixture The code to be executed. .PARAMETER Targets Specifies that user environment variable should also be managed. #> } |