Я написал следующий код
setlocal
set /A sample =1
:first
type C:\test.txt | find "inserted"
if %ERRORLEVEL% EQU 0 goto test
if %ERRORLEVEL% EQU 1 goto exam
:test
echo "testloop" >> C:\testloop.txt
set /A sample = %sample% + 1
if %sample% LEQ 4 goto first
:exam
echo "exam loop" >> C:\examloop.txt
endlocal
но это собирается маркировать "экзамен" даже при том, что ошибочный уровень не равен "1", помогите мне
Ваша проблема не в goto, а в том, что уровень ошибок требует особой обработки, это не похоже на обычную переменную среды. Единственный тест, который вы можете сделать с помощью errorlevel, - это проверить, больше ли он или равен значению.
, поэтому вам нужно проверять значения уровня ошибки от самого высокого до самого низкого, потому что если уровень ошибки 1
, то , если уровень ошибки 1
будет истинным, но , если уровень ошибки 0
будет ] также будет истинным
setlocal
set /A sample =1
:first
type C:\test.txt | find "inserted"
if errorlevel 1 goto exam
if errorlevel 0 goto test
:test
echo "testloop" >> C:\testloop.txt
set /A sample = %sample% + 1
if %sample% LEQ 4 goto first
:exam
echo "exam loop" >> C:\examloop.txt
endlocal
, если у вас включены расширения команд и нет переменной среды с именем ERRORLEVEL (без учета регистра). Тогда теоретически вы можете использовать% ERRORLEVEL% как обычную переменную среды. Так что это тоже должно работать
setlocal EnableExtensions
set /A sample =1
:first
type C:\test.txt | find "inserted"
if %errorlevel% EQU 1 goto exam
if %errorlevel% EQU 0 goto test
:test
echo "testloop" >> C:\testloop.txt
set /A sample = %sample% + 1
if %sample% LEQ 4 goto first
:exam
echo "exam loop" >> C:\examloop.txt
Вам необходимо перечислить уровни ошибок в порядке убывания (errorlevel2, errorlevel1, errorlevel0. ..).
См. это объяснение и пример .