Powershell curl.exe:POST请求收到“400 Bad Request”错误,错误信息为“在JSON中的位置上出现意外的令牌...”
Powershell curl.exe:POST请求收到“400 Bad Request”错误,错误信息为“在JSON中的位置上出现意外的令牌...”
我正在尝试从PowerShell脚本中将JSON字符串传递给build.phonegap.com API,使用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={"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
问题出现的原因是在Windows PowerShell和PowerShell (Core) up to v7.2.x中,必须手动对传递给外部程序的参数中的双引号字符进行转义。在尝试中,PowerShell没有将\"视为转义的双引号,因此将字符串解析为多个"..."字符串,从而导致传递两个单独的字符串参数。解决方法是根据PowerShell的引用规则使用正确的引号和转义字符,或者在调用外部程序时使用-replace操作来进行额外的转义。
在PowerShell 7.3.0中,问题大部分得到了修复,但在Windows上仍有一些例外情况。在调用大多数外部程序时,仍然需要使用额外的转义方法。
这些解决方法虽然可行,但并不是理想的解决方案。为了更方便地运行命令,并在参数中包含PowerShell变量或表达式的值,可以使用Native模块中的ie函数。此函数可以避免额外的转义,并且对Windows上的高级CLI进行了调整。
另外,还可以使用cmd /c作为替代解决方法,在一个参数中包含整个命令行,并使用here-string来提供引号方便性。
总之,尽管这些解决方法并不完美,但它们是目前可用的最佳解决方案。不喜欢这种情况的现实并不是这个答案的短板,而是PowerShell在这个领域的不足之处。