批量读取键输入; %errorlevel%保持为零

时间:2014-11-20 12:17:06

标签: batch-file

我正在使用此代码扫描q / w / e或r press。

for /l %%a in () do (  
choice /c qwerc /t 1 /d c >nul 
if "%errorlevel%"=="1" (echo q)
if "%errorlevel%"=="2" (echo w)
if "%errorlevel%"=="3" (echo e)
if "%errorlevel%"=="4" (echo r)
) 

这段代码可以检测到按下(即当我按下一个按键时它继续循环,当我按下q / w / e / r之外的按键时发出蜂鸣声),但是'%errerlevel%'保持为零,使我的if语句无用。救命?我是批处理的新手,所以我真的不知道问题可能是什么。

2 个答案:

答案 0 :(得分:3)

在批处理文件中,首先解析行和代码块(括号内的代码)并执行。在解析阶段,将删除所有变量读取操作,在代码开始执行之前替换为变量中的值。因此,如果变量中的值在行/块中的代码执行时发生更改,则此新值不可访问,因为对变量没有读取操作。

解决这个问题的通常方法是启用延迟扩展。这允许程序员向解析器指示某些变量读取应该延迟到执行时间。为此,访问变量的语法从%var%更改为!var!

如果没有延迟扩展,将从代码中删除对%errorlevel%的读取操作,并在解析for命令时替换为变量中的值。所以最终执行的代码是

for /l %%a in () do (  
    choice /c qwerc /t 1 /d c >nul 
    if "0"=="1" (echo q)
    if "0"=="2" (echo w)
    if "0"=="3" (echo e)
    if "0"=="4" (echo r)
) 

延迟扩展可以解决

setlocal enabledelayedexpansion
for /l %%a in () do (  
    choice /c qwerc /t 1 /d c >nul 
    if "!errorlevel!"=="1" (echo q)
    if "!errorlevel!"=="2" (echo w)
    if "!errorlevel!"=="3" (echo e)
    if "!errorlevel!"=="4" (echo r)
) 

此外,在这种情况下,由于正在测试的值是errorlevel,您还可以选择使用替代方法来检查它,而不需要启用延迟扩展

for /l %%a in () do (  
    choice /c qwerc /t 1 /d c >nul 
    if errorlevel 5 (
        rem c
    ) else if errorlevel 4 (echo r
    ) else if errorlevel 3 (echo e
    ) else if errorlevel 2 (echo w
    ) else (echo q)
) 

要使用此语法,请记住从高值到低值测试errorlevel,因为对于大于或等于n的错误级别值,条件if errorlevel n将为true

答案 1 :(得分:0)

使用

setlocal enableDelayedExpansion

脚本开头。 并且

<强>!错误级别!

而不是你的

%ERRORLEVEL%