微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在批处理脚本中在 curl 中转义管道?

如何解决如何在批处理脚本中在 curl 中转义管道?

我有一个像这样的 Windows 批处理脚本:

@echo off
setlocal EnableDelayedExpansion
SET fruit1=apple
SET fruit2=banana
SET "payload={\"name\":\"value\",\"name\":\"%fruit1%^|%fruit2%\"}"
echo %payload%
curl -X POST -H "Content-Type: application/json" -d "%payload%" "<serverURL>"
endlocal

输出为:

{\"name\":\"value\",\"name\":\"apple|banana\"}
Cannot find the specified path

所以 Curl 没有做任何事情,我猜该错误消息是由于管道引起的,而回显的有效负载显示正确。

如您所见,我已经尝试使用 ^ 转义管道,并设置 EnableDelayedExpansion ,但没有任何效果

有没有办法将正确的payload传递给curl?

解决方法

我建议使用:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "fruit1=apple"
set "fruit2=banana"
set "payload={\"name\":\"value\",\"name\":\"%fruit1%^|%fruit2%\"}"
setlocal EnableDelayedExpansion
echo !payload!
curl.exe -X POST -H "Content-Type: application/json" -d "!payload!" "<serverURL>"
endlocal
endlocal

在禁用延迟环境变量扩展时定义了环境变量,这导致 Windows 命令处理器在开始时使用 SET 命令处理每个命令行。

另见:How does the Windows Command Interpreter (CMD.EXE) parse scripts?

竖线必须用插入符转义,才能被解释为文字字符而不是管道重定向操作符。

然后启用延迟扩展,并通过在环境变量名称周围使用 payload 而不是 ! 来引用分配给环境变量 % 的字符串值。

在这种特殊情况下也可以使用:

@echo off
setlocal EnableExtensions EnableDelayedExpansion
set "fruit1=apple"
set "fruit2=banana"
set "payload={\"name\":\"value\",\"name\":\"%fruit1%^|%fruit2%\"}"
echo !payload!
curl.exe -X POST -H "Content-Type: application/json" -d "!payload!" "<serverURL>"
endlocal

定义三个环境变量的三行不包含感叹号,也没有其他字符串从批处理文件之外的某处获取。因此,可以使用第二个命令行启用延迟环境变量扩展,并让 Windows 命令处理器双重处理所有命令行。环境变量 fruit1fruit2 在这种情况下也可以通过使用作为第五个命令行的延迟扩展来引用:

set "payload={\"name\":\"value\",\"name\":\"!fruit1!^|!fruit2!\"}"

要了解使用的命令及其工作原理,请打开 command prompt 窗口,在那里执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。

  • echo /?
  • endlocal /?
  • set /?
  • setlocal /?
  • curl -hcurl --help

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。