PowerShell Выполнение функции в блоке скрипта с помощью Start-Process делает странные вещи с двойными кавычками

У меня есть сценарий PowerShell, который редактирует реестр, поэтому он должен запускаться от имени администратора. Для этого я запускаю новый процесс PowerShell из моего запущенного сценария PowerShell и передаю часть пути к ключу реестра, используя блок сценариев с функцией в нем. Когда я использую двойные кавычки в этой функции, PowerShell пытается интерпретировать их как команды, а не как строку. Если я использую одинарные кавычки, то все работает нормально.

Я создал небольшой урезанный пример сценария powershell, который воспроизводит проблему. Вот фрагмент:

$ScriptBlock = {
    function Test
    {
        $status = "This is a string"
        Write-Output $status
    }
}
Start-Process -FilePath PowerShell -ArgumentList "-NoExit -NoProfile -ExecutionPolicy Bypass -Command & {$ScriptBlock Test}"

Таким образом, в новом процессе PowerShell он сначала определит код в блоке сценария, а затем вызовет метод Test и выдаст следующую ошибку:

This: Термин «This» не распознается как имя командлета, функции, файла сценария или работоспособной программы. Проверьте правильность написания имени или, если путь был указан, проверьте правильность пути и повторите попытку.

Поэтому он пытается обработать строку как запятую, как будто я только что набралThis is a string само по себе на новой строке в моем сценарии.

Если я изменю линию

$status = "This is a string"

в

$status = 'This is a string'

скрипт работает как положено и просто выводит строкуThis is a string.

Другая странная проблема, которую я заметил, заключается в том, что если я не использую переменную и просто использую:

Write-Output "This is a string"

затем выводит каждое слово в отдельной строке следующим образом:

это

является

a

строка

но если я использую одинарные кавычки, как это:

Write-Output 'This is a string'

затем выводит все предложение в одну строку, как и ожидалось.

Кто-нибудь знает, почему PowerShell ведет себя странно в таких ситуациях?

Ответ

Так, как упоминает TessellatingHeckler, решение заключается в том, чтобы заключить все, что в двойные кавычки, одинарные кавычки, или вы можете использовать скобки.

Так что в моем примере вы бы изменили:

$status = "This is a string"

к этому:

$status = """This is a string"""

или это:

$status = '"This is a string"'

или это:

$status = {"This is a string"}

Если вы хотите вычислить переменную в вашей строке (то есть посмотреть значение переменной), то вам нужно использовать метод двойных двойных кавычек:

$status = """This is a string that evaluates $someVariable"""

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

Ответы на вопрос(1)

Ваш ответ на вопрос