Windows 为什么赢了';执行此批处理文件中的t部分代码。请解释GOTO函数
我正在处理批处理文件,遇到了一些问题。根据一个网站: 要退出批处理脚本文件或退出子例程,请指定GOTO:eof this 将控制权转移到当前批处理文件的末尾或 当前子例程的 那么,考虑到这个定义,为什么这两个代码的某些部分不能执行: 第一个:Windows 为什么赢了';执行此批处理文件中的t部分代码。请解释GOTO函数,windows,batch-file,cmd,dos,Windows,Batch File,Cmd,Dos,我正在处理批处理文件,遇到了一些问题。根据一个网站: 要退出批处理脚本文件或退出子例程,请指定GOTO:eof this 将控制权转移到当前批处理文件的末尾或 当前子例程的 那么,考虑到这个定义,为什么这两个代码的某些部分不能执行: 第一个: :Loop echo I am in a loop. GOTO:eof Echo Hello Goto Loop echo Finish pause 唯一能打印的东西是:我在一个循环中。没有其他指纹 第二个: Echo Hello Goto L
:Loop
echo I am in a loop.
GOTO:eof
Echo Hello
Goto Loop
echo Finish
pause
唯一能打印的东西是:我在一个循环中。没有其他指纹
第二个:
Echo Hello
Goto Loop
echo Finish
pause
:Loop
echo I am in a loop
GOTO:eof
echo Finish不打印。为什么?
另外,您能简要说明Goto使用和子例程之间的区别吗
谢谢
更新:在谷歌上搜索其他内容时,我发现:我想这回答了问题,但是我仍然希望得到一些详细说明,例如
1) 何时使用GOTO和何时使用Call?(我想这与我上面关于子程序和GOTO之间差异的问题有关)
2) 对于第一个代码,为什么“我在一个循环中”这句话会打印/得到回应,而它从未被调用/指示执行
2b)如何仅在调用时执行该部分
更新2:
好吧,我怎样才能让这样的东西发挥作用呢
@echo off
echo main line
call :loop
call :another
call :loop
echo main line again
goto :eof
:loop
echo inside the subroutine
:another
echo hi!
goto
命令的任务是通过跳转到现有标签来更改下一行要执行的内容。标签后面的第一行将是要执行的下一行。与代码中使用的goto
数量无关,如果执行到达文件末尾(包括goto:eof
)或到达exit/b
,则批处理文件的执行结束
要使用子例程,必须使用call:label
命令。执行此命令时,将创建第二行执行。第一行(调用代码)被挂起,直到第二行(子例程)结束,第一行上的执行将在调用后的第一个命令处继续
子线程何时结束其执行
在其他语言中,子例程有一个起点和一个终点,即它的声明中的某种语法,用于限定属于子例程的代码
批处理文件中并非如此。子例程只有一个起点,即调用的标签,当到达另一个标签时,执行不会结束
子线程在其执行行结束时结束,当执行exit/b
或到达批处理文件的结尾时发生此情况。在这两种情况下,子例程的执行行结束,调用代码的执行行继续
当然,在任何情况下,如果执行exit
命令(不带/b
开关),则当前批和当前控制台将关闭
回答问题
1) 何时使用转到
以及何时使用呼叫
?视情况而定。它们应该在需要时使用,这取决于要解决的问题、如何解决问题的想法以及您编写代码的方式
2) 批处理代码中的标签既不定义函数,也不绑定任何内容。他们在代码中定义了可以跳转或调用的点。但它们不会干扰代码的执行,因此,它们会被解析,如果不需要的话(或多或少)会被丢弃,并且过程会继续到下一行。标签不是保护/阻止其后面代码的屏障。因此,在代码中,初始标签被跨过,第一个可执行行是echo
命令。之后,goto:eof
结束批处理文件的执行
2b)如果您不想执行该行,除非被调用,请确保除非被调用/跳转到,否则无法访问该行
@echo off
echo main line
call :loop
echo main line again
goto :eof
:loop
echo inside the subroutine
后藤去了那里,没有回来。如果你想结束一个节目或者做点什么然后结束一个节目,这是很好的。。它也可以用于迭代。运行一些类似于子程序的代码
我会打电话到那里然后再回来。所以这就像是goto然后做一些代码,然后有另一个goto回到原来的位置
如果您想进行迭代,Goto也可以这样做。创建一个循环
但是标签必须在Goto之前
e、 g
^^^这是一个循环
如果要在批处理文件中运行批处理文件,通常需要并意味着要使用call,否则之后它将不会继续
你似乎一度想知道为什么
:xyz
echo abc
为什么它呼应abc。当你认为没有任何东西可以指示它运行那个子程序时,它是一个标签,不一定用作子程序
您可以将它用作子例程,但要做到这一点,您需要确保它永远不会被访问,除非被调用
goto :eof
:xyz
echo abc
^^^这是一个子程序,你可以调用它
现在,当您想像子例程一样运行xyz时,您会说调用xyz
,显然是在goto:eof之前
关于您的最新更新
您需要多个子例程
您的问题是,在所谓的子例程之间没有goto:eof,所以它运行一个,然后运行以下的子例程
:abc
:def
:ghi
如果你试着转到abc或打电话给abc,那么它将通过所有这些
您需要在每个子例程的末尾添加一个goto:eof
您不一定需要在文件的末尾使用goto:eof,因为这就是文件的结尾
:abc
goto :eof
:def
goto :eof
:ghi
将其应用于代码
@echo off
echo main line
call :loop
call :another
call :loop
echo main line again
goto :eof
:loop
echo inside the subroutine
goto :eof
:another
echo hi!
这就产生了我认为你想要的结果。
注意,循环标签代码中添加了goto:eof I
添加了示例-
早些时候,我没有在abc标签前面加一个goto:eof,这确实证明了一个标签本身并不能使它成为一个子程序,但是如果你想让abc像一个子程序的话,在它前面加一个goto。在这个例子中,我已经做到了
@echo off
echo main line
call :loop
call :another
call :loop
echo main line again
goto :eof
:loop
echo inside the subroutine
goto :eof
:another
echo hi!
REM YOU COULD PUT A LABEL HERE IT MAKES NO DIFFERENCE
echo main
goto :eof
:abc
goto :eof
:def