一般的批处理命令,都是按照自上而下的流程逐行执行的,也就是说,只有第一行的命令执行了之后,才可能执行第二行,第二行执行完之后,再执行第三行……如此依次执行。
如果对不同的情况,需要执行不同的既定操作,若还是按照常规的执行流程的话,是无法完成任务的。这个时候,就需要引入流程跳转的概念,动用流程跳转语句 goto 了。流程跳转的含义是:改变默认的执行顺序,强制跳转到指定的位置执行特定的程序块。
在使用 goto 语句之前,我们先执行 “goto /?” 查看 goto 语句的帮助文档:
C:\Users\Administrator> goto /? 将 cmd.exe 定向到批处理程序中带标签的行。 GOTO label label 指定批处理程序中用作标签的文字字符串。 标签必须单独一行,并且以冒号打头。 如果命令扩展被启用,GOTO 会如下改变: GOTO 命令现在接受目标标签 :EOF,这个标签将控制转移到当前 批脚本文件的结尾。不定义就退出批脚本文件,这是一个容易的 办法。有关能使该功能有用的 CALL 命令的扩展描述,请键入 CALL /?。
看了上面的帮助文档,是不是一头雾水。下面简单介绍 goto 语句:
REM 跳转到 myLabel 标签 goto myLabel REM 语句1(在 myLabel 之前的语句将不会执行) REM 定义了一个标签 :myLabel REM 语句2(执行该语句,因为 goto 跳转到了 myLabel 标签)
实例:要求用户输入字母(A或B),然后根据用户输入的字母显示不同的提示信息。
@echo off setlocal set /p input=请输入字母A或B: if "%input%"=="A" goto A if "%input%"=="B" goto B echo 您没有输入字母 goto end REM 定义了一个标签 :A echo 您输入的字母是A goto end REM 定义了一个标签 :B echo 您输入的字母是B goto end :end
输出结果:
REM 用户输入了 A 字母,程序执行 goto A 语句,跳转到 :A 标签,然后继续执行 goto end,跳转到脚本结尾的 :end 标签 C:\Users\Administrator\Desktop> test.bat 请输入字母A或B:A 您输入的字母是A C:\Users\Administrator\Desktop> test.bat 请输入字母A或B:B 您输入的字母是B C:\Users\Administrator\Desktop> test.bat 请输入字母A或B: 您没有输入字母
其中:
:A 和 :B 定义了两个标签,可以使用 goto A 或 goto B 跳转到定义的标签。
setlocal 用来实现环境变量局部化,当批处理执行完毕后,定义的 input 变量将销毁。
(1)goto 语句和标签要互相呼应,不能只有 goto 语句而没有相应的标签段;否则,程序将找不到相应的标签段而直接退出。实例:
@echo off echo hello bat goto test echo www.hxstrive.com pause
输出结果:
C:\Users\Administrator\Desktop> test.bat hello bat 系统找不到指定的批处理标签 - test
上面实例中没有定义 test 标签,因此 goto 语句失败了,直接退出脚本;且没有执行 “echo www.hxstrive.com” 语句。
(2)只有标签段而没有goto语句是允许的,但不能实现流程跳转功能,从代码精简的角度来看,有标签段而没有goto语句,则此标签是多余的,可以精简掉。实例:
@echo off echo hello bat :test echo www.hxstrive.com pause
输出结果:
C:\Users\Administrator\Desktop>test.bat hello bat www.hxstrive.com 请按任意键继续. . .
上面实例中定义了 :test 标签,但是并没有使用,这不影响程序的正常运行。
(3)若有多个标签段,则需要注意标签段之间是否需要添加合适的退出语句来终止程序继续向下执行,这是很多新手很容易犯错的地方,需要谨慎。实例:
@echo off setlocal set /p input=请输入字符(A或B): if "%input%"=="A" goto A if "%input%"=="B" goto B echo 您没有输入字母 goto end :A echo 您输入了字符A :B echo 您输入了字符B :end
输出结果:
C:\Users\Administrator\Desktop> test.bat 请输入字符(A或B):A 您输入了字符A 您输入了字符B 批处理完成
上面实例中,当输入字母A之后,结果将同时显示 "您输入了字母A" 和 "您输入了字母B" 这两行内容。这是因为批处理是自上而下逐行执行的,即使用 goto 语句跳转之后,在新的位置上,这一执行流程仍然会保持,直到碰上另一个流程跳转语句,执行过程并不会在两个标签段之间自动终止。您可以在标签(:A 和 :B)代码块后面添加 exit 或者 goto end (end 是我们在批处理最后面添加的标签)语句。实例:
@echo off setlocal set /p input=请输入字符(A或B): if "%input%"=="A" goto A if "%input%"=="B" goto B echo 您没有输入字母 goto end :A echo 您输入了字符A goto end :B echo 您输入了字符B goto end :end
输出结果:
C:\Users\Administrator\Desktop> test.bat 请输入字符(A或B):A 您输入了字符A
或者使用 exit 语句实现上面实例,代码如下:
@echo off setlocal set /p input=请输入字符(A或B): if "%input%"=="A" goto A if "%input%"=="B" goto B echo 您没有输入字母 exit :A echo 您输入了字符A exit :B echo 您输入了字符B exit
输出结果:
C:\Users\Administrator\Desktop> test.bat 请输入字符(A或B):A 您输入了字符A
(4)标签名只可以使用常量,而不能使用变量。实例:
@echo off setlocal REM 使用变量存放标签名 set labelA=:A set labelB=:B set /p input=请输入字符(A或B): if "%input%"=="A" goto A if "%input%"=="B" goto B echo 您没有输入字母 goto end REM 使用变量定义标签名 %labelA% echo 您输入了字符A goto end REM 使用变量定义标签名 %labelB% echo 您输入了字符B goto end :end
输出结果:
C:\Users\Administrator\Desktop> test.bat 请输入字符(A或B):A 系统找不到指定的批处理标签 - A
(5)若有同名的标签段,将执行位于最顶层的标签段,其后的标签段是否得到执行,将视具体的情况加以处理。实例:
@echo off setlocal set /p input=请输入字符(A或B): if "%input%"=="A" goto A goto end :A echo (1) 您输入了字符A :A echo (2) 您输入了字符A :end
输出结果:
C:\Users\Administrator\Desktop> test.bat 请输入字符(A或B):A (1) 您输入了字符A (2) 您输入了字符A