处理批处理中的 goto 命令错误

处理批处理中的 goto 命令错误

为了直接解决问题,我需要一个批处理文件 不自动关闭如果我的goto 命令无效(转到不存在的地方)是的,我之后停顿了一下

以下是该部分:

set /p Command=
goto %Command%
pause

谢谢披萨

答案1

  • 这个更安全的版本首先将所有标签收集到一个字符串中,一个接一个。
  • 下一个标签的冒号表示前一个标签的结束。
  • 字符串%Labels%和冒号回显到 findstr,输入的标签也附加有冒号,因此只匹配完整的标签。

@Echo off&SetLocal EnableExtensions EnableDelayedExpansion

Set "Labels="&For /f %%A in ('findstr /i "^:[a-z]" %0') Do Set "Labels=!Labels!%%A"

:redo
Set "Label="&set /p "Label=Choose label %Labels%:"
if not defined Label goto :Eof
Echo %Labels%:|findstr /i ":%Label::=%:" >nul 2>&1 ||(Echo invalid label %Label% & goto :redo)
goto %Label%
Echo we'll never reach here

:One
Echo Label One
goto :redo

:Two
Echo Label Two
goto :redo

:Three
Echo Label Three
goto :redo

示例输出:

> SU_1204527.cmd
Choose label :redo:One:Two:Three:one
Label One
Choose label :redo:One:Two:Three:two
Label Two
Choose label :redo:One:Two:Three:blah
invalid label blah
Choose label :redo:One:Two:Three:
> 

答案2

:redo
set /p "Label=goto label:"
findstr /i "^:%Label%" "%~0" >nul 2>&1 ||(Echo invalid label %Label% & goto :redo)
goto %Label%
pause

编辑我必须承认,如果输入的标签是现有标签的开始子字符串,批处理将失败。

相关内容