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

How to escape pipe in curl in a batch script?

我有一个这样的 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 ,但没有任何效果。

有没有办法将正确的负载传递给 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 window,在其中执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。

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