Windows命令行调用jq-win32.exe时INDEX字符串过滤器处理失败原因
问题原因
Windows命令提示符(CMD)默认使用双引号作为参数的边界标识符,你在jq过滤器内部直接使用的"?sv="双引号会被CMD识别为参数结束标记,导致传给jq的过滤器内容被截断、语法错误,这就是本地执行失败的核心原因,和jq本身的逻辑无关。
解决方案
方案1:修改命令行转义规则
将过滤器内部所有的双引号用\"转义,修改后的命令如下:
c:\EJPK\exe>type "c:\TEMP\jpk1012\out\JPK_VAT.xml.sig.resp"| d:\curl\send\bin\jq-win32.exe -r "{ReferenceNumber:.ReferenceNumber} + {URI:(.RequestToUploadFileList[0].Url)} + {URI_ABS:.RequestToUploadFileList[0].Url[0:.RequestToUploadFileList[0].Url|index(\"?sv=\")] } +{URI_SAS:.RequestToUploadFileList[0].Url[.RequestToUploadFileList[0].Url|index(\"?sv=\"):] } + {FILE:.RequestToUploadFileList[0].FileName} + {Key:.RequestToUploadFileList[0].HeaderList[0].Value}"
方案2:使用过滤器文件(更稳定,无转义问题)
该方案完全避开命令行转义规则限制,出错概率更低:
- 将你验证通过的过滤器内容保存为纯文本文件,命名为
filter.jq,内容可简化为如下形式(无需重复用+拼接对象,逻辑和原语句完全等价):
{ ReferenceNumber: .ReferenceNumber, URI: .RequestToUploadFileList[0].Url, URI_ABS: .RequestToUploadFileList[0].Url[0:.RequestToUploadFileList[0].Url|index("?sv=")], URI_SAS: .RequestToUploadFileList[0].Url[.RequestToUploadFileList[0].Url|index("?sv="):], FILE: .RequestToUploadFileList[0].FileName, Key: .RequestToUploadFileList[0].HeaderList[0].Value }
- 执行命令时通过
-f参数指定过滤器文件即可:
c:\EJPK\exe>type "c:\TEMP\jpk1012\out\JPK_VAT.xml.sig.resp"| d:\curl\send\bin\jq-win32.exe -r -f filter.jq
内容的提问来源于stack exchange,提问作者kapelatp
相关产品推荐
相关产品推荐

