首页/系统/Windows 运维速查/call 调用子脚本/标签
CMD 常用命令74 条

call 调用子脚本/标签

在一个批处理中调用另一个批处理或本文件内的标签子程序,并支持参数传递与返回值(ERRORLEVEL)。

Windows 运维速查系统更新于 2026-10-13

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 可以写出不受工作目录影响的脚本。

易错点

  • 漏写 call:父脚本后续代码全部不再执行,日志表现为「跑到一半就结束」
  • 子程序里用 exit 而不是 exit /b:直接关掉整个 cmd 窗口,调用方一起终止
  • 在子程序里修改全局变量:返回后污染调用方环境,除非用 setlocal 隔离
  • 忘记 goto :eof 或 exit /b 收尾:流程继续往下掉进子程序代码,重复执行一遍

数据来源与参考

  • Microsoft Learn:call 命令

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌