如何在批处理脚本中转义 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 命令处理器双重处理所有命令行。在这种情况下,环境变量 fruit1
和 fruit2
也可以通过使用第五个命令行来使用延迟扩展来引用:
set "payload={\"name\":\"value\",\"name\":\"!fruit1!^|!fruit2!\"}"
为了了解使用的命令及其工作原理,请打开 command prompt window,在其中执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。
echo /?
endlocal /?
set /?
setlocal /?
curl -h
或 curl --help
我有一个这样的 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 命令处理器双重处理所有命令行。在这种情况下,环境变量 fruit1
和 fruit2
也可以通过使用第五个命令行来使用延迟扩展来引用:
set "payload={\"name\":\"value\",\"name\":\"!fruit1!^|!fruit2!\"}"
为了了解使用的命令及其工作原理,请打开 command prompt window,在其中执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。
echo /?
endlocal /?
set /?
setlocal /?
curl -h
或curl --help