我正在编写一个包含3个功能的批处理文件。其他一切工作正常但是当第一个函数调用它运行所有3个函数时,当第二个函数被调用时它运行第二个和第三个,当第三个函数被调用时它只运行第三个函数,因为它是最后一个函数。
它有什么不对吗?
代码:
IF NOT #%1#==## GOTO END
:
IF #%1#==## GOTO HELP
:
IF NOT #%2#==## GOTO TOOMANY
:
:HELP
ECHO ** Input parameter is missing **
ECHO Correct format: %0 filename_tempate
ECHO Example: %0 *.TXT
ECHO.
ECHO Try again
:END
ECHO **End of Display**
:TOOMANY
ECHO **Too much data supplied**
GOTO HELP
答案 0 :(得分:1)
Batch会将执行转移到指定的标签,但与pascal和类似语言不同,不会将标签视为“程序结束” - 它只是通过标签收费。
要退出程序,您需要执行
goto :eof
冒号是required
,标签:eof
被理解为'文件结尾'而不必声明(实际上,不应该是恕我直言)
答案 1 :(得分:0)
Shell脚本(批处理文件)实际上没有功能。转到标签只是跳转目标。一旦你跳转到一个标签,执行将从该行继续执行,直到它到达另一个goto或命中文件结束。这意味着当您使用此行时:
GOTO HELP
脚本将跳转到该行并在此之后运行每一行。
要解决此问题,请使用
goto :EOF
标记后的部分。 :EOF表示“文件结束”。
比尔
答案 2 :(得分:0)
这是因为:HELP
和:END
不是真正的功能,它们是标签。当您使用GOTO HELP
时,cmd将跳转到HELP
并继续从那里运行脚本。解决此问题的一种方法是在每个函数之后添加GOTO
另一个标签。例如:
:HELP
ECHO ** Input parameter is missing **
ECHO Correct format: %0 filename_tempate
ECHO Example: %0 *.TXT
ECHO.
ECHO Try again
GOTO START
:END
ECHO **End of Display**
GOTO NEXT
:TOOMANY
ECHO **Too much data supplied**
GOTO HELP
:NEXT
这样,在cmd运行函数中的任何内容后,它将转到目标位置,而不是继续运行下一个函数。
另一种方式:
IF NOT #%1#==## CALL :END
:
IF #%1#==## CALL :HELP
:
IF NOT #%2#==## GOTO TOOMANY
:
:HELP
ECHO ** Input parameter is missing **
ECHO Correct format: %0 filename_tempate
ECHO Example: %0 *.TXT
ECHO.
ECHO Try again
GOTO :EOF
:END
ECHO **End of Display**
GOTO :EOF
:TOOMANY
ECHO **Too much data supplied**
CALL :HELP
GOTO :EOF
这样,cmd只会查看该函数并返回到之前的位置。