Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 批处理选择命令将不起作用_Batch File_Cmd_Choice - Fatal编程技术网

Batch file 批处理选择命令将不起作用

Batch file 批处理选择命令将不起作用,batch-file,cmd,choice,Batch File,Cmd,Choice,我有一个问题,为什么这个选择命令不起作用。我查看了这个网站,比较了我所有的脚本,我就是不明白为什么它不起作用 我做了一些更改,删除了不必要的代码 @ECHO关闭 :开始 CLS ECHO=1退出,或2打印hello并返回此屏幕 选择/C 12/N 如果错误级别2(呼叫:HELLO&GOTO START) 出口 :你好 你好 超时2 1>NUL 错误级别测试错误 有两种可能性: @ECHO OFF :BEGIN ECHO 1 to quit or 2 to print hello and go

我有一个问题,为什么这个选择命令不起作用。我查看了这个网站,比较了我所有的脚本,我就是不明白为什么它不起作用


我做了一些更改,删除了不必要的代码

@ECHO关闭
:开始
CLS
ECHO=1退出,或2打印hello并返回此屏幕
选择/C 12/N
如果错误级别2(呼叫:HELLO&GOTO START)
出口
:你好
你好
超时2 1>NUL

错误级别测试错误

有两种可能性:

@ECHO OFF

:BEGIN
ECHO 1 to quit or 2 to print hello and go back to this screen
CHOICE /C:12 /N
IF ERRORLEVEL 2 GOTO HELLO
IF ERRORLEVEL 1 EXIT /B
GOTO BEGIN

:HELLO
ECHO hello
GOTO BEGIN
请参阅Microsoft支持文章

批处理用户必须按1或2,否则批处理执行将无法继续。因此,可以从最高到最低使用

if errorlevel X ...
这意味着如果errorlevel大于或等于X,则执行命令(或命令块)

使用这种语法的优点是,它甚至可以在命令块中工作,而不需要使用延迟扩展

第二种可能性是:

@ECHO OFF

:BEGIN
ECHO 1 to quit or 2 to print hello and go back to this screen
CHOICE /C:12 /N
IF %ERRORLEVEL% == 1 EXIT /B
IF %ERRORLEVEL% == 2 GOTO HELLO
GOTO BEGIN

:HELLO
ECHO hello
GOTO BEGIN
通过显式引用环境变量
ERRORLEVEL
,这里使用之前的扩展,如果评估条件,ERRORLEVEL测试的顺序不再重要

此方法的缺点是,如果选项且errorlevel评估条件在用
定义的命令块内,则需要使用延迟扩展

在命令提示窗口中运行
if/?
set/?
以获取有关正确使用命令的帮助ifset分别获取有关延迟扩展的信息

可以(但不建议)用作标签
START
,因为这是Windows命令解释器的内部命令。当批处理文件还将使用命令START时,查找
START
表示标签和
START
表示命令时会遇到麻烦。因此,
BEGIN
被用作标签

还建议至少在开发批处理文件期间,使用命令EXIT和参数
/B
,以仅退出批处理,但不要完全退出正在运行的命令进程,而不依赖于调用层次结构和启动
cmd.exe时使用的选项

调试批处理文件要容易得多,方法是在命令提示窗口中运行批处理文件(
cmd.exe
以option
/K
启动,以保持控制台窗口打开),而不是双击批处理文件(
cmd.exe
以option
/C
启动,以在批处理执行完成后关闭)在命令提示窗口保持打开时,使用
exit/B
而不是仅使用
exit
。在命令提示符窗口中运行
cmd/?
,了解有关Windows命令解释器选项的详细信息

GOTO BEGIN
在两个errorlevel求值为real之后,此处从不执行。因此,该批处理文件也可以写成:

@ECHO OFF

:BEGIN
ECHO 1 to quit or 2 to print hello and go back to this screen
CHOICE /C:12 /N
IF ERRORLEVEL 2 GOTO HELLO
EXIT /B

:HELLO
ECHO hello
GOTO BEGIN
更简单:

@ECHO OFF
:START
echo 1 to quit or 2 to print hello and go back to this screen
CHOICE /C 12 /N
GOTO OPTION-%ERRORLEVEL%

:OPTION-1  Quit
EXIT

:OPTION-2  Hello
ECHO hello
GOTO START

用%ERRORLEVEL%代替ERRORLEVEL是我的错。很抱歉
@ECHO OFF
:START
echo 1 to quit or 2 to print hello and go back to this screen
CHOICE /C 12 /N
GOTO OPTION-%ERRORLEVEL%

:OPTION-1  Quit
EXIT

:OPTION-2  Hello
ECHO hello
GOTO START