批处理文件%errorlevel%因' choice '命令出错



我在批处理文件中有一个菜单,它是由选择命令驱动的:

choice /C PNQTF /N /M "Choice: "
echo Errorlevel is %errorlevel%
if %errorlevel%==5 goto ViewFTP
if %errorlevel%==4 goto AutoTransferToggle
if %errorlevel%==3 goto TheEnd
if %errorlevel%==2 goto InternalLink
if %errorlevel%==1 goto NewSub
goto begin

20次中有19次没有问题。菜单工作得很好。但是有一小部分时间,当我推Q退出时,代码似乎随机跳到:NewSub,即使Errorlevel is %errorlevel%语句在屏幕上回声到Errorlevel is 3……然而,它仍然遵循指令,好像errorlevel是1!

我想也许使用!errorlevel!只是为了安全,但这并不重要,因为这组选择不在任何代码块中-它不包含在任何if语句或任何函数中。我会说这个问题永远不会发生,如果我只是运行批处理文件,并立即退出…在批处理文件的黑暗深处有一些东西,当执行通过goto begin返回到开始时,不知何故,它设法徘徊并困扰着菜单。

我头上的头发少了一半,因为这个问题让我拔掉了很多头发。下一个可能是胸毛。唯一比这更随机的事

原来解决方案是我之前已经检查过的,但不够仔细。我跟踪了我的代码,发现了一个场景,用户返回到主菜单(goto begin),而在调用函数的中间-,所以函数从来没有用goto :eof语句结束。

仅当用户试图退出主菜单时才会出现症状。当用户选择Q(这会将他们带到文件的最底部一个名为:TheEnd的标签处)时,它会直接跳到中断未结束函数的goto begin语句之后的行。用户看不到任何输出,除了"在我按Q之后,它突然执行了这段代码。">

所以,事实证明,errorlevel工作得很好;将执行返回到那行代码只会使errorlevel看起来一团糟,而实际上批处理文件执行将未完成的函数视为最终死亡之前的bucket list项目。

最新更新