Powershell: передача строки JSON в локон

Я пытаюсь передать строку JSON из скрипта powershell в API build.phonegap.com, используя curl.
Согласно форуму phonegap, при работе на компьютере с Windows данные JSON должны быть отформатированы следующим образом:

curl.exe -ku user@email:mypass -X PUT -d "data={\"password\":"\keypass\"}" https://build.phonegap.com/api/v1/key


Действительно, это работает нормально, когда вызывается из командной строки.
Однако, когда я пытаюсь вызвать это из скрипта powershell, двойные кавычки, похоже, удаляются.

Пока что я пробовал:

  • Помещение JSON в строку в одинарных кавычках:
 curl.exe -ku user @ email: mypass -X PUT -d '"data = {\" password \ ": \" keypass \ "}"' https://build.phonegap.com/api/v1/key
  • Помещение JSON в строку в одинарных кавычках без обратной косой черты в DOS:
 curl.exe -ku user @ email: mypass -X PUT -d '"data = {" пароль ":"keypass"}"'  https://build.phonegap.com/api/v1/key
  • Помещение JSON в строку в одинарных кавычках, экранирование двойных кавычек и обратной косой черты (стиль DOS с обратной косой чертой):
    curl.exe -ku user @ email: mypass -X PUT -d '\ "data = {\\\" пароль \\\":\\\"keypass\\\"}\"'  https://build.phonegap.com/api/v1/key
  • Помещение JSON в строку в двойных кавычках, экранирование в двойных кавычках с обратным тиковым символом powershell `:
 curl.exe -ku user @ email: mypass -X PUT -d "` "data = {\` "пароль \`":\`"build*2014`\`"}`""  https://build.phonegap.com/ API / v1 / ключ



Есть идеи как этого добиться?

Спасибо за ваше время, Коен

5 ответов

Решение

Попробуйте использовать --% оператор для перевода PowerShell в простой (немой) режим анализа аргументов:

curl.exe --% -ku user@email:mypass -X PUT -d "data={\"password\":"\keypass\"}" https://build.phonegap.com/api/v1/key

Это довольно часто полезно для вызова exe-файлов с синтаксисом аргументов, который противоречит синтаксису аргументов PowerShell. Для этого требуется PowerShell V3 или выше.

  • Управляющий символ PowerShell - `(обратная кавычка), поэтому для вставки символов в "..."(двойные кавычки, интерполяция ) строка, используйте `" (или же "") скорее, чем \"

  • Начиная с PowerShell 7.1, неожиданный дополнительный уровень защиты от встроенных "необходимы символы, используя -escaping при вызове внешних программ :

      # Note: Escaping the embedded " chars. as `" is enough for PowerShell itself,
#       but, unfortunately, not when calling *external programs*.
#       `-replace '"', '\"'` performs the necessary additional \-escaping.
$passwd = 'foo'
curl.exe -ku user@email:mypass -X PUT -d (
  "data={`"password`": `"$passwd`"}" -replace '"', '\"'
) https://build.phonegap.com/api/v1/key
  • Этого не требуется , но это связано с ошибкой версии v1, которая не была исправлена ​​из-за опасения нарушения обратной совместимости - см. Этот ответ .

  • Неавтоматического исправления в настоящее время рассматривается для V7.2 - см GitHub выпуск #14747 - и использовать его, как только они появятся, устранило бы необходимость для -replace '"', '\"' обходной путь.

  • Уходящий назад и вперед-совместимый polyfill является использование NativeМодуль «s ieфункция, которая устраняет необходимость в дополнительном экранировании и будет продолжать работать, как ожидалось, даже с исправлением отказа:
    ie curl.exe ... -d "data={`"password`": `"$passwd`"}" ... )

  • Используя , то стоп-разбора символ , как в ответ Кейта Хилла является неоптимальным обходной путь , который также не требует дополнительной \-эскейп, однако :

    • имеет присущие ограничения - см. выпуск документации GitHub № 6149 - и практически бесполезен на Unix-подобных платформах - см. выпуск документации GitHub № 4963.
    • Единственный - неудобный и вызывающий побочные эффекты - способ встроить значения переменных PowerShell в следующие аргументы. --%заключается в том, чтобы (а) определить их как переменные среды (например, $env:passwd = 'foo') и (b) для ссылки на эти переменные cmd.exe-стилем , даже в Unix (например, %passwd%).

Наконец нашел решение. Вместо использования одного"используйте 3 из них ("""), вот и все. Так было бы:

      data={"""password""":"""keypass"""}

Вот как мне удалось отправить запрос json в PowerShell 7.2

Установите тип контента:

curl -H "Content-Type: application/json" -d '{"password":"keypass"}' https://build.phonegap.com/api/v1/key
Другие вопросы по тегам