如何将来自 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" 的原因)非常感谢任何意见和建议!谢谢!
为了解决我的问题,我使用了 NEQ
和 EQU
语句,我不知道它们可以与 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.bat
或 choice.cmd
的批处理文件,则完全限定文件名也无关紧要PATH
在 %SystemRoot%\System32
之前被 cmd.exe
搜索。
我有一个正在编写的程序的动态选择列表。我让它正常工作,因此它将根据 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" 的原因)非常感谢任何意见和建议!谢谢!
为了解决我的问题,我使用了 NEQ
和 EQU
语句,我不知道它们可以与 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.bat
或 choice.cmd
的批处理文件,则完全限定文件名也无关紧要PATH
在 %SystemRoot%\System32
之前被 cmd.exe
搜索。