PowerShell может запускать сценарий оболочки cmd.exe
(командный файл), но он (естественно) должен выполнять его, используя cmd.exe
.Проблема заключается в том, что когда закрывается исполняемый файл cmd.exe
, установленные им переменные среды не распространяются на вызывающий сеанс PowerShell.
Обходной путь заключается в «захвате» переменных среды, установленных в сеансе cmd.exe
и вручную распространять их в PowerShell после завершения пакетного файла.Следующая Invoke-CmdScript
функция PowerShell может сделать это за вас:
# Invokes a Cmd.exe shell script and updates the environment.
function Invoke-CmdScript {
param(
[String] $scriptName
)
$cmdLine = """$scriptName"" $args & set"
& $Env:SystemRoot\system32\cmd.exe /c $cmdLine |
Select-String '^([^=]*)=(.*)$' |
ForEach-Object {
$varName = $_.Matches[0].Groups[1].Value
$varValue = $_.Matches[0].Groups[2].Value
Set-Item Env:$varName $varValue
}
}