1

Если я запускаю этот код:

:loop
(type "File" | findstr Idle) > nul 2>&1
timeout 1
if errorlevel 1 goto loop

Затем, если строка "Idle" не может быть найдена в File, она начнется заново с "loop" и будет продолжаться до тех пор, пока не будет найдена "Idle", после чего она будет перемещаться дальше в коде. Это все хорошо, и если бы мой код был структурирован так, чтобы он был внизу кода, а не сверху, все было бы в порядке, но мне нужно, чтобы это была первая команда (поэтому, если Idle найден Повторите этот цикл, если холостой ход не найден, двигайтесь вниз)

Но когда я запускаю этот код:

:loop
(type "File" | findstr Idle) > nul 2>&1
timeout 1
if errorlevel 0 goto loop

Он всегда будет начинаться с "цикла" независимо от того, можно ли найти строку "Idle".

Мне действительно нужно иметь возможность запустить команду, если строка найдена (а не если строка не найдена (я не планирую использовать здесь "goto", мне нужно запускать определенные команды (например, "goto"), когда » Idle "найден, и другой набор команд, когда он не найден, поэтому мне нужно два допустимых уровня ошибки или альтернатива).

Почему это не работает, и как я могу это сделать?

2 ответа2

2

Вы должны прочитать некоторую документацию. Вы можете начать с ввода help if или if /? из командной строки, и если вы внимательно прочитаете, вы увидите одну проблему с вашей логикой.

IF ERRORLEVEL 0 означает «вернуть TRUE, если ERRORLEVEL>> 0». Это всегда будет верно после запуска FINDSTR.

Если у вас не было TIMEOUT до IF, вы можете просто использовать условие IF NOT ERRORLEVEL.

:loop
(type "File" | findstr Idle) > nul 2>&1
if not errorlevel 1 goto loop

Но логика разрушается, когда вы добавляете команду TIMEOUT, потому что она сбрасывает ERRORLEVEL в 0. Поэтому вы должны сохранить значение в своей собственной переменной перед запуском TIMEOUT.

:loop
(type "File" | findstr Idle) > nul 2>&1
set err=%errorlevel%
timeout 1
if %err% == 0 goto loop

Но я бы использовал && вместо этого:

:loop
type "File" | findstr Idle >nul 2>nul && (timeout 1 & goto :loop)

Или еще лучше:

:loop
findstr Idle "File" 2>nul >nul && (timeout 1 & goto :loop)
0

В конце концов я нашел альтернативное решение. (Работает только потому, что строка является первой строкой в моем файле)

:loop
set /p var=<File
timeout 1
if "%var%"=="Idle" goto loop

Это сработало для меня, но я все еще хотел бы ответить на вопрос, почему уровни ошибок не работают так, как рекламируется, или если я просто неправильно их понимаю (правильный ответ будет дан любому, кто объяснит, почему код в исходном вопросе не работает)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .