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

问题描述 投票:0回答:1

我有一个像这样的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?

batch-file curl cmd pipe windows-scripting
1个回答
1
投票

我建议使用:

@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 处理每个命令行。

另请参阅:Windows 命令解释器 (CMD.EXE) 如何解析脚本?

竖线必须使用脱字符号进行转义,以解释为文字字符而不是管道重定向运算符。

然后启用延迟扩展,并通过在环境变量名称周围使用

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!\"}"

要了解所使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完整、仔细地阅读每个命令显示的帮助页面。

  • echo /?
  • endlocal /?
  • set /?
  • setlocal /?
  • curl -h
    curl --help
© www.soinside.com 2019 - 2024. All rights reserved.