Командным файлам из командной строки могут быть переданы аргументы. Аргументы задаются параметрами командной строки после имени файла. Файл Cmd.exe использует переменные с %0 по %9. При использовании пакетных параметров переменная %0 заменяется на имя пакетного файла, а переменные с %1 по %9 — на соответствующие аргументы, напечатанные в командной строке. Для доступа к переменным больше %9 используется команда shift. Параметр %* ссылается на все аргументы, которые передаются пакетному файлу, за исключением параметра %0.
Команда Shift
Изменяет положения пакетных параметров в пакетных файлах.
Синтаксис
Shift
Параметры отсутствуют
· Использование параметра командной строки shift с расширениями командного процессора
Если расширения командного процессора разрешены (используются по умолчанию), команда shift поддерживает ключ /n, который указывает команде начинать сдвиг с n -го аргумента, где n — число от нуля до восьми. Например:
SHIFT /2
сдвинет %3 на %2, %4 на %3 и т. д. %0 и %1 останутся неизменными.
· Работа команды shift
Команда shift изменяет значения замещаемых параметров %0 - %9 путем копирования каждого параметра в предыдущий. Другими словами, значение %1 копируется в %0, значение %2 — в %1 и т. д. Такой прием оказывается полезным при написании пакетных файлов, выполняющих одну и ту же операцию над любым числом параметров.
· Работа более чем с 10 пакетными параметрами
Команда shift также может быть использована для создания пакетных программ, воспринимающих более 10 параметров. В командной строке такой программы можно задать более 10-ти параметров, при этом все параметры, следующие за десятым (то есть за переменной%9) будут последовательно помещены в эту переменную %9.
· Использование %* с командой shift
Команда shift не влияет на пакетный параметр %*.
· Смещение параметров в обратном направлении
Команды, выполняющей обратный сдвигне существует. После сдвига параметров командой shift начальное значение первого параметра (%0) не может быть восстановлено.
Команда Call
Вызов одного пакетного файла из другого без завершения выполнения первого файла. Команда call принимает метки в качестве объекта вызова. Используемая в командной строке, а не в сценарии или пакетном файле, команда Call игнорируется.
Синтаксис
call [[ диск: ][ путь ] имя_файла [ пакетные_параметры ]] [: метка [ аргументы ]]
Параметры
[ диск: ][ путь ] имя_файла - задает имя и местоположение пакетного файла для запуска. Параметр имя_файла должен иметь расширение.batили.cmd.
пакетные_параметры - задает данные командной строки, используемые программой пакетной обработки, включая параметры командной строки, имена файлов, пакетные параметры (в диапазоне от %0 до %9) или переменные (например %baud%).
: метка - указывает метку, на которую должно быть передано управление программы пакетной обработки. При использовании команды call с этим параметром создается новый контекст пакетного файла, а управление передается инструкции, следующей за указанной меткой. Когда первый раз встречается конец пакетного файла (после перехода на метку), управление возвращается на инструкцию, следующую за инструкцией call. При втором достижении конца файла выполнение пакетной программы прекращается.
аргументы - задает данные командной строки, которые передаются в новый экземпляр программы пакетной обработки, начинающейся с: метки, включая параметры командной строки, имена файлов, пакетные параметры (в диапазоне от %1 до %9) или переменные (например %baud%).
Пример
Для вызова программы Checknew.bat из другого пакетного файла в тексте родительского пакетного файла введите следующую строку:
Callchecknew
Если родительская пакетная программа принимает два пакетных параметра и требуется передать их в файл Checknew.bat, включите следующую команду в родительскую пакетную программу:
callchecknew %1 %2
Команда If
Обработка условий в пакетных программах.
Синтаксис
if [ not ] errorlevel число команда [ else выражение ]
if [ not ] строка1 == строка2 команда [ else выражение ]
if [ not ] exist имя_файла команда [ else выражение ]
Параметры
not - з адает выполнение команды только в случае невыполнения условия.
errorlevel число - условие выполняется, если предыдущая команда, обработанная интерпретатором команд Cmd.exe, завершилась с кодом, равным или большим числа.
команда - команда, которая должна быть обработана в случае выполнения условия.
строка1 == строка2 - условие выполняется, если строки строка1 и строка2 совпадают. Строки могут быть заданы явно или могут быть пакетными переменными (например, %1). Явно заданные строки нет необходимости заключать в кавычки.
exist имя_файла - условие выполняется, если существует файл с именем имя_файла.
оп_сравнения - трехзначный оператор сравнения. В следующей таблице перечислены допустимые значения оп_сравнения.
Оператор | Описание |
EQU | равно |
NEQ | не равно |
LSS | меньше |
LEQ | меньше или равно |
GTR | больше |
GEQ | больше или равно |
Если расширения командного процессора разрешены, следует использовать также следующий синтаксис:
if [ /i ] строка1 оп_сравнения строка2 команда [ else выражение ]
ifcmdextversion число команда [ else выражение ]
ifdefined переменная команда [ 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 после выполнения пакетной программы:
gotoanswer%errorlevel%
:answer0
echo Код возврата программы равен 0
:answer1
echo Код возврата программы равен 1
gotoend
:end
echo Готово!
Операторы сравнения оп_сравнения также можно использовать следующим образом:
if %errorlevel% LEQ 1 gotookay
%cmdcmdline% замещается исходной командной строкой, переданной Cmd.exe, до ее обработки в Cmd.exe, если только уже не существует переменная среды с именем cmdcmdline. В этом случае будет использовано значение cmdcmdline.
%cmdextversion% замещается строковым представлением текущего значения cmdextversion, если только уже не существует переменная среды с именем CMDEXTVERSION. В этом случае будет использовано ее значение.
· Использование оператора else
Оператор else должен размещаться в той же строке, что и команда if.
Если необходимо разместить всю инструкцию в одной строке, можно использовать следующую правильную форму исходной инструкции:
IF EXIST имя_файла. (delимя_файла.) ELSE echoимя_файла. отсутствует
Примеры
Если файл Product.dat не удается найти, появится следующее сообщение:
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.
( множество ) - обязательный параметр. Задает один или несколько файлов, каталогов, диапазон значений или текстовых строк, подлежащих обработке заданной командой. Скобки являются обязательными.
команда - обязательный параметр. Задает команду, которая будет выполнена для каждого файла, каталога диапазона значений или текстовой строки, включенной в указанный параметр ( множество ).
ПараметрыКоманднойСтроки - задает параметры командной строки, которые используются с указанной командой.
· Использование программы for
Команда for может быть использована в пакетном файле или непосредственно из командной строки.
· Использование параметров командной строки пакетного файла
Перечисленные ниже атрибуты применяются к команде for.
· В команде for переменная %% переменная (или %% переменная) будет заменяться текстовой строкой из заданного параметра множество, пока параметр команда не обработает все файлы этого множества.
· Имена параметров переменная команды for учитывают регистр буквы, они являются глобальными и одновременно может быть активно не больше 52 переменных.
· Для обозначения параметра переменная можно использовать любые символы, кроме цифр 0–9, чтобы не было конфликта с параметрами пакетных файлов %0 – %9. Для простых пакетных файлов вполне достаточно обозначений с одним символом, например %%f.
· Задание множества файлов
Параметр множество может представлять группу файлов или несколько групп файлов. Для задания групп файлов можно использовать подстановочные знаки (* и?). Следующие множества файлов являются допустимыми:
(*.doc)
(*.doc *.txt *.me)
(jan*.doc jan*.rpt feb*.doc feb*.rpt)
(ar??1991.*ap??1991.*)
· Когда используется команда for, первое значение в параметре множество заменяет параметр %% переменная (или % переменная), а затем для обработки этого значения выполняется указанная команда. Это продолжается до тех пор, пока не будут обработаны все файлы (или группы файлов), которые соответствуют значению параметра множество.
· Использование ключевых слов in и do
· In и do не являются параметрами, но они требуются для работы команды for. Если какое-то из слов пропущено, на экран будет выведено сообщение об ошибке.
· Использование дополнительных форм команды for
Если расширения командного процессора разрешены (по умолчанию), то поддерживаются следующие дополнительные формы команды for.
· Только каталоги
Если параметр множество содержит подстановочные знаки (* и?), команда, указанная в параметре команда, выполняется для каждого каталога (кроме множества файлов в указанном каталоге), совпадающего с параметром множество. Используется следующий синтаксис.
for /D { %% | % } переменная in ( множество ) do команда [ ПараметрыКоманднойСтроки ]
· Рекурсивная
Проходит по дереву каталогов с корнем в [ диск: ] путь, выполняя инструкцию for для каждого каталога в дереве. Если после ключа /R не задан каталог, предполагается текущий каталог. Если параметр множество задано одной точкой (.), то команда просто перечислит каталоги в дереве. Используется следующий синтаксис.
for /R [[ диск: ] путь ] { %% | % } переменная in ( множество ) do команда [ ПараметрыКоманднойСтроки ]
Дополнительную информацию по команде for можно получить с помощью справки.
ПРАКТИЧЕСКОЕ ЗАДАНИЕ 2
2.1. Запустите консоль командной строки. Перейдите в ваш рабочий каталог и создайте каталог Lab2.
2.2. Создайте пакетный файл, выполнив команду copy или с помощью файлового менеджера (Far, TotalCommander). Имя файла задайте сами, расширение его должно быть .bat или .cmd, например My.bat. Наберите текст пакетного файла, выводящего сообщение из трех строк на экран с пустыми строками до и после него:
echooff
echo.
echo Эта пакетная программа
echo демонстрирует работу
echo команды echo
echo.
2.3. Сохраните файл - нажмите Ctrl+Z.
2.4. Запустите файл на выполнение, набрав в командной строке его имя.
2.5. Рассмотрим использование команд rem, pause, goto и меток. В этом примере все файлы с диска A копируются в текущий каталог. После этого на экран выводится запрос вставить другой диск в дисковод А, затем команда pause приостанавливает работу программы, чтобы пользователь мог сменить диск и нажать любую клавишу для продолжения процесса. Данная пакетная программа работает как бесконечный цикл. Команда gotobegin возвращает управление на начало командного файла. Для завершения работы этой пакетной программы требуется нажать комбинацию CTRL+C и Y. Создайте и выполните пакетный файл, приведенный ниже:
@echo off
rem It is comment!
:begin
copy a:*.*
echo Please put a new disk into drive A
pause
goto begin
2.6. Рассмотрим использование параметров командной строки. Создадим файл для копирования содержимого одной папки в другую. Каждый раз, запуская файл, мы можем задавать новые папку-источник и папку-приемник. Например, для копирования содержимого из папки Folder1 в папку Folder2, где параметр %1 заменяется на значение Folder1, а параметр %2 — на значение Folder2. Новый файл будет состоять из одной строки:
xcopy %1\*.* %2
2.7. Если мы сохраним его под именем my3.cmd, то для запуска файла нужно ввести:
my3.cmd C:\folder1 D:\folder2
Результат будет таким же, как и при записи в пакетный файл строки:
xcopy C:\folder1 \*.* D:\folder2
Выполните запуск данного файла, указав реальные параметры, и убедитесь в правильности его работы.
2.8. Рассмотрим использование команд shift, if и собственные переменные окружения.
В следующем пакетном файле Mycopy.bat показано, как использовать команду shift с произвольным числом пакетных параметров. Файл копирует набор файлов в заданный каталог. Пакетные параметры представлены аргументами имени файла и каталога. Для фиксации значения первого параметра используется собственная переменная todir.
MYCOPY.BAT копирует произвольное число файлов в задаваемый при запуске каталог.Используется следующий синтаксис:mycopy каталог файл1 файл2...
Создайте следующий пакетный файл:@echooffsettodir=%1:getfileshiftif "%1"=="" gotoendcopy %1 %todir%gotogetfile:endsettodir=echo EXIT!
Можно также использовать в команде shift ключ /n, который указывает команде начинать сдвиг с n-го аргумента, где n — число от нуля до восьми. При использовании shift /2 нет необходимости использовать переменную todir. Например:
2.10. Рассмотрим один из вариантов использования команды for. Чтобы отобразить на экране содержимое всех файлов, имеющих разрешение.bat или.cmd в текущем каталоге, создадим следующий файл:
echo on
for %%f in (*.cmd *.bat) do type %%f
pause
В предыдущем примере каждый файл с расширением.cmd или.bat в текущем каталоге будет подставляться вместо переменной %%f, пока не будет выведено содержимое всех файлов.
2.11. Разработайте собственный пакетный файл. Номер варианта задает преподаватель. – только 4 курс.
Таблица №1 вариантов для разработки пакетных файлов.
№ варианта | Задание |
1. | Написать пакетный файл, который будет проверять в каталогах, указанных в качестве параметров, наличие файлов с расширением.TMP и удалять их. Если пути поиска не заданы, вывести сообщение. Создать протокол удаляемых файлов. |
2. | Написать пакетный файл, который будет копировать из текущего каталога все файлы с расширением.DRV, кроме одного файла, указанного в качестве второго параметра командной строки, в каталог, указанный первым параметром. Если имя каталога, в который должно производиться копирование, не задано, то вывести сообщение об этом и прервать выполнение файла. |
3. | Написать пакетный файл, который будет проверять наличие в указанном в качестве первого параметра каталоге файлов. Если файлы там есть, копировать их в указанные в качестве остальных параметров каталоги. Если копирование прошло успешно, очистить исходный каталог. Проверять наличие параметров в командной строке, выводить сообщения об ошибках. |
4. | Написать пакетный файл, который будет копировать из текущего каталога все файлы с расширением.txt, кроме одного файла, указанного в качестве первого параметра командной строки, в каталог, указанный вторым параметром. Переписывать только те файлы, которые новее одноименных в каталоге-приемнике. Если произошла ошибка копирования, выдать сообщение и прервать выполнение файла. |
5. | Создать пакетный файл, который выводил бы содержимое каталогов, указанных в качестве параметров командной строки в файл протокола, находящийся в каталоге, заданном качестве первого параметра. Проверять наличие параметров в командной строке, выводить сообщения об ошибках. |
6. | Написать пакетный файл, который будет копировать из текущего каталога все файлы с расширением.DRV в заданные в качестве параметров каталоги. Не прерывать копирования в случае ошибки. Записывать в файл logcopy.txt имя каждого копируемого файла и результат выполнения операции для него. Файл logcopy.txt должен быть примерно таким: OK: а.txt Error: b.txt OK: с.txt |
7. | Написать пакетный файл, который будет осуществлять поиск файла, заданного в качестве первого параметра в каталогах, заданных в качестве остальных параметров. Вести протокол поиска, записывая, в каких каталогах обнаружен файл. Файл протокола сделать скрытым. Если файл обнаружен хотя бы раз, вывести сообщение на экран. |
2.12. Протестировать разработанный командный файл при различных исходных данных: без параметров, при некорректно заданных параметрах, при различном количестве параметров. В отчете представить варианты тестирования и результаты выполнения.
Атрибуты файлов
Атрибуты файлов – это специальные системные метаданные, которые описывают свойства конкретного файла или целой папки. Часто под атрибутами подразумевают также некоторые дополнительные параметры, вроде, даты создания файла, или специализированную метаинформацию о конкретных типах данных (например, EXIF для изображений или ID3-теги для музыки).
Обычно мы не обращаем внимания на атрибуты файлов, однако, рано или поздно может возникнуть ситуация, когда у нас не получится внести изменения в открытый текстовый файл или файлы вовсе исчезнут с флешки или жёсткого диска! А, возможно, возникнет необходимость, например, изменить дату создания снимка...
Общие атрибуты файлов
Всего в Windows исторически сложилось 4 основных атрибута, которыми могут обладать любые файлы и частично папки:
"Только для чтения" (read-only) – R. Используется обычно для запрета правки текстовых файлов. Из нетрадиционных способов использования можно назвать защиту флешки от записи (в корне создаётся папка только для чтения), но вирусы могут обходить такую защиту.
"Архивный" (archived) – A. Нужен в основном только программам для создания бэкапов, чтобы распознавать, какие файлы уже включены в резервную копию, а какие изменились и подлежат замене.
"Системный" (system) – S. Данным атрибутом обычно помечаются системные файлы, которые нежелательно трогать пользователю. Исходя из этого, в Проводнике такие файлы не отображаются, если не отключена опция "Скрывать защищённые системные файлы" во вкладке "Вид" в разделе "Параметры папок".
"Скрытый" (hidden) – H. Позволяет скрывать любые файлы и папки без необходимости помечать их как системные. Аналогично предыдущему атрибуту, препятствует отображению в Проводнике, если не включена настройка "Показывать скрытые файлы, папки и диски".
Кроме того, в последних версиях Windows появился ещё ряд атрибутов, которые обычно не нуждаются в изменении, но о которых стоит знать:
"сжатый" (C);
"зашифрованный" (E);
"индексированный" (I);
"временный" (T);
атрибут целостности (V);
"без очистки" (X).
Часть из этих атрибутов можно увидеть в Свойствах файла, а часть доступна только самой файловой системе и нигде не отображается:
Атрибуты файла в Свойствах
Также к атрибутам иногда причисляют временную метку файла, которая включает в себя три даты: создания, изменения и первого открытия. В системе обычно отображается только дата изменения, но остальные метки времени можно увидеть всё в тех же Свойствах:
Метки времени
Очевидно, что изменить дату создания файла без сторонних программ нельзя, а для корректировки даты изменения достаточно внести в файл какие-либо правки. Дата сменится автоматически.
Просмотр и правка атрибутов
О том, для чего нужны атрибуты файлов, как их можно смотреть и править штатными средствами системы мы уже выяснили. Здесь же хотелось бы рассмотреть способы взаимодействия с ними посредством сторонних программ.
Как уже говорилось выше, довольно удобно работать с атрибутами в визуальном режиме при помощи файловых менеджеров.
Например, в популярном TotalCommander, чтобы включить отображение скрытых файлов и папок нужно зайти в меню "Вид" – "Расширенные настройки" и внизу активировать опцию "Показывать скрытые/системные файлы: вкл/выкл". Теперь, когда всё видно, выделяем файлы, с которых нужно снять атрибуты, идём в меню "Файлы" и жмём пункт "Изменить атрибуты":
Атрибуты файлов в TotalCommander
Откроется довольно симпатичное окошко, где в визуальном режиме Вы сможете не только применить все параметры стандартной команды ATTRIB, но и сменить метку времени изменения файла (к сожалению, метку создания без специальных плагинов не сменишь).
Аналогичное окошко есть и у другого популярного файлового менеджера FreeCommander. Здесь для включения отображения скрытых файлов также нужно пройти в меню "Вид", а оттуда в подменю "Показать", где и отметить все пункты. Правка же атрибутов в этом файловом менеджере также находится в меню "Файл" и называется "Атрибуты/метка времени":
Атрибуты файлов в FreeCommander
Встроенный во FreeCommander инструмент правки атрибутов по функционалу даже превосходит аналог в TotalCommander. Во-первых, он поддерживает дополнительные атрибуты сжатия. Во-вторых, позволяет выбирать файлы, которые нужно править, по маске. А в-третьих, позволяет менять все метки времени!
Темы докладов к семинару № 3: