Практическая ОС. Практическая работа №9. Создание командных файлов в Windows
Скачать 31.54 Kb.
|
|
@echo off | отключение вывода самих команд | |
color 70 | эта команда посто меняет цвет фона и шрифта в консоли | |
здесь начинается цикл | | |
:try | указатель для перехода | |
set tt=%time:-2% | Определяем переменную вснутри цикла. Ей присваивается 2 последних цифры от вывода значения системной переменной time Если вы попробуете ввести эту команду в консоли, то увидите, что выводится строка в 11-ть символов. 2 последних - сотые доли секунды | |
start %SystemRoot%\System32\calc.exe | команда запуска куркулятора | |
echo %tt% | для демонстрации выводится значение переменной | |
if not %tt%==15 goto try else echo Вам повезло! Запуск пришелся на 150-ю милисекунду | | |
Если значение переменной tt будет присвоено в 150-ю милисекунду (15 сотых секунды) то на долю секунды появится надпись, приведенная после слова echo и окно консоли исчезнет прежде, чем кто бы то нибыло успеет прочесть что там было написано. Если же условие %tt%==15 (если кто не догадался это 2 знака равно) не выполняется то осуществляется переход к указателю try и переменная снова переопределяется, после чего запускается новая копия калькулятора. | | |
Exit | |
Первый джентльменский набор: if - esle. Если вы удосужитесь просмотреть справку по команде if (а ведь именно этот условный оператор является здесь ведущим) то увидите всё, что может понадобиться. Для ленивых - коротко и ясно:
if условие команда | условие - сравнение переменных или строк. Используются символы: == (ql) - равно (для неравенства добавляется not) < (ss) - меньше > (tr) - больше команда - действие, выполняемое в случае удовлетворения условий |
if условие осн.команда else альт.команда | осн.команда - действие, выполняемое в случае удовлетворения условий альт.команда - действие, выполняемое в случае неудовлетворения условий |
if [not] exist строка_адреса команда | проверка существования (несуществования) файла или каталога, указываемого в строке адреса и исполнение команды в случае положительного результата проверки. Здесь, так-же возможно использование оператора else. |
Остальные возможности оператора if оставлю за кадром в связи с тем, что не смог найти причин их использовать, а потому сомневаюсь в их потенциальной полезности. (Интересной может быть команда типа: if defined строка ...) Для страстно желающих знания: if /?.
Условный оператор if целесообазно использовать вместе с оператором пеехода goto. Переход осуществляется к заранее расставленым "закладкам". Делается это, как видно из примера, очень просто. А именно - в нужном месте сценария, на отдельной строке записывается имя для точки перехода, начинающееся с двоеточия. За оператором goto указывается только имя "закладки" (без двоеточия) и всё!
Для укрепления знаний можете разобраться в этом, на мой взгляд чрезвычайно полезном, командном файле.
Сообщение параметра коммандному файлу.
Работа с параметрами, сообщёнными вашей "программе", осуществляется почти также как с любыми переменными, определёнными указанным ранее способом.
Отличия, которые следует учитывать:
их имена постоянны (первый параметр обозначается цифрой 1, второй соответственно 2 и тд.)
при использовании значения пераметра, знак "%" ставится только перед цифрой (числом).
Для понимания вот пример.
@echo off
echo.
echo Подчищаемc диск C
echo.
echo чистим от временных файлов (c:\temp удалим весь)...
if not exist c:\Temp goto step1-1
rmdir /s /q c:\Temp\
echo.
echo делаем C:\Temp заново...
mkdir c:\Temp
:step1-1
rem шаг для тех, у кого не изменен адрес временного каталога
rem или мусор сохранился в старом.
if not exist "%userprofile%\local Settings\Temp\" goto step2
rmdir /s /q "%userprofile%\local Settings\Temp\"
echo.
echo делаем Temp заново...
mkdir "%userprofile%\local Settings\Temp"
:step2
echo.
echo уничтожаем кэш драйверов...
if not exist %SystemRoot%\Driver1\i386\*.* goto step3
del %SystemRoot%\Driver1\i386\*.* /s /q
:step3
echo.
echo удаляем запаску дров для модемов (надеюсь что он у вас установлен:-)
if not exist %SystemRoot%\inf\mdm*.* goto step4
del %SystemRoot%\inf\mdm*.* /s /q
:step4
echo.
echo меняем размер кэша дров...
sfc /cachesize=2
echo.
echo чистим оный...
if not exist %SystemRoot%\system32\dllcache\*.* goto step5
del %SystemRoot%\system32\dllcache\*.* /s /q
echo runing DustBuster...
if not exist C:\"Program Files"\DustBu1\dustbu1.exe goto anfol
start C:\"Program Files"\DustBu1\dustbu1.exe
goto end
:anfol
if not exist "c:\programs\DustBu1\dustbu1.exe" goto
start C:\Programs\DustBu1\dustbu1.exe
:ends
exit
:nofile
echo ОШИБОЧКА... нет проги Dustbuster!
echo Press Any key чтобы ее поставить...
pause>nul:
if not exist dustbuster.exe goto step6
dustbuster.exe
echo.
goto step5
:step6
echo А ее дистрибутива тут тоже нету...
echo Значит пока все!
pause
exit
:step5
echo.
if not exist C:\"Program Files"\DustBu1\dustbu1.exe goto altloc
start C:\Progra1\DustBu1\dustbu1.exe
:altloc
if not exist "c:\programs\DustBu1\dustbu1.exe" goto endz
c:\programs\DustBu1\dustbu1.exe
:endz
echo.
echo ну не хочешь как хочешь...
pause >nul:
Создание циклов.
Настоящие циклы можно организовать, используя опеатор for.
Самый логичный способ получить справочную информацию по комманде это спросить саму ОС(Windows в частности). На сведения полученные таким путём я буду опираться. Если кто-то не знает то спросить можно так: c:\>help for или c:\>help for > for.txt. Во втором случае у вас будет возможность читать справку в блокноте с удобной навигацией по относительно ёмкому тексту.
Для начала формат: for %%переменная in (набор) do команда
Замечание №1: В пакетных файлах для команды FOR используется запись %%переменная вместо %переменная.(см. справку)
Замечание №2: Имена переменных учитывают регистр букв (%i отличается от %I).(см. справку)
Замечание №3: (набор) - это список реально существующих файлов. Подстановочные символы также используются. Можно использовать такой вариант: (PATH\*.jpg). В этом случае набор будет состоять из всех файлов с расширением jpg, лежащих по адресу PATH\
Более сложный вариант это перебор всех файлов рекурсивно от заданного каталога. Для этого используется ключ /r и путь к исходному каталогу от которого начинается перебор:
for /r e:\moovies %%n in (*.avi) do mv %%n e:\moovies\avi-files(каталог avi-files нужно сождать заранее!!!)
Несколько более извращённый вариант:
for /f %переменная in ('dir /b PATH\*.jpg') do команда. (В этом случае следует испльзовать ключ /f.).
Вся справка:
Выполнение указанной команды для каждого файла набора.
FOR %переменная IN (набор) DO команда [параметры]
%переменная Подставляемый параметр.
(набор) Набор, состоящий из одного или нескольких файлов.
Допускается использование подстановочных знаков.
команда Команда, которую следует выполнить для каждого файла.
параметры Параметры и ключи для указанной команды.
В пакетных файлах для команды FOR используется запись
%%переменная вместо %переменная. Имена переменных
учитывают регистр букв (%i отличается от %I).
Добавление поддерживаемых вариантов команды FOR при включении расширенной
обработки команд:
FOR /D %переменная IN (набор) DO команда [параметры]
Если набор содержит подстановочные знаки, команда выполняется для всех
подходящих имен каталогов, а не имен файлов.
FOR /R [[диск:]путь] %переменная IN (набор) DO команда [параметры]
Выполнение команды для каталога [диск:]путь, а также для всех
подкаталогов этого пути. Если после ключа /R не указано имя каталога,
выполнение команды начинается с текущего каталога.
Если вместо набора указана только точка (.), команда выводит список
всех подкаталогов.
FOR /L %переменная IN (начало,шаг,конец) DO команда [параметры]
Набор раскрывается в последовательность чисел с заданными началом, концом
и шагом приращения. Так, набор (1,1,5) раскрывается в (1 2 3 4 5),
а набор (5,-1,1) заменяется на (5 4 3 2 1)
FOR /F ["ключи"] %переменная IN (набор) DO команда [параметры]
FOR /F ["options"] %variable IN ("literal string") DO command [command-parameters]
FOR /F ["options"] %variable IN ('command') DO command [command-parameters]
или, если использован параметр usebackq:
FOR /F ["options"] %variable IN (filenameset) DO command [command-parameters]
FOR /F ["options"] %variable IN ('literal string') DO command [command-parameters]
FOR /F ["options"] %variable IN (`command`) DO command [command-parameters]
Набор содержит имена одного или нескольких файлов, которые по очереди открываются, читаются и обрабатываются. Обработка состоит в чтении файла, разбивки его на отдельные строки текста и выделения из каждой строки заданного числа подстрок (в том числе нуля). Затем найденная подстрока используется в качестве значения переменной при выполнении основного тела цикла. По умолчанию ключ /F выделяет из каждой строки файла первое слово, очищенное от окружающих его пробелов. Пустые строки в файле пропускаются.
Необязательный параметры "ключи" служит для переопределения заданных по умолчанию правил обработки строк. Ключи представляют собой заключенную в кавычки строку, содержащую указанные параметры. Ключевые слова:
eol=c - определение символа комментариев в конце строки
(допускается задание только одного символа).
skip=n - число пропускаемых при обработке строк в начале
файла.
delims=xxx - определение набора разделителей для замены заданных
по умолчанию пробела и знака табуляции.
tokens=x,y,m-n - определение номеров подстрок, выделяемых из каждой
строки файла и передаваемых для выполнения в тело
цикла. При использовании этого ключа создаются
дополнительные переменные. Формат m-n представляет
собой диапазон подстрок с номерами от m по n. Если
последний символ в строке tokens= является
звездочкой, создается дополнительная переменная,
значением которой будет весь оставшийся текст в
строке после обработки последней подстроки.
usebackq - применение новой семантики, при которой строки,
заключенные в обратные кавычки, выполняются как
команды, строки, заключенные в прямые одиночные
кавычки, являются строкой литералов команды, а
строки, заключенные в двойные кавычки, используются
для выделения имен файлов в списках имен файлов.
Поясняющийпример:
FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k
Эта команда обрабатывает файл myfile.txt, пропускает все строки, которые начинаются с символа точки с запятой, и передает вторую и третью подстроки из каждой строки в тело цикла, причем подстроки разделяются запятыми и/или пробелами. В теле цикла переменная %i используется для второй подстроки, %j - для третьей, а %k получает все оставшиеся подстроки после третьей.
Имена файлов, содержащие пробелы, необходимо заключать в двойные кавычки. Для того чтобы использовать двойные кавычки, необходимо использовать параметр usebackq, иначе двойные кавычки будут восприняты как границы строки для обработки.
Переменная %i явно описана в инструкции for, а переменные %j и %k описываются неявно с помощью ключа tokens=. Ключ tokens= позволяет извлечь из одной строки файла до 26 подстрок, при этом, не допускается использование переменных больших чем буквы 'z' или 'Z'. Следует помнить, что имена переменных FOR являются глобальными, поэтому одновременно не может быть активно более 52 переменных.
Синтаксис команды FOR /F также позволяет обработать отдельную строку, с указанием параметра filenameset, заключенным в одиночные кавычки. Строка будет обработана как единая строка из входного файла.
Наконец, команда FOR /F позволяет обработать строку вывода другой команды. Для этого следует ввести строку вызова команды в апострофах вместо набора имен файлов в скобках. Строка передается для выполнения обработчику команд CMD.EXE, а вывод этой команды записывается в память и обрабатывается так, как будто строка вывода взята из файла. Например, следующая команда:
FOR /F "usebackq delims==" %i IN (`set`) DO @echo %i
выведет перечень имен всех переменных среды, определенных в настоящее время в системе.
Операции подстановки ссылок на переменные команды FOR также расширены. Допускается применение следующих синтаксических конструкций:
%I - из переменной %I удаляются обрамляющие кавычки (")
%fI - переменная %I расширяется до полного имени файла
%dI - из переменной %I выделяется только имя диска
%pI - из переменной %I выделяется только путь к файлу
%nI - из переменной %I выделяется только имя файла
%xI - из переменной %I выделяется расширение имени файла
%sI - полученный путь содержит только короткие имена
%aI - переменная %I расширяется до атрибутов файла
%tI - переменная %I расширяется до даты /времени файла
%zI - переменная %I расширяется до размера файла
%$PATH:I - проводится поиск по каталогам, заданным в переменной среды PATH, и переменная %I заменяется на полное имя первого найденного файла. Если переменная PATH не определена или в результате поиска не найден ни один файл, то этот модификатор заменяется на пустую строку
При объединении нескольких операторов можно получить следующие результаты:
%dpI - переменная %I заменяется только на имя диска и путь
%nxI - переменная %I заменяется только на имя файла и его
расширение
%fsI - переменная %I заменяется только на полный путь с
краткими именами
%dp$PATH:I - проводится поиск по каталогам, заданным в переменной среды PATH, и переменная %I заменяется на имя диска и путь к первому найденному файлу.
%ftzaI - переменная %I заменяется на строку, выдаваемую командой DIR
В приведенных выше примерах переменные %I и PATH можно заменить на любые другие допустимые значения. В таких синтаксических конструкциях за символами % может следовать любое имя переменной цикла FOR. Рекомендуется использовать заглавные буквы для имен таких переменных, например, %I, что делает их более заметными, а также позволяет отличать их от обозначений модификаторов, которые не различают используемый регистр.
Ход работы
В результате изучения выше изложенного теоретического материала и практических примеров студент должен:
составить свой уникальный командный файл.
Открыть блокнот.
Сохранить файл в любую вашу папку на диске С:\ или на сам диск С:\ с именем «Фамилия.bat»
Открыть в проводнике папку или диск содержащий данный файл.
Нажать правой кнопкой на файле выбрать изменить, должен открыться блокнот.
Набираем в блокноте необходимые для каждого варианта команды.
Сохраняем файл (не закрывая блокнот).
В проводнике находим ваш файл, делаем двойной щелчок на данном файле. он должен запустится и выполнить команды которые вы набрали.
Если необходимо, опять изменяем содержимое файла в блокноте и переходим к пункту f.
продемонстрировать его работоспособность. Командные файлы, выдающие ошибку или не выполняющие условия задания, не рассматриваются.
Вариант соответствует номеру студента в журнале. Все что написано в задании должен выполнять файл.
№ | Задание, которое должен выполнять bat файл студента | |
1 | Создать каталог «Фамилия_студента» на диске с:\ Проверить если создался каталог то удалить его (необходимо использовать команду if) менять цвет шрифта в течении N секунд, где N=10*№ варианта (необходимо использовать команду for) Удалить созданный каталог. Остановится до нажатия любой клавиши. | |
2 | Создать каталог «Фамилия_студента» на диске с:\ скопировать N первых файлов из папки «inf» в системной директории, где N=10*№ варианта (необходимо использовать команду for) Проверить есть ли в скопированные файлы то удалить его (необходимо использовать команду if) Удалить созданный каталог. Остановится до нажатия любой клавиши. | |
3 | Создать каталог «Фамилия_студента» на диске с:\ Проверить если создался каталог то удалить его (необходимо использовать команду if) менять цвет шрифта в течении N секунд, где N=10*№ варианта (необходимо использовать команду for) Удалить созданный каталог. Остановится до нажатия любой клавиши. | |
4 | Создать каталог «Фамилия_студента» на диске с:\ скопировать N первых файлов из папки «inf» в системной директории, где N=10*№ варианта (необходимо использовать команду for) Проверить есть ли в скопированные файлы то удалить его (необходимо использовать команду if) Удалить созданный каталог. Остановится до нажатия любой клавиши. | |
5 | Создать каталог «Фамилия_студента» на диске с:\ Проверить если создался каталог то удалить его (необходимо использовать команду if) менять цвет шрифта в течении N секунд, где N=10*№ варианта (необходимо использовать команду for) Удалить созданный каталог. Остановится до нажатия любой клавиши. | |
6 | Создать каталог «Фамилия_студента» на диске с:\ скопировать N первых файлов из папки «inf» в системной директории, где N=10*№ варианта (необходимо использовать команду for) Проверить есть ли в скопированные файлы то удалить его (необходимо использовать команду if) Удалить созданный каталог. Остановится до нажатия любой клавиши. | |
7 | Создать каталог «Фамилия_студента» на диске с:\ Проверить если создался каталог то удалить его (необходимо использовать команду if) менять цвет шрифта в течении N секунд, где N=10*№ варианта (необходимо использовать команду for) Удалить созданный каталог. Остановится до нажатия любой клавиши. | |
8 | Создать каталог «Фамилия_студента» на диске с:\ скопировать N первых файлов из папки «inf» в системной директории, где N=10*№ варианта (необходимо использовать команду for) Проверить есть ли в скопированные файлы то удалить его (необходимо использовать команду if) Удалить созданный каталог. Остановится до нажатия любой клавиши. | |
9 | Создать каталог «Фамилия_студента» на диске с:\ Проверить если создался каталог то удалить его (необходимо использовать команду if) менять цвет шрифта в течении N секунд, где N=10*№ варианта (необходимо использовать команду for) Удалить созданный каталог. Остановится до нажатия любой клавиши. | |
10 | Создать каталог «Фамилия_студента» на диске с:\ скопировать N первых файлов из папки «inf» в системной директории, где N=10*№ варианта (необходимо использовать команду for) Проверить есть ли в скопированные файлы то удалить его (необходимо использовать команду if) Удалить созданный каталог. Остановится до нажатия любой клавиши. | |
11 | Создать каталог «Фамилия_студента» на диске с:\ Проверить если создался каталог то удалить его (необходимо использовать команду if) менять цвет шрифта в течении N секунд, где N=10*№ варианта (необходимо использовать команду for) Удалить созданный каталог. Остановится до нажатия любой клавиши. | |
12 12 | Создать каталог «Фамилия_студента» на диске с:\ скопировать N первых файлов из папки «inf» в системной директории, где N=10*№ варианта (необходимо использовать команду for) Проверить есть ли в скопированные файлы то удалить его (необходимо использовать команду if) Удалить созданный каталог. Остановится до нажатия любой клавиши. | |
13 | Создать каталог «Фамилия_студента» на диске с:\ Проверить если создался каталог то удалить его (необходимо использовать команду if) менять цвет шрифта в течении N секунд, где N=10*№ варианта (необходимо использовать команду for) Удалить созданный каталог. Остановится до нажатия любой клавиши. | |
14 | Создать каталог «Фамилия_студента» на диске с:\ скопировать N первых файлов из папки «inf» в системной директории, где N=10*№ варианта (необходимо использовать команду for) Проверить есть ли в скопированные файлы то удалить его (необходимо использовать команду if) Удалить созданный каталог. Остановится до нажатия любой клавиши. | |
15 | Создать каталог «Фамилия_студента» на диске с:\ Проверить если создался каталог то удалить его (необходимо использовать команду if) менять цвет шрифта в течении N секунд, где N=10*№ варианта (необходимо использовать команду for) Удалить созданный каталог. Остановится до нажатия любой клавиши. | |
16 | Создать каталог «Фамилия_студента» на диске с:\ скопировать N первых файлов из папки «inf» в системной директории, где N=10*№ варианта (необходимо использовать команду for) Проверить есть ли в скопированные файлы то удалить его (необходимо использовать команду if) Удалить созданный каталог. Остановится до нажатия любой клавиши. | |