62 lines
1.5 KiB
PowerShell
62 lines
1.5 KiB
PowerShell
##############################################################################
|
|
##
|
|
## Invoke-CmdScript
|
|
##
|
|
## From PowerShell Cookbook (O'Reilly)
|
|
## by Lee Holmes (http://www.leeholmes.com/guide)
|
|
## <https://powershellcookbook.com/recipe/WqHr/program-retain-changes-to-environment-variables-set-by-a-batch-file>
|
|
##
|
|
##############################################################################
|
|
|
|
<#
|
|
|
|
.SYNOPSIS
|
|
|
|
Invoke the specified batch file (and parameters), but also propagate any
|
|
environment variable changes back to the PowerShell environment that
|
|
called it.
|
|
|
|
.EXAMPLE
|
|
|
|
PS > type foo-that-sets-the-FOO-env-variable.cmd
|
|
@set FOO=%*
|
|
echo FOO set to %FOO%.
|
|
|
|
PS > $env:FOO
|
|
PS > Invoke-CmdScript "foo-that-sets-the-FOO-env-variable.cmd" Test
|
|
|
|
C:\Temp>echo FOO set to Test.
|
|
FOO set to Test.
|
|
|
|
PS > $env:FOO
|
|
Test
|
|
|
|
#>
|
|
|
|
param(
|
|
## The path to the script to run
|
|
[Parameter(Mandatory = $true)]
|
|
[string] $Path,
|
|
|
|
## The arguments to the script
|
|
[string] $ArgumentList
|
|
)
|
|
|
|
Set-StrictMode -Version 3
|
|
|
|
$tempFile = [IO.Path]::GetTempFileName()
|
|
|
|
## Store the output of cmd.exe. We also ask cmd.exe to output
|
|
## the environment table after the batch file completes
|
|
cmd /c " `"$Path`" $argumentList && set > `"$tempFile`" "
|
|
|
|
## Go through the environment variables in the temp file.
|
|
## For each of them, set the variable in our local environment.
|
|
Get-Content $tempFile | Foreach-Object {
|
|
if($_ -match "^(.*?)=(.*)$")
|
|
{
|
|
Set-Content "env:\$($matches[1])" $matches[2]
|
|
}
|
|
}
|
|
|
|
Remove-Item $tempFile |