【WINDOWS / DOS 批处理】关于标签的执行流程

发布于:2022-11-07 ⋅ 阅读:(457) ⋅ 点赞:(0)

在 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命令的后续语句。这里有些“绕”,请同学们自己体会一下。

写作不易,如果本文帮到了您,请您 “在下面一圈三连”。

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到