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


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

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



 

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

 

Для доступа к параметрам командной строки в командном файле приме-няются символы %0, %1,…,%9. При этом вместо %0 всегда подставляется имя выполняемого пакетного файла, а вместо %1, %2,…, %9 — значения первых де-вяти параметров командной строки соответственно Если в командной строке при вызове пакетного файла задано меньше девяти параметров, то "лишние" перемен-ные из %1 - %9 являются пустыми строками. Модифицируем ранее рассмотрен-ный пример архивирования и удаления файлов arc.bat.

 

rem Вызов arc.bat имя_папки маска_файлов имя_архива

@echo off

 

d:\winrar\rar a %1\%3 %1\%2 del %1\%2

 

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

Обратиться к командному файлу можно так:

 

arc.bat d:\tmp *.txt arc.rar

 

А для другой папки, возможно, потребуется архивация файлов с расшире-нием log и вызов командного файла примет вид:

 

arc.bat d:\work\logs *.log log.rar

 

Если в командный файл передается более 9 параметров, на помощь прихо-дит команда shift, которая сдвигает значения параметров с %0 по %9, копируя каждый параметр в предыдущий, то есть значение %1 копируется в %0, значение %2 —в %1 и т.д.Замещаемому параметру %9 присваивается десятое значениепараметра вызова. Если же такой параметр не задан, то переменная %9 получит в


 


качестве значения пустую строку. Необходимо помнить, что не существует ко-манды, обратной shift. Таким образом, не удастся восстановить параметр (%0) после выполнения команды shift.

 

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

 

Shift /3

 

сдвинет %4 на %3, % 5 на %4 и т. д. %0, %1 и %2 останутся неизменными. Если в командной строке задано больше десяти параметров, то команду

 

shift можно использовать несколько раз.

 

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

 

  Таблица 7 - Операторы для заменяемых параметров
Операторы Описание
%~Fn Переменная %n расширяется до полного имени файла
   
%~Dn Из переменной %n выделяется только имя диска
   
%~Pn Из переменной %n выделяется только путь к файлу
   
%~Nn Из переменной %n выделяется только имя файла
   
%~Xn Из переменной %n выделяется расширение имени файла
   
%~Sn Значение операторов N и X для переменной %n изменяется так, что
  они работают с кратким именем файла
   
%~Tn Дата и время создания файла
   
%~Zn Размер файла
   
%~An Атрибуты файла
   
%~$PATH:n Проводится поиск по каталогам, заданным в переменной сре-
  ды PATH, и переменная %n заменяется на полное имя первого най-
  денного файла. Если переменная PATH не определена или в резуль-
  тате поиска не найден ни один файл, эта конструкция заменяется на
  пустую строку. Переменную PATH можно заменить на любое другое
  допустимое значение
   

 

Например, всегда можно узнать, с какого диска был запущен командный

 

файл:

 

echo %~D0

 

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

 

%~DPn — из переменной %n выделяется имя диска и путь, %~NXn — из переменной %n выделяется имя файла и расширение Команда


 

 


ren %1 %~N1_old%~X1

 

переименует файл, имя которого передается в качестве параметра, дописав к име-

ни файла _old: file.dat переименуется в file_old.dat.

 

Взаимодействие пользователя с командных файлов

 

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

 

Для того чтобы вручную прервать выполнение запущенного командно-го файла, необходимо нажать клавиши <Ctrl>+<C> или <Ctrl>+<Break>. Если надо лишь приостановить работу командного файла до момента нажатия клавиши на клавиатуре, можно воспользоваться командой pause. Хорошим стилем счита-ется выдача предупреждения пользователя о потенциально опасных для данных командах и приостановкой выполнения. Тогда у пользователя будет возможность продолжить выполнения командного скрипта при нажатии клавиши или его за-

 

вершения по <Ctrl>+<C> / <Ctrl>+<Break>:

 

ECHO Сейчас будут удалены все файлы в d:\work ECHO Для отмены нажмите Ctrl-C

 

PAUSE

DEL d:\work\*.*

 

Для того, чтобы пользователь мог задать значение переменной с клавиату-ры используется команда set с ключом /p:

 

SET /P имя переменной = текст

 

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

 

set /p Folder=Введите имя папки

 

Еще одну интересную возможность – делать выбор одного из альтернатив-ных вариантов, предоставляет команда choice.

 

Команды передачи управления

 

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

Goto метка

 

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

:метка

 

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


 


@ЕСНО OFF

 

REM Если файл был запущен без параметров, выходим из него, REM иначе печатаем первый параметр

 

IF -%1==- GOTO:EOF ECHO %1

 

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

 

call.

 

Для того, чтобы обратиться к внешнему командному файлу достаточно указать его и его параметры в команде call:

 

call файл пакетные_параметры

 

Пример:

 

Call test.bat par1 par2 par3

 

Данный вызов приведет к передаче управления командному файлу test.bat c тремя указанными параметрами. Альтернативой подобному запуску может стать использование имени стороннего командного файла в качестве имени команды:

 

Test.bat par1 par2 par3

 

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

 

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

 

CALL:метка аргументы

 

При вызове такой команды создается новый контекст текущего пакетного файла с заданными аргументами и управление передается на инструкцию, распо-ложенную сразу после метки. Для выхода из такого пакетного файла необходимо два раза завершить его работу, достигнув конца командного скрипта или вызвав команду exit /b (ключ /b позволяет завершить работу лишь командного файла, а не сеанса оболочки). При этом первый выход будет означать возврат управления на инструкцию, расположенную сразу после строки call, а второй выход заверша-ет выполнение пакетного файла. Такое поведение команды call позволяет оформ-лять фрагменты кода в виде подпрограмм:

 

Call:proc1 par1 par2

...

 

:proc1

rem Здесь %0=:proc1 %1=par1 %2=par2

...

Exit /b

 

...

 

 

Команды перехода

Организация ветвлений алгоритмов в зависимости от выполнения или не-


 


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

 

if [/i] [not] строка1 == строка2 команда [else команда ] if [not] errorlevel число команда [else команда ]

 

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

 

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

 

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

 

Первый вариант операции сравнения позволяет выполнить команду в зави-симости от совпадения или несовпадения двух строк (которые могут быть пред-ставлены и переменными). Например, так мы можем предотвратить запуск ко-мандного файла без параметров:

 

@echo off

if -%1 == - goto:eof

 

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

 

if %1 == /h goto help

 

приведет к ошибке из-за отсутствия левого операнда в операторе сравнения. По-этому рекомендуется использовать в правой и левой части операции сравнения какой-нибудь дополнительный символ, например '-' (или заключать сравниваемые объекты в кавычки).

 

Второй вариант команды if опирается на результат выполнения предыду-щей команды. Здесь необходимо учесть, что в результате своего выполнения ко-манды Windows выставляют переменную окружения errorlevel в значение кода своего завершения. Общепринято, что код завершения 0 соответствует успешно-му завершению команды, а 1 и более – неудачному завершению (например, ниче-го не найдено командой find, команда ping не получила ответ на запрос, команда del не смогла удалить файл и т.п.)и анализ значения переменной дает возмож-ность выполнить различные действия, например, при успешном или неуспешном выполнении предшествующей команды:

 

ping www.volpi.ru >nul if %errorlevel% 1 (

 

echo %date% %time% Нет связи с сайтом www.volpi.ru>> report.txt ipconfig /all >>report.txt

 

)

 

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

 

Если алгоритм работы командного файла предусматривает переход в слу-


 


чае отношений «больше», «меньше», «больше или равно», «меньше или равно», то можно использовать другой синтаксический вариант команды if:

 

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

 

Здесь для сравнения используются трехбуквенные операторы, названия и назначение которых приведены в таблице 8. Ключ /i позволяет игнорировать ре-гистр символов при сравнении.

 

  Таблица 8. Операторы сравнения в команде if
Оператор Описание
EQU равно
   
NEQ не равно
   
LSS меньше
   
LEQ меньше или равно
   
GTR больше
   
GEQ больше или равно
   

call test.bat par1 par2 par3 if %errorlevel% GTR 1 (

 



Поделиться:


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

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