Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 为什么赢了';执行此批处理文件中的t部分代码。请解释GOTO函数_Windows_Batch File_Cmd_Dos - Fatal编程技术网

Windows 为什么赢了';执行此批处理文件中的t部分代码。请解释GOTO函数

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

我正在处理批处理文件,遇到了一些问题。根据一个网站:

要退出批处理脚本文件或退出子例程,请指定GOTO:eof this 将控制权转移到当前批处理文件的末尾或 当前子例程的

那么,考虑到这个定义,为什么这两个代码的某些部分不能执行:

第一个:

: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