2014-11-20 2 views
0

Я использую этот код для сканирования q/w/e или r прессов.чтение ввода ключа в пакетном режиме; % errorlevel% остается 0:

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) 
) 

Этот код может обнаружить прессы (т.е. она продолжается через петлю, когда я нажать клавишу и подает звуковой сигнал при нажатии на клавишу, то д/ж/д/г), но «% errerlevel%» остается на ноль, делая мои заявления if бесполезными. Помогите? Я новичок в партии, поэтому у меня нет ни малейшего представления о том, какая проблема может быть.

ответ

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 от высоких до низких значений, как условие if errorlevel n будет верно для Равен значений больше или равно п

0

Использование

setlocal enableDelayedExpansion 

на начало сценария. И

! Ошибкаlevel!

вместо вашей

% ERRORLEVEL%