Before CALL 的显示显然是立即执行的。call 下令临时将控制权交给标签后面的代码,导致显示 After LABEL。当这是一个 goto 下令时,此时 bat 文件在显示之后竣事。但是利用call下令,在 :MyLabel 和 bat 文件末端之间的所有内容执行之后,控制立即返回到call下令之后的下令。因此,显示 After CALL。
有些人大概期望执行在此时完成,但解释器接下来再次遇到 :MyLabel。我们不会调用它;相反,它只是一行代码。注意,我没有称它为下令,甚至也没有称它为语句。它只是一行代码,一个占位符,在这个上下文中,只不过是通往下一个下令的路径上的一个非常玄妙的减速带。解释器移到bat文件的最后一行,第二次显示文本 After LABEL。解释器找不到其他需要解释的下令,bat文件就完成了。
当 goto 下令放弃控制时,call 下令记着它从哪里来,并在它的业务完成后返回到谁人位置。现在我们有了一个可调用的内部例程,我们将用 call 下令调用这个例程。
调用内部例程
随着批处理代码变得越来越风趣,您大概希望从bat文件中的不同位置多次执行一段代码。比方,您大概希望多次调用可执行文件,或者您大概希望定期检查目录中是否有需要复制的文件。当我们用到交互式批处理时,你大概想要问用户一个题目并多次得到响应。
面对对一段代码进行多次调用的需求,新手步调员大概会采用剪切和粘贴的方式——在我极其挑剔的观点中,这是一种令人讨厌的选择。一个更好的解决方案是创建一个内部例程,并从多个位置调用它。您甚至可以将一些只调用一次的代码放入例程中,以便更好地组织您的bat文件。偶然直接运行一个标签是完全可以的,但更多时候,您需要创建一个只能通过调用它来调用的例程。
对于下面的练习,我们继续利用上面的代码,以便标签界说一个可调用例程。也就是说,执行流将调用例程,从中返回,并在再次进入该例程之前退出bat文件。为此,我需要一种方法来终止例程和bat文件。即 After LABEL的最终将不再显示。相反,我们期望有这三行输出: