如何正确使用CALL函数中的CHOICE?

问题描述 投票:0回答:1

在批处理文件中使用嵌套 CALL 函数和 CHOICE 命令时,我遇到一个相当令人困惑的问题。

用伪代码总结:

1.) 使用 CHOICE 命令,当选择正确的选项时,该命令将使用 CALL :function1

2.) :function1 使用 CALL :setVar_n

3.) :setVar_n 设置变量列表,并以 EXIT /B 结束返回到 :function1

4.) :function1 有一个 CHOICE 命令(Y/N),其中 Y 会继续执行操作然后以 EXIT /B 结束,N 立即以 EXIT /B 结束

问题:

无论输入如何,:function1 中的 CHOICE 命令始终计算为 N(第二个选项)。

我不明白为什么使用 %ERRORLEVEL% 失败,而 IF ERRORLEVEL 工作正常。我也不确定为什么使用 CALL 会导致 %ERRORLEVEL% 首先停止工作。

我试图避免重写每个选择命令(必须至少有 50 个,有些有 25 个以上选项)。

当使用 %ERRORLEVEL% 写入时,它会失败:

::Return from setVar_n here

CHOICE /C YN /M "Continue? Y/N >"
IF %ERRORLEVEL%==2 (EXIT /B)

::function1 continues here

如果我使用 IF ERRORLEVEL:

::Return from setVar_n here

CHOICE /C YN /M "Continue? Y/N >"
IF ERRORLEVEL 2 (EXIT /B)

::function1 continues here

工作正常。问题是,即使在 :function1 结束之后,CHOICE 问题仍然存在。它会影响整个文件中的所有 CHOICE 命令,因此根本无法使用 %ERRORLEVEL%。

有人能解释一下这个问题吗?

这是用于测试的完整文件代码,这可能更有意义:

@ECHO OFF

:start
choice /c ABC
if %errorlevel%==1 (goto start)
if %errorlevel%==2 (call :function1)
if %errorlevel%==3 (goto start)

echo Function 1 completed
pause
choice /c ABC
if %errorlevel%==1 (echo 1)
if %errorlevel%==2 (echo 2)
if %errorlevel%==3 (echo 3)
pause
exit


:setVar
set /a var1=2
set /a var2=3
exit /b

:function1
echo In Function 1
call :setVar
choice /c YN /m "Continue (Y) or Finish (N)"
if %errorlevel%==2 (exit /b)
echo Still inside function 1
exit /b

windows batch-file cmd
1个回答
0
投票

感谢 Stephan 在评论中提供正确答案。

解决方案是使用:

set "errorlevel="

choice
命令之前。

© www.soinside.com 2019 - 2024. All rights reserved.