我尝试使用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
5条答案
按热度按时间wpx232ag1#
尝试使用
--%
运算符将PowerShell置于简单(哑)参数解析模式:这在调用参数语法与PowerShell参数语法冲突的exes时非常有用。这需要PowerShell V3或更高版本。
brqmpdu12#
**tl;**医生:
最低为PowerShell 7.2.x,manual
\
-不幸的是,需要对PowerShell字符串中的"
字符进行转义。请继续阅读,了解为什么这是必要的,以及未来可能的解决方案。
*PowerShell的转义字符是```(即所谓的 * 反勾号 ),因此,为了在
"..."
(双引号、 内插 *)字符串中 * 嵌入 *"
字符,**请使用``"**(或
"")而不是
";相比之下,在
'...'(单引号,* 逐字 *)字符串中,
"` * 不 * 需要转义。\"
视为 * 转义 *"
,因此看到了 * 多个 *"..."
字符串,最终-当PowerShell必要时在后台应用其 * 按需重新引用 * 时,传递了 * 两个 * 单独的字符串参数,由于不包含空格,这些参数不需要单独使用双引号,即:逐字记录data={\
和password\:\keypass\}
*使用PowerShell's quoting rules时,您应该使用:
"data={
"password":
"keypass"}"
"
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:--%
(请参阅下文)。值得注意的是,将'"foo bar"'
转义为'\"foo bar\"'
不起作用,因为封闭的\"
位于字符串的开头和结尾-请参阅this answer了解详细信息。""
-转义(例如msiexec
);对于它们,使用-replace '"', '""'
以便以编程方式执行额外的转义,假设值至少包含一个空格。对于根本不支持嵌入式"
字符的程序(WSH),执行相同的操作,以便嵌入式"
至少不打破参数边界(但它们将被剥离)。\"
-转义的程序,请使用以下-replace
操作以编程方式可靠地执行额外的转义**:*
'...' -replace '([\\]*)"', '$1$1\"'
\"
序列,则可以简化为'...' -replace '"', '\"'
*这不应该是必需的,但这是由于自v1以来的一个 * 错误 *,由于担心破坏向后兼容性而尚未修复-请参阅this answer。
*一个-大概- * 选择加入 * 修复现在正在考虑 * 一些 * 未来版本,post v7.2-请参见GitHub issue #14747-一旦可用,使用它将消除手动转义的需要。
PSNativeCommandArgumentPassing
已尝试修复,但不幸的是,它似乎缺乏对Windows上的高配置文件CLI的重要适应(尽管curl.exe
不会受到影响)-请参阅GitHub问题#15143的此摘要。向后和向前兼容的Helper函数是来自
Native
module(Install-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的底部部分):ibrsph3r3#
下面是我在PowerShell 7.2
中发送json请求的方法
g6ll5ycj4#
最后找到了解决方案。我不使用一个
"
,而是使用其中的三个("""
),就这样。所以它将是:2wnc66cl5#
设置内容类型: