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 кажется:
Ошибка не будет исправлена (по умолчанию), чтобы не нарушить существующий код.
- Предоставление согласия на исправление сейчас обсуждается в этой проблеме GitHub.
Для правильного исправления ошибки потребуется версия 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" }