Странность PowerShell Set-Item при использовании значений из массива $ match - PullRequest
2 голосов
/ 16 июля 2011

Я работаю над некоторыми функциями, чтобы установить переменные среды для 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

Работает как положено.

Я «обошел» это, но мне хотелось бы понять, почему первый из них не работает. Я бы предпочел сделать код более компактным и не создавать две временные переменные.

1 Ответ

3 голосов
/ 16 июля 2011

Я полагаю, что это такая же ситуация, как если бы вы использовали эти хеш-таблицы в строке.Если это свойство объекта, вы должны использовать подвыражение - $ ($ variable.property).Если вы присваиваете переменную $ variable.property, вы можете использовать эту переменную без использования подвыражения.Он работает одинаково для записей хеш-таблиц и фрагментов массива.

Проверьте, не работает ли это лучше:

Set-Item -path env:$($matches[1]) -value $($matches[2])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...