call 是什么
call 用于在一个批处理里调用另一个批处理文件,或者调用同一个文件内部的标签子程序,支持传参并通过 ERRORLEVEL 取得返回值。它是批处理实现模块化的基础:如果不写 call 直接写出另一个 bat 的路径,控制权会整体交出去,父脚本后面的代码一行都不会再执行。
基本信息
| 适用平台 | Windows CMD / 批处理脚本 |
|---|---|
| 调用外部 | call 脚本.bat [参数] |
| 调用内部 | call :标签 [参数] |
| 返回 | 子程序末尾 exit /b 返回码 |
| 取参数 | 子程序内用 %1 %2 读取位置参数 |
典型使用场景
- 把日志、环境检查、清理这类公共逻辑抽成一个 bat 供多个脚本复用
- 在同一个文件里用标签组织子程序,避免维护一堆小文件
- 向子脚本传递环境名、路径等参数,让同一段逻辑适配多环境
- 用 ERRORLEVEL 返回执行结果,让调用方决定是否继续
- 在循环里逐个 call 处理一批机器名或文件
- 让脚本能在不同工作目录下正确调用同目录的兄弟脚本
常用示例
常用示例
call D:\scripts\check_env.bat prod REM 调用外部脚本并传参
if errorlevel 1 echo 环境检查失败 REM 非零即视为失败
call :say_hello 世界 REM 调用本文件内的子程序
goto :eof REM 主流程到此结束,别掉进子程序
:say_hello
echo 你好 %1
set RESULT=ok
exit /b 0 REM 返回 0 表示成功
REM 子脚本里也能用 %~dp0 拿到自身所在目录调用方式对照
| 写法 | 行为 | 常见误用 |
|---|---|---|
| call 别的.bat | 执行完能返回,父脚本继续 | 漏写 call 导致父脚本断尾 |
| call :标签 | 跳到文件内标签,exit /b 返回 | 用 goto 代替 call,回不来 |
| exit /b 码 | 结束子程序并带回返回码 | 写成 exit 会关掉整个 cmd |
| %1 位置参数 | 调用时传入的参数 | 含空格未加引号会丢参 |
子脚本不写 call 时,CMD 会把控制权永久交给它,父脚本那一行之后的内容再也不会执行,这就是「bat 调用 bat 后没下文」最常见的原因。
参数含空格要用引号包起来,需要剥掉外层引号用 %~1;%~dp0 是当前脚本所在目录,配合 call 可以写出不受工作目录影响的脚本。