Уровень ошибок в цикле For (пакетные окна)
Все именные процессы iidbms, iigcc, iigcd, dmfacp, дмфркп, rmcmd реальны, и они найдены, вместо этого БУКВ придуманный и не должен его найти, поэтому следует печатать «процесс не найден 1», но это не так, всегда выводится 0.
Но я заметил, что если я запустил tasklist | findstr /i qwerty из командной строки, сразу после того, как %errorlevel% = 1.
Какой ответ может быть или лучше?
3 ответы
IF ERRORLEVEL возвращает TRUE, если код возврата был равен указанному уровню ошибки или превышал его. В вашем примере, поскольку 0 меньше 1, первый оператор уровня ошибки всегда будет истинным, если фактический код ошибки равен 0 или выше. Что вы хотите, так это сначала проверить уровень ошибок 1.
Другая проблема заключается в том, что вы хотите вывести фактический уровень ошибки из цикла for. Поскольку переменные разрешаются до начала цикла, при отображении% errorlevel% всегда будет отображаться 0. Если вы хотите отобразить значение во время выполнения, вам необходимо изменить фрагмент следующим образом:
ответ дан 15 окт ’10, 14:10
Я перевернул порядок (сначала 1, затем 0), но результат тот же — user461487
Если вы не изменили опубликованный код, вам понадобится goto после уровня ошибки 1, чтобы пропустить следующий оператор или изменить свое условие (использовать NEQ и т. Д.). — JRL
Я действительно думаю, что вы правильно написали. Но я не понимаю, почему в другой части кода строки: unloaddb.exe -c test> abc.txt, если% errorlevel% equ 0 call: backup, если% errorlevel% equ call: no_backup, работает нормально .. .. — user461487
Я проверил второй пример и отлично работает. Вы знаете, почему в комментарии, который я добавил чуть выше (: backup,: no_backup), работает? — user461487
код: unloaddb.exe -c test> abc.txt; если% errorlevel% equ 0 call: backup; если% errorlevel% equ 1 call: no_backup; или, может быть, вы предпочитаете, чтобы я написал это в значении «ответить на ваш вопрос» . — user461487
в начало вашего скрипта, затем используйте !errorlevel! вместо %errorlevel%
Отложенное расширение приведет к тому, что переменные будут расширены во время выполнения, а не во время синтаксического анализа.
Почему не работает errorlevel в цикле
I’m trying to learn batch scripting, but have run into this issue, which I don’t understand.
The sub (bottom) should ping each IP address in netips.txt , a pop-up msgbox FOR EACH IP which is Online ONLY should then appear displaying the IP before disappearing after 3 seconds. A beep should accompany each pop-up. The whole process (cycle) should then be repeated after 5 minutes.
What currently happens is that ALL IP’s pop-up as Online (those which are Offline should not pop-up — see `ipalert.txt` log below) along with a
‘ ‘ is not recognized as an internal or external command, operable program or batch file.
in the CMD window. The ipalert.txt log displays:
16/03/2015 at 12:49:05.79
192.168.1.1 Online
192.168.1.2 Online
192.168.1.3 Online
192.168.1.33 Online
192.168.1.34 Online
192.168.1.35 Offline
192.168.1.35 Online
192.168.1.36 Online
192.168.1.37 Offline
192.168.1.37 Online
192.168.1.38 Offline
192.168.1.38 Online
192.168.1.39 Offline
192.168.1.39 OnlineThe IP’s which appear as both Online and Offline should be Offline ONLY. Can anyone please help me understand what is happening, and what I must do to correct this?
Batch %errorlevel% returns 0 in FOR loop
I am trying to make a loop that will go through a set of text files in specified directory searching for a string. The result is reported based on whether the string is found. But the %errorlevel% always returns 0 and evaluates to 0.
Raymond did you mean that?:
4 Answers 4
%ERRORLEVEL% is being expanded too soon. You can just avoid the problem entirely by using:
Or for further details, see this explanation of «delayed environment variable expansion» from the SET /? help text:
Пакет Windows: findstr не устанавливает ERRORLEVEL в цикле for
Может ли кто-нибудь объяснить мне, почему следующий фрагмент печатает 0 :
При добавлении другого, эквивалентного оператора вне цикла for он выводит 1 1 :
Я немного новичок в Batch, поэтому для меня это немного загадочно, поскольку два утверждения кажутся не связанными. Любая помощь с этим будет оценена, спасибо!
4 ответа
Проблема в том, что в code block (заключенной в скобки серии операторов) любой %var% будет заменен фактическим значением переменной в parse time .
Приведу ваш первый пример, %errorlevel% 0 , и повторяется как таковой. Во втором примере это 1 , когда встречается for , поэтому он заменен на 1 .
Если вы хотите отобразить значение переменной среды, которое может быть изменено в цикле, вам нужно сделать одно из трех:
Вызов setlocal enabledelayedexpansion и эхо !var! вместо %var% — обратите внимание, что количество вложенных инструкций setlocal , которые вы можете активировать, ограничено.
Есть много-много статей о delayedexpansion по SO.
Грубо говоря, вы могли бы просто использовать (примечание — регистр не имеет значения в пакетном режиме, за исключением случая переменной управления циклом ( metavariable — %%i в этом случае)
Другой способ — динамически вызывать setlocal
Недостатком этого является то, что endlocal отменяет любые изменения, внесенные в среду с момента последнего setlocal . Также обратите внимание, что если delayedexpansion не действует, ! больше не является специальным символом.
Или вы можете использовать errorlevel традиционным способом:
Обратите внимание, что при этом учитывается значение run-time errorlevel , а if errorlevel n означает «если уровень ошибки n или больше n «.
Или — вызовите подпрограмму:
Обратите внимание, что здесь goto :eof (здесь важно двоеточие — это означает «перейти к физическому концу файла»