首页/系统/Windows 运维速查/goto 跳转与标签
CMD 常用命令74 条

goto 跳转与标签

用标签做流程跳转与错误处理:脚本末尾统一失败分支、循环重试、goto :eof 提前结束。

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

goto 是干什么的

goto 让批处理跳到指定标签继续执行,是 CMD 里唯一的流程控制手段。它常被用来做“成功走到末尾、失败跳到统一错误分支”的结构,配合 :eof 内置标签还能提前结束脚本或子过程。相比 if 的嵌套,goto 写错误处理更直观,但也更容易因为标签命名混乱而写出难维护的脚本。

基本信息

适用平台Windows CMD 批处理
语法goto :标签;定义标签用 :标签;goto :eof 结束当前脚本或子过程
命令扩展默认启用(cmd /e:on),Windows 上均为启用状态
常用搭配if %ERRORLEVEL% GEQ n goto fail;call 与 exit /b 组合

典型使用场景

  • 统一错误处理:脚本末尾放一个 :fail 分支,集中记录日志与退出码
  • 循环结构:用标签加 if 模拟 while 循环
  • 提前返回:条件满足时用 goto :eof 直接结束
  • 子过程调用:call :sub 执行后返回,便于脚本模块化
  • 兼容老逻辑:维护遗留脚本时必须理解 goto 的跳转关系

常用示例

常用示例
@echo off
setlocal
:: 备份并在失败时跳到错误分支
robocopy D:\Src D:\Dst /E
if %ERRORLEVEL% GEQ 8 goto fail
echo 备份成功
goto :eof
:: 错误处理分支
:fail
echo [%date% %time%] 备份失败,错误码 %ERRORLEVEL% >> D:\backup.log
exit /b 1
:: 子过程写法
:sub
 echo 在子过程中执行
goto :eof

退出码与错误处理

项目含义注意点
%ERRORLEVEL%上一条命令的退出码部分命令不设置,需实测确认
robocopy 特殊0-7 视为成功,8 及以上才是失败用 GEQ 8 判断,不要写成 != 0
exit /b n从脚本或子过程返回不带参数则返回 0
goto :eof结束当前脚本/子过程无需预先定义标签
goto :eof 是内置终点标签,不需要自己定义。它的经典用途是在 call 调用的子过程末尾返回,也在菜单式脚本里充当“结束并退出”的收尾动作。
标签定义时要写成 :fail(带冒号),跳转时写 goto fail(不带冒号)。漏写或写反都会得到“找不到指定的批标签”或直接跳到错误位置,这是新手最常遇到的批处理报错。
两个 bat 文件里有同名标签时,call 进入的子脚本执行 goto 可能跳到调用方的同名标签上,导致难以复现的诡异流程。跨文件复用时给标签加前缀,例如 :svc_start 而不是 :start。

易错点

  • 标签冒号写错:报“找不到批标签”,而报错行号往往指向 goto 而不是标签定义处
  • 多文件同名标签互相干扰:子脚本跳到调用方标签,流程静默走错且难以复现
  • 忘记判断 robocopy 的退出码语义:0-7 是成功,写成 -ne 0 会把正常情况判为失败
  • goto 形成死循环:标签之间互相跳而没有可终止条件,脚本挂死
  • 错误分支没有退出码:自动化任务里失败被当成成功,问题被掩盖到很晚

数据来源与参考

  • Microsoft Learn:goto 命令

相关工具

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