我正在使用此代码扫描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语句无用。救命?我是批处理的新手,所以我真的不知道问题可能是什么。
答案 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%