如何解决如何在批处理脚本中在 curl 中转义管道?
@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 命令处理器双重处理所有命令行。环境变量 fruit1
和 fruit2
在这种情况下也可以通过使用作为第五个命令行的延迟扩展来引用:
set "payload={\"name\":\"value\",\"name\":\"!fruit1!^|!fruit2!\"}"
要了解使用的命令及其工作原理,请打开 command prompt 窗口,在那里执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。
echo /?
endlocal /?
set /?
setlocal /?
-
curl -h
或curl --help
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。