В пакетных файлах, строках и блоках кода (код внутри скобок) сначала анализируются и выполняются. Во время фазы анализа все операции считывания переменных удаляются, заменяются значением в переменной до, код начинает выполняться. Таким образом, если значение в переменной изменяется, пока выполняется код в строке/блоке, это новое значение не является доступным, так как нет операции чтения в переменной.
Обычный способ решения этой проблемы - отсроченное расширение. Это позволяет программисту указать синтаксическому анализатору, что некоторые переменные считывания должны быть отложены до времени выполнения. Для этого, синтаксиса для доступа к переменным изменениям из %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
будет верно для Равен значений больше или равно п