Windows批处理CALL命令能否传递未处理的参数?
解决批处理参数传递中%字符丢失的问题
要让b.bat获取到和a.bat完全一致的参数,保留原始的转义%字符,核心是避免call命令对参数的二次解析,以下是两种可行方法:
方法一:利用延迟扩展转义%字符
修改a.bat,通过延迟扩展将参数中的每个%替换为%%,再传递给b.bat:
@echo off setlocal enabledelayedexpansion set "args=%*" :: 将参数中的%替换为%%,避免call时被二次解析 set "args=!args:%%=%%%%!" echo in a: %* call b !args! endlocal
测试调用及输出:
c:\>a 1 2 3 %% %%%% in a: 1 2 3 %% %%%% in b: 1 2 3 %% %%%%
方法二:捕获原始命令行参数
通过cmdcmdline变量获取完整的命令行内容,提取除脚本名外的原始参数再传递,这种方法能适配包含特殊字符的场景:
@echo off setlocal enabledelayedexpansion :: 获取完整命令行内容 set "fullCmd=!cmdcmdline!" :: 提取当前脚本名后的参数部分 set "rawArgs=!fullCmd:*%~nx0 =!" :: 去除可能存在的首尾引号(如果命令行里脚本名带引号) if "!rawArgs:~0,1!"=="\" set "rawArgs=!rawArgs:~1,-1!" echo in a: %* call b !rawArgs! endlocal
问题原因说明
原始写法中,call b %*会触发批处理的二次解析:%*在a.bat中被展开为原始参数,当call执行时,会再次解析参数里的%,导致%%被解析为单个%,%%%%被解析为两个%,最终b.bat拿到的参数被修改。
内容的提问来源于stack exchange,提问作者MickeyRandall4
相关产品推荐
相关产品推荐

