Главная

Wednesday, 20 July 2022

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


Всем привет.

Сегодня вторая часть шпаргалки по возможностям сценариев командной строки.

Использование переменных среды.

В пакетных файлах можно использовать своеобразные переменные, которые задаются в виде ключ=значение. В дальнейшем при обработке команд каждое вхождение подстроки %ключ% заменяется на значение.

Переменные среды бывают трех видов:

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

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

- псевдопеременные, такие как %CD%, %DATE%, %TIME%, %RANDOM%, %ERRORLEVEL%, обрабатываются особенным образом в зависимости от определенных условий.

В следующей таблице приведен выборочный список наиболее интересных переменных среды.


При использовании переменных можно также использовать выделение подстрок.

Для установки значений переменных используется команда set.

Установка значений:

set переменная=значение

Показ значений:

set переменная

Показ значений всех переменных:

set (без параметров)

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

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


Вычисление арифметических выражений.

Команда set поддерживает особое расширение синтаксиса:

set /a выражение

В следующей таблице представлены арифметические операторы, поддерживающие параметр /a, в порядке убывания приоритета.


При использовании символов & | % < > ^ заключайте выражение в кавычки.

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

Пример использования вычисления выражений:

set /a "a=!5^5, b=2, a>>=2, c=a+b, d=2*2"

@echo %a%=1, %b%=2, %c%=3, %d%=4


Потоки ввода/вывода.

Потоки используются в командных сценариях для унифицированного распределения и перенаправления ввода/вывода.

В следующей таблице представлены стандартные потоки.


Каждый поток может быть связан с каким-либо устройством ввода/вывода.

В следующей таблице представлены стандартные устройства.


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

По умолчанию все стандартные потоки связаны с устройством CON.

В следующей таблице описаны операторы перенаправления, применимые к потокам и устройствам.


Некоторые команды, такие как find, sort, more, называются фильтрами, т.к. они занимаются специализированной трансформацией входного потока в выходной.

Далее приведены некоторые примеры.

Типичный вызов при тестировании программистских задач.

(Ввод из input.txt, вывод в output.txt, вывод ошибок в никуда).

solution.exe <input.txt >output.txt 2>nul

Вызов скрипта компиляции с перенаправлением потоков вывода и ошибок на дописывание в файл compile.log.

call compile_all.cmd %SOLUTION% %TARGET% >>compile.log 2>&1

Дописывание содержимого одного файла в конец другого.

more <report.txt >>$result$.txt

Поэкранный вывод списка элементов текущего каталога.

dir | more

Поэкранный вывод имен всех фидошников города Гомеля, отсортированных по алфавиту.

(for /f "usebackq tokens=5 delims=, " %%i in (`find /i "Gomel" R45Point`) do @echo %%i) | sort | more


Организация циклов.

Команда for позволяет произвести запуск некоторой команды для каждого элемента из заданного множества.

Синтаксис:

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

Параметры:

- {%переменная|%%переменная}

Обязательный параметр. Замещаемый параметр. Используйте %переменная для выполнения команды for из командной строки. В пакетных файлах для команды FOR используется запись %%переменная вместо %переменная. Имена переменных учитывают регистр букв (%i отличается от %I).

- (множество)

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

- команда

Обязательный параметр. Задает команду, которая будет выполнена для каждого файла, каталога диапазона значений или текстовой строки, включенной в указанный параметр (множество).

- ПараметрыКоманднойСтроки

Задает параметры командной строки, которые используются с указанной командой.

Подробнее команда описана в справке. Здесь приведены несколько примеров, иллюстрирующих ее возможности.

Перебор фиксированного множества параметров.

for %%i in (DirInfo,File_Id.diz,Descript.ion,Read.Me,ReadMe.*,FILES.BBS) do @set descr=%%i & @if exist %%i goto found

goto notfound

:found

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

:notfound


Итерация по файлам.

@set sz=0

@for /r %temp% %%i in (*.*) do @set /a sz+=%%~zi & @echo %%i %%~zi

@echo Размер временного каталога: %sz%

Итерация по каталогам.

@echo off

echo Поддерживаемые компиляторы:

for /d %%i in (d:\delta\lngs\*) do @echo %%~ni

Численная итерация.

@for /l %%i in (1,1,5) do @echo %%i

@echo ...вышел зайчик погулять.

Итерация и разбор файлов.

Команда for может также употребляться для чтения строк из файлов и их синтаксического разбора.

В этом случае используется следующий синтаксис:

FOR /F ["options"] %переменная 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 выделяет из каждой строки файла первое слово, очищенное от окружающих его пробелов. Пустые строки в файле пропускаются. Необязательный параметр "options" служит для переопределения заданных по умолчанию правил обработки строк.

Возможные ключевые слова для этого параметра:



Поясняющий пример:

FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k

Эта команда обрабатывает файл myfile.txt, пропускает все строки, которые начинаются с символа точки с запятой, и передает вторую и третью подстроки из каждой строки в тело цикла, причем подстроки разделяются запятыми и/или пробелами. В теле цикла переменная %i используется для второй подстроки, %j - для третьей, а %k получает все оставшиеся подстроки после третьей. Имена файлов, содержащие пробелы, необходимо заключать в двойные кавычки. Для того чтобы использовать двойные кавычки, необходимо использовать параметр usebackq, иначе двойные кавычки будут восприняты как границы строки для обработки.

Синтаксис команды FOR /F также позволяет обработать отдельную строку, с указанием параметра filenameset, заключенным в одиночные кавычки. Строка будет обработана как единая строка из входного файла.

Наконец, команда FOR /F позволяет обработать строку вывода другой команды. Для этого следует ввести строку вызова команды в апострофах вместо набора имен файлов в скобках. Строка передается для выполнения обработчику команд CMD.EXE, а вывод этой команды записывается в память и обрабатывается так, как будто строка вывода взята из файла. Например, следующая команда:

FOR /F "usebackq delims==" %i IN (`set`) DO @echo %i

выведет перечень имен всех переменных среды, определенных в настоящее время в системе.

Еще один пример:

@echo Разбор $result$.txt

for /f "usebackq delims=" %%i in ($result$.txt) do (@set val=%%i) & @goto next

:next

@set /a nval=val+0

if not "%val%"=="%nval%" (@echo Не число!) & @goto :eof

if %val% lss 0 (@echo Меньше нуля!) & @goto :eof

@echo Начислено %val% баллов.


Организация блокировок.

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

Далее приведен иллюстрирующий пример.

@rem Устанавливаем блокировку на повторный запуск 

set lockdir=%tmp%\some_lock

md %lockdir%

if not errorlevel 1 goto :work

@echo Aborting because of lock: %lockdir%

@echo (Other instance of %~nx0 has not finished yet)

@goto :eof

:work

@rem some work...

@rem Снимаем блокировку

rd %lockdir%

Установка цвета консоли.

Команда color позволяет менять цвет консоли.

Например, "color 0A". Первый символ соответствует цвету фона, второй - текста.

    0 = Черный      8 = Серый

    1 = Синий       9 = Светло-синий

    2 = Зеленый     A = Светло-зеленый

    3 = Голубой     B = Светло-голубой

    4 = Красный     C = Светло-красный

    5 = Лиловый     D = Светло-лиловый

    6 = Желтый      E = Светло-желтый

    7 = Белый       F = Ярко-белый

Цвет создаваемой консоли позволяет менять также опция /t команды cmd.

Автор шпаргалки Vadim Kopichenko.

Удачи.


No comments:

Post a Comment

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