Возможно ли проверка условий в пакетном командном файле если да то как она организована

Обновлено: 04.07.2024

not - задает выполнение команды только в случае невыполнения условия.

errorlevel число - условие выполняется, если предыдущая команда, обработанная интерпретатором команд Cmd.exe, завершилась с кодом, равным или большим числа.

команда - команда, которая должна быть обработана в случае выполнения условия.

строка1==строка2 - условие выполняется, если строки строка1 и строка2 совпадают. Строки могут быть заданы явно или могут быть пакетными переменными (например, %1). Явно заданные строки нет необходимости заключать в кавычки.

exist имя_файла - условие выполняется, если существует файл с именем имя_файла.

оп_сравнения - трехзначный оператор сравнения. В следующей таблице перечислены допустимые значения оп_сравнения.

Оператор Описание
EQU равно
NEQ не равно
LSS меньше
LEQ меньше или равно
GTR больше
GEQ больше или равно

Если расширения командного процессора разрешены, следует использовать также следующий синтаксис:

if [/i] строка1 оп_сравнения строка2 команда [else выражение]

if cmdextversion число команда [else выражение]

if defined переменная команда [else выражение]

Параметры

/i - сравнение строк без учета регистра знаков. Параметр /i можно использовать в конструкции string1==string2 команды if. Эти сравнения являются общими. Если и строка1, и строка2 состоят из цифр, строки преобразовываются в числа и выполняется сравнение чисел.

cmdextversion число - условие выполняется, только если номер внутренней версии, связанный с расширениями командного процессора Cmd.exe, равен или больше числа. первая версия имела номер 1. Номер версии увеличивается на 1 при внесении в расширения командного процессора значительных изменений. Условие с cmdextversion не выполняется, если расширения командного процессора запрещены (по умолчанию они разрешены).

defined переменная - условие выполняется, если переменная определена.

выражение - команда и все ее параметры для обработке в командной строке при выполнении оператора else.

· Если условие, заданное в команде if, выполняется, будет выполнена команда, следующая за условием. Если условие не выполняется, команда, заданная в операторе if, пропускается, а управление переходит к команде оператора else, если она задана.

· Когда программа завершается, она возвращает код завершения. С помощью параметра errorlevel коды завершения можно использовать в качестве условий.

· Использование команды defined переменная

При использовании команды defined переменная добавляются следующие три переменные: %errorlevel%, %cmdcmdline% и %cmdextversion%.

%errorlevel% замещается строковым представлением текущего значения errorlevel, если только уже не существует переменная среды с именем ERRORLEVEL. В этом случае будет использовано ее значение.

В следующем примере показано использование значения errorlevel после выполнения пакетной программы:

goto answer%errorlevel%
:answer0
echo Код возврата программы равен 0
:answer1
echo Код возврата программы равен 1
goto end
:end
echo Готово!

Операторы сравнения оп_сравнения также можно использовать следующим образом:

if %errorlevel% LEQ 1 goto okay

%cmdcmdline% замещается исходной командной строкой, переданной Cmd.exe, до ее обработки в Cmd.exe, если только уже не существует переменная среды с именем cmdcmdline. В этом случае будет использовано значение cmdcmdline.

%cmdextversion% замещается строковым представлением текущего значения cmdextversion, если только уже не существует переменная среды с именем CMDEXTVERSION. В этом случае будет использовано ее значение.

· Использование оператора else

Оператор else должен размещаться в той же строке, что и команда if.

Если необходимо разместить всю инструкцию в одной строке, можно использовать следующую правильную форму исходной инструкции:

IF EXIST имя_файла. (del имя_файла.) ELSE echo имя_файла. отсутствует

Примеры

if not exist product.dat echo Не найден файл данных

Команда if не может быть использована непосредственно для проверки существования каталога, но в каждом каталоге существует устройство (NUL). Следовательно, существование каталога может быть проверено, как показано ниже. В следующем примере проверяется наличие каталога:

if exist c:mydir\nul goto process

Оператор if и команду echo можно использовать в одной командной строке: Например:

if exist *.rpt echo Отчет получен.

Команда For

Запуск некоторой команды для каждого файла из заданного множества.

for %переменная|%%переменная> in (множество) doкоманда [ПараметрыКоманднойСтроки]

%переменная|%%переменная> - обязательный параметр. Замещаемый параметр. Используйте %переменная для выполнения команды for из командной строки. Используйте %%переменная для выполнения команды for в пакетном файле. Переменные учитывают регистр и могут быть представлены со значением альфа, например, %A, %B или %C.

(множество) - обязательный параметр. Задает один или несколько файлов, каталогов, диапазон значений или текстовых строк, подлежащих обработке заданной командой. Скобки являются обязательными.

команда - обязательный параметр. Задает команду, которая будет выполнена для каждого файла, каталога диапазона значений или текстовой строки, включенной в указанный параметр (множество).

ПараметрыКоманднойСтроки - задает параметры командной строки, которые используются с указанной командой.

b) Использование программы for

Команда for может быть использована в пакетном файле или непосредственно из командной строки.

c) Использование параметров командной строки пакетного файла

Перечисленные ниже атрибуты применяются к команде for.

d) В команде for переменная %%переменная (или %%переменная) будет заменяться текстовой строкой из заданного параметра множество, пока параметр команда не обработает все файлы этого множества.

e) Имена параметров переменная команды for учитывают регистр буквы, они являются глобальными и одновременно может быть активно не больше 52 переменных.

f) Для обозначения параметра переменная можно использовать любые символы, кроме цифр 0–9, чтобы не было конфликта с параметрами пакетных файлов %0%9. Для простых пакетных файлов вполне достаточно обозначений с одним символом, например %%f.

g) Задание множества файлов

Параметр множество может представлять группу файлов или несколько групп файлов. Для задания групп файлов можно использовать подстановочные знаки (* и ?). Следующие множества файлов являются допустимыми:

(*.doc)

(*.doc *.txt *.me)

(jan*.doc jan*.rpt feb*.doc feb*.rpt)

(ar??1991.* ap??1991.*)

h) Когда используется команда for, первое значение в параметре множество заменяет параметр %%переменная (или %переменная), а затем для обработки этого значения выполняется указанная команда. Это продолжается до тех пор, пока не будут обработаны все файлы (или группы файлов), которые соответствуют значению параметра множество.

i) Использование ключевых слов in и do

k) Использование дополнительных форм команды for

Если расширения командного процессора разрешены (по умолчанию), то поддерживаются следующие дополнительные формы команды for.

l) Только каталоги

Если параметр множество содержит подстановочные знаки (* и ?), команда, указанная в параметре команда, выполняется для каждого каталога (кроме множества файлов в указанном каталоге), совпадающего с параметром множество. Используется следующий синтаксис.

for /D %% | %>переменная in (множество) doкоманда [ПараметрыКоманднойСтроки]

Проходит по дереву каталогов с корнем в [диск:]путь, выполняя инструкцию for для каждого каталога в дереве. Если после ключа /R не задан каталог, предполагается текущий каталог. Если параметр множество задано одной точкой (.), то команда просто перечислит каталоги в дереве. Используется следующий синтаксис.

for /R [[диск :]путь] %% | %>переменная in (множество) doкоманда [ПараметрыКоманднойСтроки]

Дополнительную информацию по команде forможно получить с помощью справки.

Практическое задание

2.1. Запустите консоль командной строки.

2.2. В приглашении «С:\>» введите help — получите список команд.

2.3. Для того чтобы получить помощь по отдельной команде необходимо ввести команду: help [команда], или [команда] /?.

2.4. Все действия необходимо выполнять в командной строке, для перехода между каталогами используйте команду cd, для перехода на другой диск в приглашении командной строки введите [диск]: например: c:, для просмотра содержимого используйте команду dir, для того, чтобы создать новый каталог используйте команду md. (За информацией по командам обращайтесь к Приложению и help).

2.5. В Вашем каталоге создайте каталог AOS и подкаталог вида [NN_n], где NN_n — номер Вашей группы и подгруппы, например: 81_1.

2.6. В каталоге, созданном выше ([NN_n]), создайте подкаталог LAB1. Зайдите в каталог LAB1. Теперь это Ваш рабочий, или текущий, каталог. Все файлы, которые Вы будете создавать должны находиться в нем.

echo Hello again!

echo Command echo

2.8. Сохраните файл - нажмите Ctrl+Z.

2.9. Запустите файл на выполнение, набрав в командной строке его имя.

2.10. Рассмотрим использование команд rem, pause, goto и меток. В этом примере все файлы с диска A копируются в текущий каталог. После этого на экран выводится запрос вставить другой диск в дисковод А, затем команда pause приостанавливает работу программы, чтобы пользователь мог сменить диск и нажать любую клавишу для продолжения процесса. Данная пакетная программа работает как бесконечный цикл. Команда goto begin возвращает управление на начало командного файла. Для завершения работы этой пакетной программы требуется нажать комбинацию CTRL+C и Y. Проанализируйте пакетный файл, приведенный ниже:

rem It is comment!

echo Please put a new disk into drive A

2.11. Рассмотрим использование параметров командной строки. Создадим файл для копирования содержимого одной папки в другую. Каждый раз, запуская файл, мы можем задавать новые папку-источник и папку-приемник. Например, для копирования содержимого из папки Folder1 в папку Folder2, где параметр %1 заменяется на значение Folder1, а параметр %2 — на значение Folder2. Новый файл будет состоять из одной строки:

xcopy %1\*.* %2

2.12. Если мы сохраним его под именем my3.cmd, то для запуска файла нужно ввести:

my3.cmd C:\folder1 D:\folder2

Результат будет таким же, как и при записи в пакетный файл строки:

xcopy C:\folder1 \*.* D:\folder2

Выполните запуск данного файла, указав реальные параметры, и убедитесь в правильности его работы.

2.13. Рассмотрим использование команд shift, ifи собственные переменные окружения.

В следующем пакетном файле Mycopy.bat показано, как использовать команду shift с произвольным числом пакетных параметров. Файл копирует набор файлов в заданный каталог. Пакетные параметры представлены аргументами имени файла и каталога. Для фиксации значения первого параметра используется собственная переменная todir.

MYCOPY.BAT копирует произвольное число файлов в задаваемый при запуске каталог.Используется следующий синтаксис:mycopy каталог файл1 файл2 .

Создайте следующий пакетный файл:@echo offset todir=%1:getfileshiftif "%1"=="" goto endcopy %1 %todir%goto getfile:endset todir=echo EXIT!

Можно также использовать в команде shift ключ /n, который указывает команде начинать сдвиг с n-го аргумента, где n — число от нуля до восьми. При использовании shift /2 нет необходимости использовать переменную todir. Например:

Команда IF позволяет в зависимости от выполнения некоторых •Условий выполнять или не выполнять команды в командном файле.

IF условие команда

команда – это любая допустимая команда (в том числе GOTO). Эта команда выполняется, если условие в команде IF истинно, в пробивном случае команда игнорируется;

условие – это одно из приведенных ниже выражений:

ERRORLEVEL число – условие истинно тогда, когда код завершения предыдущей выполненной программы больше заданного числа или равен ему (код завершения устанавливается программами при окончании их работы, по умолчанию – этот код равен нулю);

строка1= =строка2 – условие истинно тогда, когда строка1 и строка2 полностью совпадают. Если в этих строках имеются символы %0–%9, то вместо этих символов подставляются параметры командного файла;

EXIST имя-файла – условие истинно тогда, когда указанный файл существует;

NOT условие – истинно тогда, когда указанное условие ложно.

Пример Создадим файл TYP.BAT, который выводит некоторый файл на экран. Формат вызова будет:

Мы будем проверять, задан ли при вызове параметр и существует ли указанный файл. Командный файл TYP.BAT может быть таким (справа в скобках приводятся номера строк файла):

if -%1 == + goto no_param (2)

if not exist %1 goto not exist (3)

echo Должен быть задан параметр (7)

echo Файл %1 не найден (10)

Должен быть задан параметр

и выполнение командного файла прекращается.

Файл . не найден

(. – параметр, заданный в команде TYP), и выполнение командного файла прекращается.

Следует заметить, что при сравнении строк, содержащих символы параметров %0 — %9, следует проявлять осторожность. Например, сравнение второго параметра командного файла со строкой SSS не следует делать так:

Дело в том, что если в командном файле меньше двух параметров, то символы %2 будут замещены пустой строкой, и при выполнении команды возникнет ошибка. Еще опаснее сравнение

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

Оно годится в любом случае.

Написание файла config.Sys

В корневом каталоге диска, с которого загружается операционная система, может находиться файл CONFIG.SYS, задающий параметры операционной системы DOS, а также указывающий, какие програм­мы, расширяющие возможности операционной системы, необходимо загружать в оперативную память (эти программы называются драйверами устройств, хотя они не обязаны управлять работой каких-либо устройств).

Если файл CONFIG.SYS в корневом каталоге диска, с которого за­гружается операционная система, отсутствует, то параметры операци­онной системы будут установлены по умолчанию.

Замечание. При изменении файла CONFIG.SYS соответствующие параметры конфигурации системы изменятся только после перезагрузки DOS.

Файл CONFIG.SYS должен представлять собой текстовый (ASCII) файл. Каждая строка этого файла имеет вид:

имя-команды = значение

Команды файла CONFIG. SYS. Ниже перечисляются наиболее часто используемые команды файла CONFIG.SYS:

Break = on - установить режим проверки нажатия клавиш [Ctrl] [Break] при операциях ввода-вывода с диском. Это позволяет пре­рывать выполнение программ, которые иначе бы выполнялись до своего завершения. Изменить режим проверки нажатия [Ctrl] [Break] можно и впоследствии командами DOS: break on и break off;

Buffers = число-буферов – установка числа буферов для опера­ций ввода-вывода с диском;

Country = 007,866,полное-имя-файла-COUNTRY.SYS – установ­ка удобного формата выдачи информации о дате и времени;

Lastdrive = буква – установка последней буквы, которая может использоваться в качестве имени дисковода в команде SUBST (пример: lastdrive=z);

Files = 20 – установка максимального числа одновременно от­крытых файлов. Многие программы для своего выполнения требуют, чтобы значение параметра FILES было не менее 20. При работе с некоторыми базами данных необходимо большее значение параметра .FILES: 50 или даже 80;

rem комментарий – задание комментариев в файле CONFIG.SYS;

Device = имя-файла-драйвера [параметры] – установка драйвера устройства. Программы-драйверы расширяют возможности DOS. Вот некоторые наиболее полезные драйверы устройств:

ANSI.SYS – расширяет возможности по выводу на экран и позволяет

переопределять значения клавиш на клавиатуре;

DRIVER.SYS – позволяет подсоединять к компьютеру дополнительные

MOUSE.SYS – обеспечивает использование мыши в прикладных про-

SMARTDRV.SYS – позволяет создать кэш диска в расширенной или в до­полнительной памяти;

VDISK.SYS – позволяет создать «электронный диск» в расширенной

или в дополнительной памяти.

Например, если файлы драйверов находятся в каталоге C:\EXE\SYS, то ко­манда device = C:\EXE\SYS\ANSI.SYS установит драйвер ANSI.SYS, расширяю­щий возможности по выводу на экран и позволяющий переопределять значения клавиш на клавиатуре; device = C:\EXE\SYS\VDISK.SYS размер-диска [/Е] – ус­тановит «электронный» диск. Размер диска задается в килобайтах. Параметр /Е указывает, что «электронный» диск должен размещаться в расширенной памяти процессора Intel-80286 или 80386 (сверх 640 Кбайт).

Install = полное-имя-программы [параметры] — установка рези­дентной программы. Этот способ экономит оперативную память, так как при его использовании для запускаемой программы не резерви­руется место для хранения переменных окружения. В связи с этим не все программы могут быть установлены с помощью команды Install.

На компьютерах на основе процессоров Intel-80386, 486 или Pentium имеются и еще более эффективные способы загрузки программ — с помощью команды LoadHigh файла AUTOEXEC.BAT.

Возможности DOS 5.0 и 6. 0. При использовании компьютеров на основе Intel-80286 или более старших моделей, оснащенных не менее чем 1 Мбайтом оперативной памяти, Вы можете с помощью MS DOS 5.0 или 6.0 перенести большую часть программ DOS из обычной памяти в первые 64 Кбайта расширенной памяти, освободив тем са­мым 30-40 Кбайт обычной памяти для прикладных программ. Для этого надо включить в файл CONFIG.SYS следующие строки:

(мы предполагаем, что драйвер HIMEM.SYS находится в каталоге C:\EXE\MSDOS). В системе DR DOS вместо HIMEM надо использо­вать драйвер HIDOS.

Замечание. Возможность перемещения DOS в первые 64 Кбайта расширен­ной памяти, как это ни странно, возникла из-за ошибки при создании процессора Intel-80286. Как известно, в микропроцессоре Intel-8088 адреса ячеек памяти за­даются с помощью двух двухбайтных чисел – сегмента и смещения по формуле: сегмент х 16+смещение. При этом, если полученный адрес оказывался большим 1 Мбайта, то «лишний» мегабайт игнорировался — происходило обращение к на­чалу (первым 64 Кбайтам) оперативной памяти. А при реализации обычного (не защищенного) режима работы Intel-80286 последняя особенность в нем не была учтена, в результате чего оказалось возможным в обычном режиме процессора (в котором работает DOS) обращаться к первым 64 Кбайтам (точнее, к 65520 байтам) за пределами первого мегабайта адресов памяти. Сначала эта ошибка рассматрива­лась как курьез, а потом было осознано, что из нее можно извлечь немалую пользу.

На компьютерах с процессором Intel--80386 или более старшим Вы можете перенести из обычной памяти не только DOS, но и драй­веры устройств и резидентные программы. Для того чтобы получить такую возможность, надо включить в файл CONFIG.SYS следующие строки:

Здесь мы опять предполагаем, что драйверы HIMEM.SYS и EMM386.EXE находятся в каталоге C:\EXE\MSDOS. После этого Вы можете использовать для размещения программ и драйверов в «верхней» памяти: для драйверов – команду DEVICEHIGH файла CONFIG.SYS; для программ – команду LOADHIGH или LH коман­дного процессора DOS.

При выполнении этих команд DOS делает попытку загрузить драйвер или программу в «верхнюю» память (в диапазон адресов от 640 Кбайт до 1 Мбайта), а если это не удается, загружает их в обыч­ную память.

Примеры:

(в файле CONFIG.SYS)

LOADHIGH C:\EXE\SMADTDRV.EXE 2048 1024

(в файле AUTOEXEC.BAT)

Замечания: 1. Перенос программ из обычной памяти оказался возможен по­тому, что 80386 и последующие процессоры имеют функции управления памятью, отсутствовавшие в более ранних процессорах. Для этого с помощью специального драйвера (типа EMM386.EXE) процессор изменяет адреса блоков расширенной па­мяти, логически «перемещая» их в первый мегабайт, доступный в обычном ре­жиме процессора, и размещает там указанные программы или драйверы.

Команду DEVICEHIGH, естественно, можно использовать в файле CONFIG.SYS только после строки DOS=HIGH,UMB.

Если Вы хотите «превратить» часть расширенной (extended) памяти в Вашем компьютере в дополнительную (expanded), замените параметр NOEMS в команде запуска драйвера EMM386.EXE на количество «превращаемой» памяти в килобайтах. В этом случае Вы можете также использовать параметр FRAME=adpec для задания в шестнадцатеричном виде адреса сегмента «окна» дополнительной памяти (например, FRAME=EOOO).

В некоторых компьютерах процессор не должен использовать отдельные адреса оперативной памяти в диапазоне от 640 Кбайт до 1 Мбайта для размещения программ или отображения в дополнительную память, поскольку это вызывает конфликты с контроллерами устройств или с программами. В таких случаях надо использовать параметр Х=диапазон-адресов драйвера EMM386. Например, чтобы указать драйверу EMM386 не использовать 64 Кбайта, начиная с адреса C000h:0, надо указать параметр X=COOO-CFFF.

NOT - Указывает, что Windows должна выполнить эту команду, только если условие является ложным.

ERRORLEVEL число - Условие является истинным, если код возврата последней выполненной программы не меньше указанного числа.

строка1==строка2 - Условие является истинным, если указанные строки совпадают.

EXIST имя_файла - Условие является истинным, если файл с указанным именем существует.

команда - Задает команду, выполняемую при истинности условия. За этой командой может следовать ключевое слово ELSE. В случае, если указанное условие ложно, будет выполнена команда, находящаяся после слова ELSE.

Предложение ELSE должно располагаться в той же строке, что и команда, следующая за ключевым словом IF. Например:

IF EXIST имя_файла. (
del имя_файла.
) ELSE (
echo имя_файла. missing.
)

Следующий пример содержит ОШИБКУ, поскольку команда del должна заканчиваться переходом на новую строку:

IF EXIST имя_файла. del имя_файла. ELSE echo имя_файла. Missing

Следующий пример также содержит ОШИБКУ, поскольку команда ELSE должна располагаться в той же строке, что и команда, следующая за IF:

IF EXIST имя_файла. del имя_файла.
ELSE echo имя_файла. missing
Вот правильный пример, где все команды расположены в одной строке:

IF EXIST имя_файла. (del имя_файла.) ELSE echo имя_файла. Missing

Изменение команды IF при включении расширенной обработки команд:

IF [/I] строка1 оператор_сравнения строка2 команда
IF CMDEXTVERSION число команда
IF DEFINED переменная команда

где оператор_сравнения принимает следующие значения:

EQU - равно
NEQ - не равно
LSS - меньше
LEQ - меньше или равно
GTR - больше
GEQ - больше или равно,

а ключ /I , если он указан, задает сравнение текстовых строк без учета регистра. Ключ /I можно также использовать и в форме строка1==строка2 команды IF. Сравнения проводятся по общему типу данных, так что если строки 1 и 2 содержат только цифры, то обе строки преобразуются в числа, после чего выполняется сравнение чисел.

Условие CMDEXTVERSION применяется подобно условию ERRORLEVEL, но значение сравнивается с внутренним номером версии текущей реализации расширенной обработки команд. Первая версия имеет номер 1. Номер версии будет увеличиваться на единицу при каждом добавлении существенных возможностей расширенной обработки команд. Если расширенная обработка команд отключена, условие CMDEXTVERSION никогда не бывает истинно.

Условие DEFINED применяется подобно условию EXIST , но принимает в качестве аргумента имя переменной среды и возвращает истинное значение, если эта переменная определена.

Строка %ERRORLEVEL% будет развернута в строковое представление текущего значения кода ошибки ERRORLEVEL, за исключением ситуации, когда уже имеется переменная среды с именем ERRORLEVEL; в подобном случае подставляется значение этой переменной. Например, с помощью данной строки можно выполнить следующее:

goto answer%ERRORLEVEL%
:answer0
echo Получен код возврата 0
:answer1
echo Получен код возврата 1

Допускается и применение описанных выше операторов числового сравнения:

IF %ERRORLEVEL% LEQ 1 goto okay

Строка %CMDCMDLINE% будет развернута в исходную командную строку, переданную CMD.EXE до любой обработки, за исключением ситуации, когда уже определена переменная среды с именем CMDCMDLINE; в подобном случае подставляется значение этой переменной.

Строка %CMDEXTVERSION% будет развернута в строку, представляющую собой текущее значение CMDEXTVERSION, за исключением ситуации, когда уже имеется переменная среды с именем CMDEXTVERSION; в подобном случае подставляется значение этой переменной.


@echo off
REM Проверить наличие имени файла, задаваемого в качестве параметра %1
REM Если параметр %1 пустой – переход на метку error
if "%1" EQU "" goto error
REM Если параметр задан, создаем пустой файл, копированием из устройства nul
copy nul "%1"
exit
:error
ECHO File name required ! Must be - %

n0 filename.ext
:exit

Примеры вывода для отвечающего и не отвечающего узлов:

Ответ от 192.168.1.1: число байт=32 время=1мс TTL=64 - если устройство с данным IP-адресом доступно;
Превышен интервал ожидания для запроса. - если устройство не отвечает;

Команда find /I "TTL" возвращает код ERRORLEVEL равный 0 , если строка "TTL" присутствует в результате выполнения ping . Ключ /I имеет смысл использовать, чтобы результат не зависил от того, строчные или заглавные символы составляют строку "ttl".
Результат работы командного файла записывается в текстовый файл iplist.txt

@ECHO OFF
REM Постоянная часть IP-адреса
set IPTMP=192.168.1.
REM Количество пингуемых узлов
set N=254
rem С какого адреса начать - начальное значение " хвоста " IP- адреса X.X.X.IPMIN
set /A IPMIN=1
ECHO %DATE% Опрос пингом %N% адресов начиная с %IPTMP%%IPMIN% >> iplist.txt
rem M0 - метка для организации цикла
:M0
rem Переменная IPFULL - полное значение текущего IP-адреса
set IPFULL=%IPTMP%%IPMIN%
rem Если " хвост "больше N – перейти к завершению работы
IF %IPMIN% GTR %N% GOTO ENDJOB
ping -n 1 %IPFULL% | find /I "TTL"
if %ERRORLEVEL%==0 Echo %IPFULL% >> iplist.txt
rem Сформируем следующий IP-адрес
set /A IPMIN=%IPMIN% + 1
rem Перейдем на выполнение следующего шага
GOTO M0
rem Завершение работы
:endjob
exit

Существуют некоторые особенности реализации командного интерпретатора CMD.EXE , которые необходимо учитывать при обработке значений переменных внутри циклов IF и FOR . Использование значений переменных внутри скобок, требует изменения стандартного режима интерпретации командного процессора. Разработчиками предусмотрена возможность запуска CMD.EXE с параметром /V:ON , что включает разрешение отложенного расширения переменных среды с применением символа восклицательного знака ( ! ) в качестве разделителя. То есть, параметр /V:ON разрешает использовать !var! в качестве значения переменной var во время выполнения внутри циклов команд FOR и IF . Но на практике чаще используется возможность локального включения данного режима внутри командного файла специальной директивой:

После чего, можно обрабатывать принимаемые переменными значения внутри цикла, используя вместо знаков процента восклицательные знаки:

FOR … (
IF !ERRORLEVEL!==0 вместо %ERRORLEVEL%==0

)

    В русскоязычной справке команды IF имеется ошибка, которая много лет переходит из версии в версию - вместо оператора EQU - равно , указано EQL - равно

Обработка условий в пакетных программах.

Синтаксис

if [not] errorlevel число команда [ else выражение]

if [not] строка1==строка2 команда [ else выражение]

if [not] exist имя_файла команда [ else выражение]

Если расширения командного процессора разрешены, следует использовать следующий синтаксис:

if [/i] строка1 оп_сравнения строка2 команда [else выражение]

if cmdextversion число команда [else выражение]

if defined переменная команда [else выражение]

Параметры

not Задает выполнение команды только в случае невыполнения условия. errorlevel число Условие выполняется, если предыдущая команда, обработанная интерпретатором команд Cmd.exe, завершилась с кодом, равным или большим числа. команда Команда, которая должна быть обработана в случае выполнения условия. строка1==строка2 Условие выполняется, если строки строка1 и строка2 совпадают. Строки могут быть заданы явно или могут быть пакетными переменными (например, %1). Явно заданные строки нет необходимости заключать в кавычки. exist имя_файла Условие выполняется, если существует файл с именем имя_файла. оп_сравнения Трехзначный оператор сравнения. В следующей таблице перечислены допустимые значения оп_сравнения.
Оператор Описание
EQU равно
NEQ не равно
LSS меньше
LEQ меньше или равно
GTR больше
GEQ больше или равно
/i Сравнение строк без учета регистра знаков. Параметр /i можно использовать в конструкции string1==string2 команды if. Эти сравнения являются общими. Если и строка1, и строка2 состоят из цифр, строки преобразовываются в числа и выполняется сравнение чисел. cmdextversion число Условие выполняется, только если номер внутренней версии, связанный с расширениями командного процессора Cmd.exe, равен или больше числа. первая версия имела номер 1. Номер версии увеличивается на 1 при внесении в расширения командного процессора значительных изменений. Условие с cmdextversion не выполняется, если расширения командного процессора запрещены (по умолчанию они разрешены). defined переменная Условие выполняется, если переменная определена. выражение Команда и все ее параметры для обработке в командной строке при выполнении оператора else. /? Отображение справки в командной строке.

Заметки

  • Если условие, заданное в команде if, выполняется, будет выполнена команда, следующая за условием. Если условие не выполняется, команда, заданная в операторе if, пропускается, а управление переходит к команде оператора else, если она задана.
  • Когда программа завершается, она возвращает код завершения. С помощью параметра errorlevel коды завершения можно использовать в качестве условий.
  • Использование команды definedпеременная

При использовании команды defined переменная добавляются следующие три переменные: %errorlevel%, %cmdcmdline% и %cmdextversion%.

%errorlevel% замещается строковым представлением текущего значения errorlevel, если только уже не существует переменная среды с именем ERRORLEVEL. В этом случае будет использовано ее значение. В следующем примере показано использование значения errorlevel после выполнения пакетной программы:

goto answer%errorlevel%
:answer0
echo Код возврата программы равен 0
:answer1
echo Код возврата программы равен 1
goto end
:end
echo Готово!

Операторы сравнения оп_сравнения также можно использовать следующим образом:

%cmdcmdline% замещается исходной командной строкой, переданной Cmd.exe, до ее обработки в Cmd.exe, если только уже не существует переменная среды с именем cmdcmdline. В этом случае будет использовано значение cmdcmdline.

%cmdextversion% замещается строковым представлением текущего значения cmdextversion, если только уже не существует переменная среды с именем CMDEXTVERSION. В этом случае будет использовано ее значение.

Оператор else должен размещаться в той же строке, что и команда if. Пример:

Приведенный ниже пример не будет работать, поскольку команда del должна заканчиваться новой строкой:

IF EXIST имя_файла. del имя_файла. ELSE echo имя_файла. отсутствует

Приведенный ниже пример не будет работать, поскольку команда else должна находиться в той же строке, что и команда if:

Если необходимо разместить всю инструкцию в одной строке, можно использовать следующую правильную форму исходной инструкции:

IF EXIST имя_файла (del имя_файла) ELSE echo имя_файла отсутствует

Примеры

if not exist product.dat echo Не найден файл данных

:begin
@echo off
format a: /s
if not errorlevel 1 goto end
echo Ошибка при форматировании.
:end
echo Конец пакетной программы.

Команда if не может быть использована непосредственно для проверки существования каталога, но в каждом каталоге существует устройство (NUL). Следовательно, существование каталога может быть проверено, как показано ниже. В следующем примере проверяется наличие каталога:

if exist c:mydir\nul goto process

Для вопросов, обсуждений, замечаний, предложений и т. п. можете использовать раздел форума этого сайта (требуется регистрация).

Новый раздел о средствах командной строки в рамках этого же проекта расположен здесь

Читайте также: