Главная

Sunday, 17 July 2022

Возможности сценариев командной строки #1.


Всем привет.

Сегодня шпаргалка про полезные возможности сценариев командной строки, которые можно использовать в командных файлах (*.bat;*.cmd aka батники) операционных систем Windows. Несмотря на популяризацию Powershell батники в наше время еще используются не менее широко.

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

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

выборочная итерация по файлам и каталогам с применением различных команд

расширенное перенаправление потоков ввода/вывода

использование переменных, вычисление арифметических выражений, манипуляции со подстроками

расширенная обработка условий

многое другое.

Более подробную помощь нежели в данном обзоре можно найти в стандартной справке в каталоге Windows. Типичный путь к файлу справки: C:\WINDOWS\Help\ntcmds.chm. Если Windows установлена в каталог, отличный от C:\WINDOWS, то ссылки на справку из данной страницы работать не будут. Потребуется открыть справку самостоятельно. В частности, крайне полезно почитать следующие разделы: Общие сведения о командной оболочке, Использование пакетных файлов.

Справку по конкретной команде также всегда можно получить набрав в командной строке "<имя_команды> /?". Например, очень познавательно почитать то, что выдается в результате команд set /?, call /?, for /?, if /?. Помощь приводится на языке установленной операционной системы.

Вывод

Вывод на консоль осуществляется с помощью команды echo. Например, "echo Здравствуй, читатель". При использовании в командных файлы команды echo on и echo off позволяют включать и выключать режим вывода на экран самих исполняемых команд. Если поставить перед командой знак @, то она на экране не будет выведена в любом случае. Будет видет только результат ее исполнения.

Например, "@echo no echo". Команда "echo." позволяет вывести пустую строку.

Текущий каталог

Текущий каталог позволяет изменять команда cd. Рекомендуется всегда использовать с командой опцию /d для смены одновременно и текущего диска.

Например, "cd /d d:\delta".

Текущий каталог можно узнать также с помощью псевдопеременной %cd%.

Например, "@echo Current directory is: %cd%".

При операциях с путями точка "." обозначает текущий каталог, а две точки ".." - каталог уровнем выше.

Например, команда "cd ..\.." указывает, что нужно перейти двумя каталогами выше.

Параметры вызова сценариев

Из пакетного файла переданные параметры можно узнать с помощью переменных %1, %2, %3 и т.д. по порядку.

%0 расширяется до полного пути к данному командному файлу.

%* в пакетном файле обозначает все аргументы (например %1 %2 %3 %4 %5 ...).

Например, после вызова

d:\delta\lngs\compile_all.cmd sol.dpr .

будем иметь следующую картину:

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

Описанные модификаторы можно применять в различных сочетаниях для всех параметров. Например:


Проверка условий

Проверка условий осуществляется с помощью команды if.

Синтаксис:

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

При обработке переменных важно учитывать возможность, что они окажутся пустыми. Поэтому, чтобы команда сравнения осталась корректной, операнды лучше заключать в кавычки: if "%1"=="input.txt".

Расширенный синтаксис:

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

Расширенный синтаксис позволяет использовать регистронезависимое (/i) сравнение со следующими операторами: EQU (равно), NEQ (не равно), LSS (меньше), LEQ (меньше или равно), GTR (больше), GEQ (больше или равно).

Проверка существования файла:

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

Например: if exist $result$.txt del $result$.txt

Проверка кода возврата:

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

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

Например:

@echo off 

rem данный скрипт копирует все файлы во всех подкаталогах 

rem исходного каталога (%1) в другой каталог (%2) 

xcopy %1 %2 /s /e 

if errorlevel 4 echo Недостаточно памяти, задан недопустимый диск или ошибка в синтаксисе

if errorlevel 2 echo Нажата комбинация CTRL+C для остановки копирования 

if errorlevel 0 echo Копирование прошло успешно


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

Метки обозначаются идентификатором с двоеточием прямо перед ним. Для перехода по меткам используется команда goto. Существует специальный вариант команды "goto :eof" для перехода на конец исполняемого сценария. Есть также особый вариант команды call для повторного вызова текущего скрипта с заданной метки с определенными параметрами.

Пример:

@rem Такой вот тест :)

if %cd%\==%~dp0 goto next

@echo Внимание: текущий каталог не совпадает с путем к данному скрипту

:next

if not exist $result$.txt (@echo $result$.txt не найден) else call :modified $result$.txt

goto :eof

:modified

@echo %1 был модифицирован %~t1

if /i ".txt" EQU "%~x1" @echo %1 является текстовым файлом

goto :eof


Запуск команд

Запускать новые процессы из командной строки можно двумя способами.

Инструкция "cmd команда" запускает системный пакетный обработчик cmd.exe для выполнения команды команда. Если вызов происходит из консоли, то используется имеющаяся, если нет — создается новая. Ключи /c и /k указывают, что по завершении исполнения консоль нужно закрыть или оставить, соответственно.

Инструкция "start команда" запускает обработку команды команда в отдельном параллельном процессе. Соответствующие ключи позволяют изменять приоритет запускаемого процесса. Ключ /wait указывает, что запустившему процессу следует дождаться завершения запущенного. Запускать новые командные сценарии из командных сценариев можно также двумя способами.

Первый:

@echo Эта строка выполнится перед запуском

call some_script.cmd some params

@echo Эта строка выполнится после завершения some_script.cmd

Второй:

@echo Эта строка выполнится перед запуском

some_script.cmd some params

@echo Эта строка никогда не выполнится, т.к. управление из some_script.cmd в вызвавший скрипт не вернется.


Код возврата команд

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

Значение кода возврата можно проверить с помощью специальной конструкции if [not] errorlevel число (см. if /?). Также, переменную %errorlevel% можно свободно использовать непосредственно.

Например, "goto answer%errorlevel%" или "echo %errorlevel%".

Команда exit число прерывает исполнение текущего сценария с возвратом запустившему его процессу заданного кода выхода. По умолчанию производится прерывание сразу всей цепочки вызовов пакетных сценариев. Если необходимо завершить только текущий сценарий и возвратить управление в сценарий, вызвавший его командой call, то нужно использовать ключ /b команды exit. Для выхода из сценария с передачей вызвавшему процессу текущего значения %errorlevel% необходимо использовать команду goto :eof.

Некоторые команды всегда устанавливают переменную %errorlevel%, некоторые модифицируют ее только при возникновении ошибок, а некоторые вообще ее никогда не меняют.

Вот пример:

md testdir

@echo %errorlevel%=0, успешно

rd testdir

@echo %errorlevel%=0, успешно

тест

@echo %errorlevel%=9009, недопустимая команда

md testdir

@echo %errorlevel%=0, успешно

md testdir

@echo %errorlevel%=1, каталог уже существует

rd testdir

@echo %errorlevel%=1, успешно, но сохранился код предыдущей ошибки

set errorlevel=0

@echo %errorlevel%=0, после явного сброса

rd con

@echo %errorlevel%=1, недопустимое имя, но оказывается, что rd errorlevel вообще никогда не меняет

@goto :eof


Копирование

Команда copy умеет копировать и склеивать файлы.

Команда xcopy умеет копировать файлы и каталоги.

Команда ren (rename) умеет переименовывать файлы и каталоги.

Проверить, удачно ли выполнилась команда можно по коду возврата %errorlevel%.

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

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


Примечание:

Амперсанд &, вертикальная черта | и скобки () являются специальными символами, которым должен предшествовать управляющий символ ^ или кавычки, если эти символы передаются в качестве аргументов.

Вот пример специализированного скрипта для сравнения файлов:

@echo Производится сравнение файлов %1 и %2 с особой передачей кода возврата

fc /w /c /l %1 %2 >nul && @echo Файлы совпадают ^(с точностью до пробелов и регистра символов^)

if not %~z1==%~z2 (@echo Размеры файлов не равны) & exit /b 2

fc /b %1 %2 >nul || ((@echo Файлы побайтно не совпадают) & exit /b 1)

exit /b 0


Продолжение следует.

Слава Украине!


No comments:

Post a Comment

А что вы думаете по этому поводу?