如何在Windows批处理脚本的curl命令中正确转义竖线|字符
问题原因
你遇到的报错确实是payload中的竖线导致的:赋值阶段的^转义仅能保证变量被正确写入,当你用%payload%展开变量时,cmd会对展开后的内容做二次解析,竖线会被识别为管道符截断curl命令,因此才会出现路径找不到的报错。echo看起来输出正常是因为echo命令会把本行管道符后的所有内容默认为输出内容,不做命令解析,因此没有暴露问题。
你已经开启了延迟扩展,但没有使用延迟扩展的变量引用语法,因此特殊字符转义没有生效。
解决方案
方案1:使用延迟扩展引用变量(推荐,无临时文件)
开启延迟扩展后,使用!变量名!语法引用变量时,cmd不会对变量内部的特殊字符做二次解析,直接透传给调用的命令,修改后代码如下:
@echo off setlocal EnableDelayedExpansion SET fruit1=apple SET fruit2=banana SET "payload={\"name\":\"value\",\"name\":\"%fruit1%^|%fruit2%\"}" :: 用延迟扩展语法输出 echo !payload! :: 调用curl时同样用!引用payload,避免特殊字符被解析 curl -X POST -H "Content-Type: application/json" -d "!payload!" "<serverURL>" endlocal
方案2:写入临时文件传递payload(适合复杂payload场景)
如果payload包含大量特殊字符,还可以把payload写入临时json文件,curl直接读取文件内容作为请求体,完全规避命令行特殊字符解析问题:
@echo off setlocal EnableDelayedExpansion SET fruit1=apple SET fruit2=banana SET "payload={\"name\":\"value\",\"name\":\"%fruit1%|%fruit2%\"}" :: 写入临时文件 echo !payload! > temp_payload.json :: curl用@前缀读取文件内容作为请求体 curl -X POST -H "Content-Type: application/json" -d "@temp_payload.json" "<serverURL>" :: 清理临时文件 del /q temp_payload.json endlocal
内容的提问来源于stack exchange,提问作者glass
相关产品推荐
相关产品推荐

