ТОП 10:

Echo Ошибка выполнения стороннего скрипта exit /b 1)



 

 

Отметим также, что сравнение проводится по общему типу данных, так что если обе сравниваемые строки содержат только цифры, то обе строки пре-образуются в числа, после чего выполняется сравнение этих чисел.

 

if %FileSize% LEQ 1000000 (…) else (…)

 

Если в команде if используется конструкция else, то она обязательно должна располагаться в той же строке, что и if.

 

Поставить выполнение или невыполнение некоторого фрагмента кода в за-висимость от существования некоторой переменной может команда:

 

if defined переменная команда [else команда]

 

Здесь условие defined принимает в качестве аргумента имя переменной среды и возвращает истинное значение, если эта переменная определена:

 

@ECHO OFF

 

IF not defined FolderName set FolderName=d:\tmp xcopy /y /c *.log %FolderName%

 

Аналогично для проверки существования файла на диске используется ко-

 

манда

 

if [not] exist имя_файла команда [else команда]

 

Пример использования команды:

 

if not exist %1 goto NoSuchFile

 

rem Вывод содержимого файла на экран echo Содержимое файла '%1'

 

type %1 goto :EOF


 


:NoSuchFile

 

rem Файл не найден. Выводим сообщение и создаем пустой файл echo Файл '%1' не найден.

 

copy nul %1

 

Наконец, последний вариант условной команды:

 

if cmdextversion число команда [else команда]

 

ставит выполнение команды в зависимость от внутреннего номера версии теку-щей реализации расширенной обработки команд Номер версии будет увеличи-ваться на единицу при каждом добавлении существенных возможностей расши-ренной обработки команд. Таким образом можно адаптировать работу командно-го файла к возможностям установленной на компьютере командной оболочки. Если расширенная обработка команд отключена, условие cmdextversion не будет истинно.

 

Организация циклов в командных файлах

 

Циклическое повторение некоторого фрагмента командного файла можно организовать с использованием пары команд if и goto. Но гораздо эффективнее использовать для этих целей команду for. Команда for обеспечивает выполнение заданной команды (группы команд) для всех элементов некоторого множества (например, для всех файлов в папке). Обобщенный синтаксис команды for:

 

for {%переменная|%%переменная} in (множество) do команда [Параметры]

 

Чтобы скопировать содержимое всех файлов, имеющих разрешение .log или

 

.txt в текущем каталоге в один файл all.txt с помощью заменяемой переменной %%F,можно использовать следующую команду:

 

for %%f in (*.log *.txt) do type %%f >>all.txt

 

В приведенном примере каждый файл с расширением .log или .txt в теку-щем каталоге будет подставляться вместо переменной %%F, пока не будут обра-ботаны все файлы с таким расширением. Чтобы использовать данную команду непосредственно в командной строке, а не в командном файле, следует заменить все вхождения %%F на %F. В противном случае переменная игнорируется, и ото-бражается сообщение об ошибке.

 

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

 

for %%f in (help work out bin “my files”) do md %%f

 

Существуют дополнительные синтаксические конструкции использования команды for. Одна из них реализуется, если указать в команде for ключ /D:

 

for /D %переменная in (набор) do команда [параметры]

 

 


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

 

for /D %%f in (d:\work\h*.*) do attrib +h %%f.

 

мы установим атрибут «Скрытый» для всех папок, начинающихся с символа h, в

 

папке d:\work.

С помощью ключа /R можно задать рекурсию в команде for:

 

for /R [[диск:] путь] %переменная in (набор) do

 

команда[параметры]

 

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

 

for /R d:\ %%f in (.) do echo %%f

 

Для формирования списка всех файлов с расширением doc в заданном ката-логе и всех его подкаталогах можно использовать следующую команду в пакет-ном файле:

 

for /R d:\docs %%f in (*.doc) do echo %%f >> docfiles.lst

 

Ключ /L позволяет реализовать с помощью команды for арифметический цикл, когда переменная цикла получает ряд целочисленных значений:

 

for /L {%% | %}переменная in (НачальноеЗначение#, шаг#, КонечноеЗначение#) do команда [Параметры]

 

Цикл выполняет команду для каждого значения переменной цикла. Пере-менная цикла первоначально принимает значение НачальноеЗначение# и далее на каждом шаге изменяется на величину шаг#. Когда переменная итерации превысит параметр КонечноеЗначение#, командная оболочка покидает цикл. Также можно использовать отрицательный параметр для перемещения в диапазоне убывающих значений. Например, (1,1,4) создает последовательность «1 2 3 4», а (5,-2,1) созда-ет последовательность «5 3 1».

 

Например, в результате выполнения следующего фрагмента командного файла в файл testconnect.log будет помещен результат проверки доступности ком-пьютеров с адресами в диапазоне 192.168.0.(1-254). Цикл обеспечивает перебор последней цифры адреса.

 

echo %date% %time%>>testconnect.log

FOR /L %%f IN (1,1,254) DO (ping -n 3 192.168.0.%%f

 

if errorlevel 1 echo Компьютер 192.168.0.%%f не отвечает >>

 

Testconnect.log)

 

Числа, помещаемые в переменную цикла for /L, можно использовать в арифметических вычислениях. Рассмотрим командный файл my.bat следующего содержания:

 

@echo off


 


cls    
set /A Sum=0  
for /L %%f in (1,1,5) do set /a Sum=Sum+%%f
echo Sum=%Sum%  

 

В результате выполнения этого командного файла будет вычислена сумма чисел от 1 до 5 и на экране будет выведен результат в виде:

 

Sum=15

 

Использование команды for с ключом /f предоставляет возможности раз-бора содержимого текстовых файлов. Обобщенный синтаксис команды в этом случае:

for /F ["ключи"] %переменная in (набор) do команда [параметры]

 

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

 

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

 

По умолчанию ключ /F выделяет из каждой строки файла первое слово, очищенное от окружающих его пробелов, причем пустые строки в файле пропус-каются. Ключи задаются в виде заключенной в кавычки строки, их перечень и описание приведены в таблице 9.

 

 

    Таблица 9. Ключи разбора строк в команде for /f
Ключ   Описание
EOL=C Определение символа комментариев в начале строки (допус-
  кается задание только одного символа)
SKIP=N Число пропускаемых при обработке строк в начале файла
DELIMS=XXX Определение набора разделителей для замены заданных по
  умолчанию пробела и знака табуляции
TOKENS=X,Y,M- Определение номеров подстрок, выделяемых из каждой
N строки файла и передаваемых для выполнения в тело цикла
     

 

Ключ EOL позволяет определить символ, наличие которого в начале строки идентифицирует строку как комментарий, исключая ее из разбора.

 

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

 

Ключ DELIMS позволяет определить, какие символы будут воспринимать-ся командой for в качестве разделителей логических подстрок-элементов разбора.

 

Ключ TOKENS задает элементы, передаваемые из каждой строки в тело цикла for при каждой итерации. Для каждого элемента создаются дополнитель-


 


ные имена переменных. Форма M-N задает диапазон, указывающий элементы с M-го по N-ый. Если последним символом строки tokens= является звездочка (*), то размещается дополнительная переменная, в которую помещается остаток строки после разбора последнего элемента.

 

Разберем использование этой команды на примере пакетного файла par-ser.bat, который производит разбор файла со списком запущенных процессов, по-лученных командой tasklist:

 

@ECHO OFF tasklist>list.txt

 

FOR /F "TOKENS=1,3,4-6 SKIP=3" %%i IN (list.txt) DO echo %%i %%l

 

При выводе информации о запущенных процессах учитываем, что команда tasklist без параметров выводит информацию в виде:

 

Имя образа PID Имя сессии № сеанса Память
========================= ====== ================ ======== ============
System Console КБ
smss.exe Console КБ
csrss.exe Console 2 540 КБ
winlogon.exe Console 6 748 КБ
services.exe Console 3 832 КБ
lsass.exe Console 7 076 КБ
svchost.exe Console 5 828 КБ
svchost.exe Console 5 224 КБ
svchost.exe Console 25 668 КБ
svchost.exe Console 4 876 КБ
svchost.exe Console 6 744 КБ
         

 

Заносим этот список в файл list.txt, а затем обрабатываем его построчно. Для каждой строки, кроме первых 3 (skip=3), выделяем 5 строк. В %%i заносятся имена процессов, %%j – имя сессии, %%k, %%l, %%m – данные из 3 осталь-ных столбцов (сразу отмечаем, что допускается всего 26 переменных для разбора по числу символов в латинском алфавите). В рассмотренном примере просто вы-водим на экран имена процессов и объем используемой ими памяти.

 

Результат вывода команды tasklist необязательно предварительно заносить в файл. В скобках, задающих обрабатываемый набор строк, можно в апострофах непосредственно указать команду, вывод которой будет разбирать команда for. Еще один пример:

 

@ECHO OFF

 







Последнее изменение этой страницы: 2016-08-16; Нарушение авторского права страницы

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.226.243.36 (0.01 с.)