pwsh -Команда удаляет кавычки

В pwsh вызовите следующее:

Write-Host '{"drop_attr": "name"}' 

Результат в порядке:

{"drop_attr": "name"}

Теперь сделайте то же самое через pwsh:

pwsh -Command Write-Host '{"drop_attr": "name"}'

В результате отсутствуют кавычки и квадратные скобки?

drop_attr: name

3 ответа

Решение

К сожалению, PowerShell при передаче аргументов со встроенными"символы. к внешним программам, включая собственный интерфейс командной строки PowerShell (pwsh) - фундаментально сломан (и всегда был), начиная с PowerShell 7.0:

Вам нужно вручную \-побег "экземпляры, встроенные в ваши аргументы, чтобы они правильно передавались во внешние программы:

pwsh -Command ' ''{\"drop_attr\": \"name\"}'' '

Обратите внимание: я предполагаю, что вы намерены передать строку JSON, следовательно, внутренний '' ... '' цитирование (экранированные одинарные кавычки), что гарантирует, что pwsh в конечном итоге видит строку в одинарных кавычках ('...'). (Нет необходимости в явной команде вывода; PowerShell неявно печатает вывод команды и выражения).


Обратите внимание, что из внутри PowerShell, вы можете избежать необходимости\-эскейп, если позвонишь pwshс блоком скрипта ({ ... }):

# NOTE: Works from PowerShell only.
pwsh -Command { '{"drop_attr": "name"}' }

Справочная информация о нарушенной обработке аргументов PowerShell со встроенными "в вызовах внешней программы, начиная с PowerShell 7.0:

  • Эта проблема с документами GitHub содержит справочную информацию.

  • В этом отчете об ошибке GitHub обсуждается проблема; состояние дискуссии как в PowerShell [Core] 7 кажется:

    • Ошибка не будет исправлена ​​(по умолчанию), чтобы не нарушить существующий код.

    • Для правильного исправления ошибки потребуется версия PowerShell, которая может существенно нарушить обратную совместимость; на момент написания этой статьи это никогда не было разрешено, но началось обсуждение того, разрешать ли это в будущем и как с этим справиться: см. эту проблему GitHub.

  • А пока вы можете использовать PSv3+ieвспомогательная функция из Nativeмодуль (в PSv5+ установить сInstall-Module Nativeиз PowerShell Gallery), который внутренне компенсирует все неправильное поведение и позволяет передавать аргументы, как ожидалось; например,
    ie pwsh -Command ' ''{"drop_attr": "name"}'' ' тогда будет работать правильно.

По-другому. Вы работаете в Windows или Unix?

pwsh -c "[pscustomobject]@{drop_attr='name'} | convertto-json -compress"

{"drop_attr":"name"}

Другой способ - использовать "закодированные команды".

> $cmd1 = "Write-Host '{ ""description"": ""Test program"" }'"
> pwsh -encoded ([Convert]::ToBase64String([Text.Encoding]::Unicode.GetBytes($cmd1)))
{ "description": "Test program" }
Другие вопросы по тегам