为了直接解决问题,我需要一个批处理文件 不自动关闭如果我的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
编辑我必须承认,如果输入的标签是现有标签的开始子字符串,批处理将失败。