You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 18:01:17