Я работаю над некоторыми функциями, чтобы установить переменные среды для Visual Studio в PowerShell, и пошел по пути выполнения пакетного файла vcvarsXXX.bat, а затем проанализировал выходные данные set и посмотрел имя = значение, затем использовал Set -Установите эти переменные окружения на стороне PS.
Функция, которая делает это, выглядит следующим образом:
# from Bruce Payette's book to set the environment variables, slightly modified
function Get-Batchfile ($file) {
$cmd = "`"$file`" & set"
cmd /c $cmd | Foreach-Object {
# variation from Payette's book, use a regex in case the batch file writes some output, only take name=value
if ($_ -match "^(.*?)=(.*)$") {
# make sure they look good
write-host $matches[1] "=" $matches[2]
$name=$matches[1]
$value=$matches[2]
write-host ">>> $name = $value"
Set-Item -path env:$name -value $value
# for some reason the set item below does not seem to work even though the values of $matches look good
#Set-Item -path env:$matches[1] -value $matches[2]
}
}
}
Проблема, которую я заметил, заключается в том, что после совпадения с регулярным выражением, если я вызову:
Set-Item -path env: $ совпадений [1] -значение $ совпадений [2]
но если я назначу $ match $ name и $ value, а затем вызову:
Set-Item -path env: $ name -value $ value
Работает как положено.
Я «обошел» это, но мне хотелось бы понять, почему первый из них не работает. Я бы предпочел сделать код более компактным и не создавать две временные переменные.