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
Модуль «sie
функция, которая устраняет необходимость в дополнительном экранировании и будет продолжать работать, как ожидалось, даже с исправлением отказа:
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"""}
Установите тип контента:
curl -H "Content-Type: application/json" -d '{"password":"keypass"}' https://build.phonegap.com/api/v1/key