批次:如何在CALL函数内正确使用CHOICE?

时间:2019-10-21 17:49:02

标签: windows batch-file cmd

在批处理文件中使用嵌套的CALL函数和CHOICE命令时,我有一个相当混乱的问题。

总结为伪代码:

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

2。):function1使用CALL:setVar_n

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

4。):功能1具有CHOICE命令(是/否),其中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错误级别:

::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

1 个答案:

答案 0 :(得分:0)

感谢斯蒂芬在评论中提供正确答案。

解决方案是使用

set "errorlevel="

choice命令之前。