在批处理中返回到之前的标签('goto'命令)

10
例如,
@echo off
goto main

:main
echo Select:
echo 1) Goto label 1
echo 2) Goto label 2
set /p choice=
if %choice% == 1 goto label1
if %choice% == 2 goto label2

:label1
echo Will now direct you to label2
echo Press any key to go to label2
pause >nul

:label2 [PROBLEM HERE]
echo Type 'N' or 'E' and press Enter to go back to label1 or exit.
set /p choice2=
if %choice2% == N goto label1
if %choice2% == E exit

请忽略“goto main”部分,我知道它不是必要的,但我已经习惯了。
“PROBLEM HERE”表示我希望批处理返回到label1的那一部分,而不需要编写指定返回到先前标签的代码,因为有时我可能需要让label1执行某些操作以进入label2并执行其他操作,然后再返回到label1继续其业务。
4个回答

24

goto 没有“返回”。 但是你可以 call 你脚本的一部分。

@echo off
echo main program
call :label1
echo main program
call :label2
echo main program

pause
exit /b

:label1
echo subroutine
goto :eof

echo never reached

:label2
echo sub two
goto :eof

4
很抱歉,您没有说明在申请的职位中为什么会有问题。
解决方案:
@echo off
goto main

:main
echo Select:
echo 1) Goto label 1
echo 2) Goto label 2
set /p choice=
if %choice% == 1 goto label1
if %choice% == 2 goto label2

:label1
echo Will now direct you to label2
echo Press any key to go to label2
pause >nul

:label2
echo Press any key to go from label2 to label1
pause >nul
goto label1

似乎太明显了。
@echo off
goto main

:main
echo Select:
echo 1) Goto label 1
echo 2) Goto label 2
set /p choice=
if %choice% == 1 goto label1
if %choice% == 2 call :label2

:label1
echo Will now direct you to label2
echo Press any key to go to label2
pause >nul

:label2
echo Reached label2 - Press any key to go from label2 to label1
pause >nul
goto :eof

需要输入的标签是:eof:label2(分别表示“CMD和内部子程序都理解的特殊标签end-of-file”和“调用”)。

然而,有些人认为到达一个标签会以与到达段落末尾或在C语言中的}或在Pascal中的end;相同的方式终止批处理例程。实际上并不是这样的。批处理只是像汇编一样继续执行下一个顺序语句。

我之所以说这个是因为您原来的代码没有明显的终止方式-例如,在输入除12之外的某些东西时,它将继续执行label1,然后通过label2-如果label2返回到label1,那么就会出现无限循环。

还有一件事:如果您使用set/p输入一个字符串,那么不能保证输入的数据不包含Spaces。解决这个问题的方法是"在比较运算符两侧用引号括起字符串"——即,双引号'而不是单引号'如果用户只是按Enter,那么if %choice% == 1 goto label1会被解释为if == 1 goto label1(因为变量choice没有设置),这将生成语法错误。

哦——而且choice不是一个变量的最佳名称(无论逻辑和描述性有多好),因为它是一个标准的CMD实用程序的名称。

从提示符尝试

choice /?

这可能会给你一些获取选择的其他方法的想法...

关于IT技术。请注意,保留了HTML标记。

对不起,我忘记添加退出批处理文件的方法了。至于“set /p”命令,我总是搞不清楚该如何解决,以便用户在不输入任何内容的情况下_不_按Enter键。最后,“choice”命令我不知道有这样一个命令,但别担心,我只是用它作为一个例子,我主要使用“set /p num”或“set /p no”。看起来“choice”命令可能非常有用,可以显示选择,嗯...顺便说一句,谢谢。 - MegaRodeon

0

我不是完全清楚你想要什么,但听起来你正在寻找一个可以使用 call 完成的子程序。

@echo off
goto main

:main
  echo Select:
  echo 1) Goto label 1
  echo 2) Goto label 2
  set /p choice=

  if %choice% == 1 goto label1
  if %choice% == 2 goto label2

  goto :eof 

:label1
  echo Will now direct you to label2
  echo Press any key to go to label2
  pause >nul
  call :label2

  goto :eof

:label2
  echo Reached label2
  goto :eof 

0

在分支之前使用 Set variable=label1Set variable=mainSet variable=EOF,然后使用


goto :%variable%

循环回到开始,或重新启动,或退出。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接