Powershell:将json字符串传递给curl

46scxncf  于 2022-11-13  发布在  Shell
关注(0)|答案(5)|浏览(246)

我尝试使用curl将一个JSON字符串从powershell脚本传递到build.phonegap.com api。
根据phonegap's forum,当在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={"password":"keypass"}"'  https://build.phonegap.com/api/v1/key
  • 将JSON放在单引号字符串中,转义双引号和反斜杠(带反斜杠的DOS样式):
curl.exe -ku user@email:mypass -X PUT -d '\"data={\\\"password\\\":\\\"keypass\\\"}\"'  https://build.phonegap.com/api/v1/key
  • 将JSON放在一个双引号字符串中,用powershell反勾号字符(```)转义双引号:
curl.exe -ku user@email:mypass -X PUT -d "`"data={\`"password\`":\`"build*2014`\`"}`""  https://build.phonegap.com/api/v1/key

你知道怎么做吗?
谢谢你的时间Koen

wpx232ag

wpx232ag1#

尝试使用--%运算符将PowerShell置于简单(哑)参数解析模式:

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

这在调用参数语法与PowerShell参数语法冲突的exes时非常有用。这需要PowerShell V3或更高版本。

brqmpdu1

brqmpdu12#

**tl;**医生:

最低为PowerShell 7.2.x,manual\-不幸的是,需要对PowerShell字符串中的"字符进行转义。

# From inside PowerShell:
# Note the outer '...' quoting and the unexpected need to escape
# the embedded " chars. as \" (unexpected, because PowerShell itself doesn't
# require " inside '...' to be escaped; also, PowerShell's escape char. is `).
# If outer "..." quoting must be used, use \`" (sic) to escape the embeded "
curl.exe -ku user@email:mypass -X PUT -d 'data={\"password\":\"keypass\"}' https://build.phonegap.com/api/v1/key

请继续阅读,了解为什么这是必要的,以及未来可能的解决方案。

*PowerShell的转义字符是```(即所谓的 * 反勾号 ),因此,为了在"..."(双引号、 内插 *)字符串中 * 嵌入 * "字符,**请使用``"**(或"")而不是";相比之下,在'...'(单引号,* 逐字 *)字符串中,"` * 不 * 需要转义。

  • 在您的尝试中,PowerShell没有将\"视为 * 转义 * ",因此看到了 * 多个 * "..."字符串,最终-当PowerShell必要时在后台应用其 * 按需重新引用 * 时,传递了 * 两个 * 单独的字符串参数,由于不包含空格,这些参数不需要单独使用双引号,即:逐字记录data={\password\:\keypass\}
    *使用PowerShell's quoting rules时,您应该使用
  • 或者:
  • "data={"password":"keypass"}"
  • 或者,更简单地说,假设不需要字符串插值,则通过一个 verbatimsingle-引号括起来的字符串,其中" chars. don 't required escaping:
  • 'data={"password":"keypass"}'
    然而,遗憾的是,从PowerShell 7.2.x开始,这还不够,尽管 * 实验性的 * PSNativeCommandArgumentPassing功能(自PowerShell Core 7.2.0-preview.5起可用)至少可以为 * 某些 * 外部程序(包括curl.exe)修复此问题;请继续阅读以了解详细信息。
    自PowerShell 7.2.x起,需要嵌入式"字符的意外 * 额外 * 转义层,调用(大多数)外部程序时使用\-escaping
  • Windows PowerShell 中,存在这种方法不起作用的 * 边缘情况 *,在这种情况下,需要使用--%(请参阅下文)。值得注意的是,将'"foo bar"'转义为'\"foo bar\"'不起作用,因为封闭的\"位于字符串的开头和结尾-请参阅this answer了解详细信息。
  • 此外,Windows上的一些外部程序只理解""-转义(例如msiexec);对于它们,使用-replace '"', '""'以便以编程方式执行额外的转义,假设值至少包含一个空格。对于根本不支持嵌入式"字符的程序(WSH),执行相同的操作,以便嵌入式"至少不打破参数边界(但它们将被剥离)。
  • 对于需要\"-转义的程序,请使用以下-replace操作以编程方式可靠地执行额外的转义**:
    *'...' -replace '([\\]*)"', '$1$1\"'
  • 如果输入字符串不包含预先存在的逐字\"序列,则可以简化为'...' -replace '"', '\"'
# Note: Escaping the embedded " chars. as `" is enough for PowerShell itself,
#       but, unfortunately, not when calling *external programs*.
#       The `-replace` operation performs the necessary additional \-escaping.
$passwd = 'foo'
curl.exe -ku user@email:mypass -X PUT -d (
  "data={`"password`": `"$passwd`"}" -replace '([\\]*)"', '$1$1\"'
) https://build.phonegap.com/api/v1/key

*这不应该是必需的,但这是由于自v1以来的一个 * 错误 *,由于担心破坏向后兼容性而尚未修复-请参阅this answer
*一个-大概- * 选择加入 * 修复现在正在考虑 * 一些 * 未来版本,post v7.2-请参见GitHub issue #14747-一旦可用,使用它将消除手动转义的需要。

  • 由于PowerShell Core 7.2.0-preview.5,**experimental featurePSNativeCommandArgumentPassing已尝试修复,但不幸的是,它似乎缺乏对Windows上的高配置文件CLI的重要适应(尽管curl.exe不会受到影响)-请参阅GitHub问题#15143的此摘要。
    向后和向前兼容的Helper函数是来自Native moduleInstall-Module Native)的
    ie函数
    *,它消除了对额外转义的需要,包含对Windows上的高配置文件CLI的重要调整,* 并且 * 即使有选择性加入修复程序,也将继续按预期工作:

一个月四个月一个月)

  • 使用**--%stop-parsing symbol(如Keith Hill's answer)是一种 * 次优解决方案***,也不需要额外的\-转义,* 但是 *:
  • --%具有固有的局限性(请参见GitHub docs issue #6149),并且在类Unix平台上几乎无用(请参见GitHub docs issue #4963)。
  • --%后面的参数中嵌入PowerShell * 变量值 * 的唯一-笨拙且产生副作用的-方法是(a)将它们定义为 * 环境 * 变量(例如$env:passwd = 'foo'),以及(b)引用这些变量 * cmd.exe-style*,即使在Unix上也是如此(例如%passwd%)。
    一种 * 替代 * 解决方法-特别是如果您需要 * 在调用中 * 包括PowerShell变量或表达式的值-是通过cmd /c调用,其中包含 * 整个命令行的单个参数;为了方便引用,以下示例使用了 here-string(有关PowerShell字符串文字的概述,请参见this answer的底部部分):
# Use @"<newline>...<newline>"@ if you need to embed PowerShell variables / expressions.
cmd /c @'
curl.exe -ku user@email:mypass -X PUT -d "data={\"password\":"\keypass\"}" https://build.phonegap.com/api/v1/key
'@
ibrsph3r

ibrsph3r3#

下面是我在PowerShell 7.2

中发送json请求的方法

g6ll5ycj

g6ll5ycj4#

最后找到了解决方案。我不使用一个",而是使用其中的三个("""),就这样。所以它将是:

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

2wnc66cl5#

设置内容类型:

curl -H "Content-Type: application/json" -d '{"password":"keypass"}' https://build.phonegap.com/api/v1/key

相关问题