/cmdline

Парсер аргументов командной строки

Primary Language1C Enterprise

#Парсер командной строки

Одним из способов параметризации скрипта является передача аргументов в командной строке. Традиционно, операционная система передает аргументы командной строки в виде массива строк.

В 1Script доступна глобальная коллекция АргументыКоманднойСтроки, в которой можно получить значения, переданные в скрипт извне.

Понятно, что прямая обработка таких аргументов не всегда удобна, поэтому применяют библиотеки-парсеры. Библиотека cmdline является таким парсером для 1Script.

#Использовать cmdline

Парсер = Новый ПарсерАргументовКоманднойСтроки();

##Концепция

В парсер мы передаем наши ожидания - какие именно параметры мы ждем на входе. Парсер разбирает массив аргументов и возвращает нам значения в виде объекта. Если пользователь неправильно передал параметры, то парсер вернет Неопределено.

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

  • Позиционные - сам параметр является значением. В командной строке указано непосредственное значение

  • Именованные - сначала в командной строке указано имя, затем значение

      myprogram c:\file.txt -action delete
    

В приведенном примере в скрипт myprogram передано 3 аргумента с точки зрения ОС. При этом, первый аргумент - позиционный, у него нет предварительной части, он сам по себе и его значение c:\file.txt.

Далее идет именованный параметр -action и его значение - delete.

Чтобы задать данный синтаксис, мы должны настроить парсер:

Парсер.ДобавитьПараметр("ПутьКФайлу");
Парсер.ДобавитьИменованныйПараметр("-action");

Параметры = Парсер.Разобрать(АргументыКоманднойСтроки);
Сообщить(Параметры["ПутьКФайлу"]);
Сообщить(Параметры["-action"]);

Команды

В более сложных случаях скрипт может принимать на вход некие "Команды", задающие режим работы. И каждая команда может иметь свой состав аргументов. Яркий пример - git. При запуске мы передаем команду и ее параметры, например:

git clone http://github.com/repo
git commit somefile.txt -m "сообщение коммита"

Сначала идет команда, а то, что идет за ней - зависит от самой команды.

Команда = Парсер.ОписаниеКоманды("init");

Парсер.ДобавитьПозиционныйПараметрКоманды(Команда, "ПутьКХранилищу");
Парсер.ДобавитьПозиционныйПараметрКоманды(Команда, "ЛокальныйКаталогГит");

Парсер.ДобавитьИменованныйПараметрКоманды(Команда, "-email");
Парсер.ДобавитьИменованныйПараметрКоманды(Команда, "-debug");
Парсер.ДобавитьКоманду(Команда);

Результат = Парсер.Разобрать(АргументыКоманднойСтроки);
Если Результат.Команда = "init" Тогда
	Параметры = Результат.ЗначенияПараметров;
	Сообщить(Параметры["ПутьКХранилищу"]);
	Сообщить(Параметры["-debug"]);
КонецЕсли;