在 WINDOWS / DOS 批处理编程中,使用标签定义一个程序块,标签类似其它编程语言(例如:C语言)中的函数。
标签程序块的示意图如下:
蓝色方框是firstLabel标签,红色方框是secondLabel标签
那么如何使用已经定义的标签呢?
【标签不被调用时的流程】
在 WINDOWS / DOS 脚本编程中,一般使用goto命令或call命令调用标签。
如果标签没有被调用,则当脚本程序执行到标签时,标签会作为一般程序代码被执行(就像标签不存在一样)。
示例一
::demo.bat
@echo off
:firstLabel
echo firstLabel
:secondLabel
echo secondLabel
echo this the end of file.
运行
C:\>demo.bat
firstLabel
secondLabel
this the end of file.
C:\>
【使用goto命令调用】
调用格式:goto :label
goto命令使CMD.EXE跳转到 label 的第一行开始执行,一直执行完 label 的最后一行,然后退出脚本程序。
示例二
::demo.bat
@echo off
goto :firstLabel
echo ---------------------
goto :secondLabel
:firstLabel
echo firstLabel
:secondLabel
echo secondLabel
echo this the end of file.
运行
C:\>demo.bat
firstLabel
secondLabel
this the end of file.
C:\>
解析
firstLabel被执行完后,直接退出脚本程序了,secondLabel 标签并没有得到执行。
【使用call命令调用】
调用格式:call :label [ pararneters ]
call命令使CMD.EXE跳转到 label 的第一行开始执行,一直执行完label 的最后一行,然后再跳转至call命令的下一行继续执行脚本程序。
关于传递给标签的参数 pararneters,详见 批处理文件的参数 、标签的参数
示例三
:: 本示例包含汉字,如执行乱码,请使用 Notepad++ 把本文档转化成ANSI编码 【标注一】
::demo.bat
@echo off
call :firstLabel
:: firstLabel标签被call命令执行完成后,从下一行开始继续执行
echo ---------------------
call :secondLabel
:: secondLabel标签被call命令执行完成后,从下一行开始继续执行
:firstLabel
echo firstLabel
:secondLabel
echo secondLabel
echo this the end of file.
【标注一】 下载Notepad++
运行
C:\>demo.bat
firstLabel
secondLabel
this the end of file.
C:\>demo.bat
firstLabel
secondLabel
this the end of file.
---------------------
secondLabel
this the end of file.
firstLabel
secondLabel
this the end of file.
C:\>
解析
值得注意的是:secondLabel 标签被call命令执行完后,会继续执行call命令的后续程序(包括定义的标签代码),直到脚本结束。
【把标签改为函数】
通过上述示例可以看出:标签的执行流程和其它语言中的函数不完全相同。怎么才能把标签改成我们熟悉的函数呢?
只需:
- “goto :EOF” 语句作为每个标签的最后一行
- “goto :EOF” 语句作为在脚本中第一个标签定义行的上一行
把示例三修改如下:
:: 本示例包含汉字,如执行乱码,请使用 Notepad++ 把本文档转化成ANSI编码 【标注一】
::demo.bat
@echo off
call :firstLabel
:: firstLabel标签被call命令执行完成后,从下一行开始继续执行
echo ---------------------
call :secondLabel
:: secondLabel标签被call命令执行完成后,从下一行开始继续执行
:: "goto? :EOF"作为在脚本中第一个标签定义行的上一行
goto :EOF
:firstLabel
echo firstLabel
:: "goto? :EOF"语句作为firstLabel标签的最后一行
goto :EOF
:secondLabel
echo secondLabel
echo this the end of file.
:: "goto? :EOF"语句作为secondLabel标签的最后一行
goto :EOF
运行
C:\>demo.bat
firstLabel
---------------------
secondLabel
this the end of file.
C:\>
现在,标签就变成我们熟悉的函数了。
【注意】
- 使用goto命令调用上述“函数式标签”时,标签执行完成,会退出脚本程序,这个好理解,毕竟标签的最后一行是“goto :EOF”
- 使用call命令调用上述“函数式标签”时,标签执行完成,还是会返回至call命令所在行的下一行继续执行。标签的最后一行是“goto :EOF”,它被执行完成意味着该标签执行完毕。调用格式:call :label [ pararneters ]的语义是:被调用标签执行完毕立即返回,继续执行call命令的后续语句。这里有些“绕”,请同学们自己体会一下。
写作不易,如果本文帮到了您,请您 “在下面一圈三连”。