如何将来自 CHOICE 命令的用户输入保存到一个变量中,以便稍后在错误级别中使用

How to save user input from CHOICE command to a variable to be used later in the errorlevel

我有一个正在编写的程序的动态选择列表。我让它正常工作,因此它将根据 count 变量更改 CHOICE 选项,但现在我也在努力使 errorlevel 动态化。这是我的代码:

SETLOCAL EnableDelayedExpansion
@ECHO off
SET count=7
SET ph=
FOR /L %%a IN (1,1,%count%) DO (
SET ph=!ph!%%a
ECHO !ph!
)
CHOICE /C Q%ph%
IF errorlevel (I don't have a variable for this) (
echo "in if" & pause
)

IF errorlevel 1 echo "out of if" & pause

我的想法是将错误级别设置为用户输入的值(例如,用户输入 7 作为他们的选择,错误级别变为 7)我想这样做的原因是因为我需要 errorlevel 传递除 1 以外的所有内容,这是为退出选项保留的(这就是为什么我在那里有 "Q" 的原因)非常感谢任何意见和建议!谢谢!

为了解决我的问题,我使用了 NEQEQU 语句,我不知道它们可以与 errorlevel 一起使用。我还采纳了@LotPings 的建议来获取此代码,结果效果很好!为了从技术上将用户输入保存为变量,我只是从 choice 变量中减去一个,它等于相同。

SETLOCAL EnableDelayedExpansion
REM @ECHO off
SET count=7
SET ph=
FOR /L %%a IN (1,1,%count%) DO (
SET ph=!ph!%%a
REM ECHO !ph!
)
CHOICE /C Q%ph%
set choice=%errorlevel%
ECHO %choice%
IF %choice% NEQ 1 ( 
ECHO "not equal" & PAUSE
SET /A choice=choice-1
ECHO !choice! REM This is now the value the user inputted.
PAUSE
)
IF %choice% EQU 1 ECHO "equal" & PAUSE

我建议针对此任务使用以下批处理代码:

@ECHO OFF
SETLOCAL EnableExtensions EnableDelayedExpansion
SET count=7
SET ph=
FOR /L %%a IN (1,1,%count%) DO SET ph=!ph!%%a
%SystemRoot%\System32\choice.exe /C Q%ph%
IF NOT ERRORLEVEL 2 ECHO Bye^^!& GOTO :EOF
SET /A UserChoice=%ERRORLEVEL%-1
ECHO You have chosen %UserChoice%.
PAUSE

IF NOT ERRORLEVEL 2 表示如果 CHOICE 的退出代码不大于或等于 2,这与 LESS THAN 2 相同,则执行 ECHO GOTO 退出处理该批处理文件。

命令 IF 不会修改 ERRORLEVEL 的值,如
中所述

也可以先把CHOICE的exit code赋值给一个环境变量减1,然后再和[=14比较退出=].

@ECHO OFF
SETLOCAL EnableExtensions EnableDelayedExpansion
SET count=7
SET ph=
FOR /L %%a IN (1,1,%count%) DO SET ph=!ph!%%a
%SystemRoot%\System32\choice.exe /C Q%ph%
SET /A UserChoice=%ERRORLEVEL%-1
IF %UserChoice% == 0 ECHO Bye^^!& GOTO :EOF
ECHO You have chosen %UserChoice%.
PAUSE

不建议使用名称为 choice 的环境变量,因为这样很难在包含外部命令 CHOICE[=55= 的批处理文件中搜索此环境变量] 这就是使用 UserChoice.

的原因

出于安全原因,命令 CHOICE 指定了完整的限定文件名(文件路径 + 文件名 + 文件扩展名)。 Windows 命令处理器不需要在当前目录和 local 中使用环境变量 PATHEXT 中列出的文件扩展名搜索 choice.*环境变量 PATH 使用完全限定文件名。这使得批处理文件能够抵抗损坏的 system PATH,其中包含最重要的文件夹路径 %SystemRoot%\System32 之前的文件夹路径,其中偶然还包含 choice.* 文件,文件扩展名在 PATHEXT 中列出。 local 环境变量 PATH 根本不需要存在于 运行 这个批处理文件中,因为使用了可执行文件的完整限定文件名 CHOICE 。如果用户在 运行 此批处理文件或任何其他目录的当前目录中创建名称为 choice.batchoice.cmd 的批处理文件,则完全限定文件名也无关紧要PATH%SystemRoot%\System32 之前被 cmd.exe 搜索。