diff --git "a/features/step_definitions/\320\222\321\213\320\277\320\276\320\273\320\275\320\265\320\275\320\270\320\265\320\232\320\276\320\274\320\260\320\275\320\264\321\213.os" "b/features/step_definitions/\320\222\321\213\320\277\320\276\320\273\320\275\320\265\320\275\320\270\320\265\320\232\320\276\320\274\320\260\320\275\320\264\321\213.os" index 8c7e64b..32cfded 100644 --- "a/features/step_definitions/\320\222\321\213\320\277\320\276\320\273\320\275\320\265\320\275\320\270\320\265\320\232\320\276\320\274\320\260\320\275\320\264\321\213.os" +++ "b/features/step_definitions/\320\222\321\213\320\277\320\276\320\273\320\275\320\265\320\275\320\270\320\265\320\232\320\276\320\274\320\260\320\275\320\264\321\213.os" @@ -18,7 +18,7 @@ ВсеШаги.Добавить("ЯВыключаюОтладкуБиблиотеки"); ВсеШаги.Добавить("ЯДобавляюПараметрДляКоманды"); ВсеШаги.Добавить("ЯСообщаюВыводКоманды"); - ВсеШаги.Добавить("КодВозвратаРавен"); + ВсеШаги.Добавить("КодВозвратаКомандыРавен"); Возврат ВсеШаги; КонецФункции @@ -84,15 +84,11 @@ Команда = БДД.ПолучитьИзКонтекста("Команда"); Команда.ДобавитьПараметр(Параметр); - // ВызватьИсключение Новый ИнформацияОбОшибке("Шаг <ЯДобавляюПараметрДляКоманды> не реализован", "Не реализовано."); КонецПроцедуры -//Код возврата равен 0 -Процедура КодВозвратаРавен(Знач ОжидаемыйКодВозврата) Экспорт +//Код возврата команды равен 0 +Процедура КодВозвратаКомандыРавен(Знач ОжидаемыйКодВозврата) Экспорт Команда = БДД.ПолучитьИзКонтекста("Команда"); Ожидаем.Что(Команда.ПолучитьКодВозврата(), "Код возврата").Равно(ОжидаемыйКодВозврата); КонецПроцедуры - - - diff --git "a/features/step_definitions/\320\232\320\276\320\274\320\260\320\275\320\264\320\275\321\213\320\265\320\244\320\260\320\271\320\273\321\213.os" "b/features/step_definitions/\320\232\320\276\320\274\320\260\320\275\320\264\320\275\321\213\320\265\320\244\320\260\320\271\320\273\321\213.os" new file mode 100644 index 0000000..4b9b5cc --- /dev/null +++ "b/features/step_definitions/\320\232\320\276\320\274\320\260\320\275\320\264\320\275\321\213\320\265\320\244\320\260\320\271\320\273\321\213.os" @@ -0,0 +1,101 @@ +// Реализация шагов BDD-фич/сценариев c помощью фреймворка https://github.com/artbear/1bdd +#Использовать "../.." + +Перем БДД; //контекст фреймворка 1bdd + +// Метод выдает список шагов, реализованных в данном файле-шагов +Функция ПолучитьСписокШагов(КонтекстФреймворкаBDD) Экспорт + БДД = КонтекстФреймворкаBDD; + + ВсеШаги = Новый Массив; + + ВсеШаги.Добавить("ЯСоздаюКомандныйФайл"); + ВсеШаги.Добавить("ЯДобавляюСтрокуВКомандныйФайл"); + ВсеШаги.Добавить("ЯСообщаюСодержимоеКомандногоФайла"); + ВсеШаги.Добавить("ЯВыполняюКомандныйФайл"); + ВсеШаги.Добавить("ВыводКомандногоФайлаСодержит"); + ВсеШаги.Добавить("КодВозвратаКомандногоФайлаРавен"); + + Возврат ВсеШаги; +КонецФункции + +// Реализация шагов + +// Процедура выполняется перед запуском каждого сценария +Процедура ПередЗапускомСценария(Знач Узел) Экспорт + +КонецПроцедуры + +// Процедура выполняется после завершения каждого сценария +Процедура ПослеЗапускаСценария(Знач Узел) Экспорт + +КонецПроцедуры + +//Я создаю командный файл +Процедура ЯСоздаюКомандныйФайл() Экспорт + КомандныйФайл = Новый КомандныйФайл; + КомандныйФайл.Создать(); + БДД.СохранитьВКонтекст("КомандныйФайл", КомандныйФайл); +КонецПроцедуры + +//я добавляю строку "echo командный файл" в командный файл +Процедура ЯДобавляюСтрокуВКомандныйФайл(Знач СтрокаКоманды) Экспорт + КомандныйФайл = БДД.ПолучитьИзКонтекста("КомандныйФайл"); + + КомандныйФайл.ДобавитьКоманду(СтрокаКоманды); +КонецПроцедуры + +//Я выполняю командный файл +Процедура ЯВыполняюКомандныйФайл() Экспорт + КомандныйФайл = БДД.ПолучитьИзКонтекста("КомандныйФайл"); + + КомандныйФайл.Выполнить(); +КонецПроцедуры + +//Я сообщаю содержимое файла "ИмяФайла" +Процедура ЯСообщаюСодержимоеФайла(Знач ИмяФайла) Экспорт + ВывестиТекстФайла(ИмяФайла); +КонецПроцедуры + +//Я сообщаю содержимое командного файла +Процедура ЯСообщаюСодержимоеКомандногоФайла() Экспорт + КомандныйФайл = БДД.ПолучитьИзКонтекста("КомандныйФайл"); + + ТекстФайла = КомандныйФайл.ПолучитьТекстФайла(); + Сообщить(ТекстФайла); +КонецПроцедуры + +//Вывод командного файла содержит "командный файл" +Процедура ВыводКомандногоФайлаСодержит(Знач ОжидаемыйВыводКоманды) Экспорт + КомандныйФайл = БДД.ПолучитьИзКонтекста("КомандныйФайл"); + + ВыводКоманды = КомандныйФайл.ПолучитьВывод(); + Ожидаем.Что(ВыводКоманды).Содержит(ОжидаемыйВыводКоманды); +КонецПроцедуры + +//Код возврата командного файла равен 0 +Процедура КодВозвратаКомандногоФайлаРавен(Знач ОжидаемыйКодВозврата) Экспорт + КомандныйФайл = БДД.ПолучитьИзКонтекста("КомандныйФайл"); + + Ожидаем.Что(КомандныйФайл.ПолучитьКодВозврата(), "Код возврата").Равно(ОжидаемыйКодВозврата); +КонецПроцедуры + + +Процедура ВывестиТекстФайла(Знач ИмяФайла, Знач Кодировка = Неопределено) + + Файл = Новый Файл(ИмяФайла); + Если НЕ Файл.Существует() Тогда + Возврат; + КонецЕсли; + + Если Кодировка = Неопределено Тогда + Кодировка = "utf-8"; + КонецЕсли; + + ЧТ = Новый ЧтениеТекста(ИмяФайла, Кодировка); + СтрокаФайла = ЧТ.Прочитать(); + ЧТ.Закрыть(); + + Сообщить(СтрокаФайла); + +КонецПроцедуры diff --git "a/features/\320\222\321\213\320\277\320\276\320\273\320\275\320\265\320\275\320\270\320\265\320\232\320\276\320\274\320\260\320\275\320\264\321\213.feature" "b/features/\320\222\321\213\320\277\320\276\320\273\320\275\320\265\320\275\320\270\320\265\320\232\320\276\320\274\320\260\320\275\320\264\321\213.feature" index 480cbd5..4ddcb08 100644 --- "a/features/\320\222\321\213\320\277\320\276\320\273\320\275\320\265\320\275\320\270\320\265\320\232\320\276\320\274\320\260\320\275\320\264\321\213.feature" +++ "b/features/\320\222\321\213\320\277\320\276\320\273\320\275\320\265\320\275\320\270\320\265\320\232\320\276\320\274\320\260\320\275\320\264\321\213.feature" @@ -7,10 +7,10 @@ Чтобы я мог проще автоматизировать больше действий на OneScript Сценарий: Выполнение команды без параметров - Допустим я включаю отладку библиотеки "commands" + Допустим я выключаю отладку библиотеки "commands" Когда Я выполняю команду "git" Тогда Вывод команды содержит "[--version]" - И Код возврата равен 1 + И Код возврата команды равен 1 Сценарий: Выполнение команды с параметрами Допустим я выключаю отладку библиотеки "commands" @@ -18,4 +18,4 @@ И Я выполняю команду "git" Тогда Я сообщаю вывод команды И Вывод команды содержит "version" - И Код возврата равен 0 + И Код возврата команды равен 0 diff --git "a/features/\320\232\320\276\320\274\320\260\320\275\320\264\320\275\321\213\320\265\320\244\320\260\320\271\320\273\321\213.feature" "b/features/\320\232\320\276\320\274\320\260\320\275\320\264\320\275\321\213\320\265\320\244\320\260\320\271\320\273\321\213.feature" new file mode 100644 index 0000000..3d61c29 --- /dev/null +++ "b/features/\320\232\320\276\320\274\320\260\320\275\320\264\320\275\321\213\320\265\320\244\320\260\320\271\320\273\321\213.feature" @@ -0,0 +1,17 @@ +# language: ru + +Функциональность: Выполнение командных файлов + +Как разработчик +Я хочу иметь возможность создавать и выполнять командные файлы +Чтобы я мог проще автоматизировать больше действий на OneScript + +Сценарий: Выполнение простого командного файла + Допустим Я включаю отладку библиотеки "commands" + Когда Я создаю командный файл + И Я добавляю строку "chcp 1251" в командный файл + И Я добавляю строку "echo командный файл" в командный файл + И Я сообщаю содержимое командного файла + И Я выполняю командный файл + Тогда Вывод командного файла содержит "командный файл" + И Код возврата командного файла равен 0 diff --git a/lib.config b/lib.config index 925e57e..5346f75 100644 --- a/lib.config +++ b/lib.config @@ -1,3 +1,4 @@ - - + + + \ No newline at end of file diff --git a/packagedef b/packagedef index 7a80e59..3c72dcd 100644 --- a/packagedef +++ b/packagedef @@ -1,10 +1,8 @@  Описание.Имя("commands") - .Версия("0.1") + .Версия("0.5") .ЗависитОт("logos") .ЗависитОт("asserts") - .ЗависитОт("cmdline") .ЗависитОт("tempfiles") .ВключитьФайл("src") - .ВключитьФайл("tests"); .ВключитьФайл("features"); diff --git a/readme.md b/readme.md new file mode 100644 index 0000000..3e6e353 --- /dev/null +++ b/readme.md @@ -0,0 +1,36 @@ +# commands + +## Библиотека для упрощения работы c запуском различных приложений и командных файлов (cmd, bat, bash) из oscript. + +Позволяет выполнять рутинные операции по запуску приложений и командных файлов системы. + +Пример работы: +```bsl +Команда = Новый Команда; +Команда.УстановитьКоманду("oscript"); + +Команда.ДобавитьПараметр("-version"); + +КодВозврата = Команда.Выполнить(); +Сообщить(КодВозврата); + +Сообщить(Команда.ПолучитьВывод()); +``` + +или запуск командного файла +```bsl +КомандныйФайл = Новый КомандныйФайл; +КомандныйФайл.Создать(); + +КомандныйФайл.ДобавитьКоманду("@echo off"); +КомандныйФайл.ДобавитьКоманду("oscript -version"); + +Сообщить(КомандныйФайл.ПолучитьСодержимоеФайла()); + +КодВозврата = КомандныйФайл.Выполнить(); +Сообщить(КодВозврата); + +Сообщить(КомандныйФайл.ПолучитьВывод()); +``` + +Так же описание функциональности содержится в папке `features`. В прилагающихся `step_definitions` можно подсмотреть больше примеров. diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260.os" "b/src/\320\232\320\276\320\274\320\260\320\275\320\264\320\260.os" similarity index 85% rename from "src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260.os" rename to "src/\320\232\320\276\320\274\320\260\320\275\320\264\320\260.os" index f037ca7..5e7b8b9 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260.os" +++ "b/src/\320\232\320\276\320\274\320\260\320\275\320\264\320\260.os" @@ -8,6 +8,7 @@ Перем мПараметры; Перем мРабочийКаталог; Перем мВыводКоманды; +Перем мКодировкаВывода; Перем мКодВозврата; Перем ЭтоWindows; @@ -73,6 +74,23 @@ Возврат мКодВозврата; КонецФункции +// Установить кодировку вывода для выполнения команды. +// +// Параметры: +// Строка - кодировка вывода +// +Процедура УстановитьКодировкуВывода(Знач НоваяКодировкаВывода) Экспорт + мКодировкаВывода = НоваяКодировкаВывода; +КонецПроцедуры + +// Получить кодировка вывода выполняемой команды. +// +// Возвращаемое значение: +// Строка - кодировка вывода команды +// +Функция ПолучитьКодировкуВывода() Экспорт + Возврат мКодировкаВывода; +КонецФункции // Получить текущий рабочий каталог. // @@ -83,6 +101,24 @@ Возврат мРабочийКаталог; КонецФункции +// Оборачивает переданную строку в кавычки, если она еще не обернута. +// +// Параметры: +// Строка - Строка - Входящая строка +// +// Возвращаемое значение: +// Строка - Строка, обернутая в кавычки +// +Функция ОбернутьВКавычки(Знач Строка) Экспорт + + Если Лев(Строка, 1) = """" и Прав(Строка, 1) = """" Тогда + Возврат Строка; + Иначе + Возврат """" + Строка + """"; + КонецЕсли; + +КонецФункции + ////////////////////////////////////////////////////////////////////////// // Служебные процедуры и функции @@ -128,8 +164,11 @@ КонецЦикла; - Приложение = ОбернутьВКавычки(ПутьПриложения); - Лог.Отладка(Приложение + СтрокаДляЛога); + Приложение = ПутьПриложения; + Если Найти(Приложение, " ") > 0 Тогда + Приложение = ОбернутьВКавычки(Приложение); + КонецЕсли; + Лог.Отладка("СтрокаЗапуска <%1>", Приложение + СтрокаДляЛога); // Если ЭтоWindows = Ложь Тогда // СтрокаЗапуска = "sh -c '" + Приложение + СтрокаЗапуска + "'"; @@ -140,7 +179,7 @@ ЗаписьXML = Новый ЗаписьXML(); ЗаписьXML.УстановитьСтроку(); - Процесс = СоздатьПроцесс(СтрокаЗапуска, мРабочийКаталог, Истина, Истина, КодировкаТекста.UTF8); + Процесс = СоздатьПроцесс(СтрокаЗапуска, мРабочийКаталог, Истина, Истина, мКодировкаВывода); Процесс.Запустить(); Пока НЕ Процесс.Завершен ИЛИ Процесс.ПотокВывода.ЕстьДанные Цикл @@ -155,24 +194,6 @@ КонецФункции -// Оборачивает переданную строку в кавычки, если она еще не обернута. -// -// Параметры: -// Строка - Строка - Входящая строка -// -// Возвращаемое значение: -// Строка - Строка, обернутая в кавычки -// -Функция ОбернутьВКавычки(Знач Строка) - - Если Лев(Строка, 1) = """" и Прав(Строка, 1) = """" Тогда - Возврат Строка; - Иначе - Возврат """" + Строка + """"; - КонецЕсли; - -КонецФункции - // Инициализация работы библиотеки. // Задает минимальные настройки. // @@ -185,9 +206,9 @@ мРабочийКаталог = "."; мВыводКоманды = ""; + мКодировкаВывода = КодировкаТекста.UTF8; мПараметры = Новый Массив; КонецПроцедуры Инициализация(); - diff --git "a/src/\320\232\320\276\320\274\320\260\320\275\320\264\320\275\321\213\320\271\320\244\320\260\320\271\320\273.os" "b/src/\320\232\320\276\320\274\320\260\320\275\320\264\320\275\321\213\320\271\320\244\320\260\320\271\320\273.os" new file mode 100644 index 0000000..e730d74 --- /dev/null +++ "b/src/\320\232\320\276\320\274\320\260\320\275\320\264\320\275\321\213\320\271\320\244\320\260\320\271\320\273.os" @@ -0,0 +1,166 @@ +////////////////////////////////////////////////////////////////////////// +// Работа с командными файлами + +#Использовать tempfiles + +Перем мЗаписьТекста; +Перем мПуть; +Перем мКоманда; +Перем мТекстФайла; + +Перем ЭтоWindows; +Перем Лог; + +// Получить путь командного файла +// +// Возвращаемое значение: +// Строка - путь командного файла +// +Функция ПолучитьПуть() Экспорт + Возврат мПуть; +КонецФункции + +// Получить вывод выполненной команды. +// +// Возвращаемое значение: +// Строка - Вывод команды +// +Функция ПолучитьВывод() Экспорт + ПроверитьЧтоКомандаВыполнена(); + Возврат мКоманда.ПолучитьВывод(); +КонецФункции + +// Получить код возврата выполненной команды. +// +// Возвращаемое значение: +// Число - код возврата команды +// +Функция ПолучитьКодВозврата() Экспорт + ПроверитьЧтоКомандаВыполнена(); + Возврат мКоманда.ПолучитьКодВозврата(); +КонецФункции + +// Создать новый командный файл по переданному пути или создать новый временный файл +// +// Параметры: +// Путь - Строка - путь создаваемого файла. Необязательное значение. +// Если не задан, создается временный файл в каталоге временных файлов +// +// Возвращаемое значение: +// Строка - Путь созданного файла +// +Функция Создать(Знач Путь = "") Экспорт + + Если ПустаяСтрока(Путь) Тогда + мПуть = ВременныеФайлы.НовоеИмяФайла(?(ЭтоWindows, ".bat", ".sh")); + Лог.Отладка("КомандныйФайл: задаю временный путь командного файла <%1>.", мПуть); + Иначе + мПуть = Путь; + Лог.Отладка("КомандныйФайл: использую путь командного файла <%1>.", мПуть); + КонецЕсли; + Кодировка = ?(ЭтоWindows, "cp866", КодировкаТекста.UTF8NoBOM); + Если ЭтоWindows Тогда + мЗаписьТекста = Новый ЗаписьТекста(мПуть, Кодировка); + Иначе + мЗаписьТекста = Новый ЗаписьТекста(мПуть, Кодировка, , , Символы.ПС); + КонецЕсли; + + мТекстФайла = ""; + + Возврат мПуть; + +КонецФункции + +// Добавить очередную команду в командный файл +// +// Параметры: +// Команда - Строка - очередная команда +// +Процедура ДобавитьКоманду(Знач Команда) Экспорт + ПроверитьЧтоФайлОткрыт(); + мЗаписьТекста.ЗаписатьСтроку(Команда); + мТекстФайла = мТекстФайла + Команда + Символы.ПС; +КонецПроцедуры + +// Выполнить командный файл и вернуть код возврата +// +// Возвращаемое значение: +// Число - код возврата +// +Функция Выполнить() Экспорт + + Закрыть(); + + мКоманда = Новый Команда; + мКоманда.УстановитьКодировкуВывода(КодировкаТекста.OEM); + + Если ЭтоWindows Тогда + Приложение = "cmd.exe"; + СтрокаЗапуска = "/C ""%1"""; + Иначе + Приложение = "sh"; + СтрокаЗапуска = "'%1'"; + КонецЕсли; + мКоманда.УстановитьКоманду(Приложение); + мКоманда.ДобавитьПараметр(СтрШаблон(СтрокаЗапуска, мПуть)); + + КодВозврата = мКоманда.Выполнить(); + + Возврат КодВозврата; + +КонецФункции + +// Завершает запись командного файла +// +// Возвращаемое значение: +// Строка - путь командного файла +// +Функция Закрыть() Экспорт + + Если мЗаписьТекста <> Неопределено Тогда + мЗаписьТекста.Закрыть(); + мЗаписьТекста = Неопределено; + КонецЕсли; + + Возврат мПуть; + +КонецФункции + +// Получить текст командного файла +// +// Возвращаемое значение: +// Строка - текст командного файла +// +Функция ПолучитьТекстФайла() Экспорт + Возврат мТекстФайла; +КонецФункции + +////////////////////////////////////////////////////////////////////////// +// Служебные процедуры и функции + +Процедура ПроверитьЧтоФайлОткрыт() + Если мЗаписьТекста = Неопределено Тогда + Создать(); + КонецЕсли; +КонецПроцедуры + +Процедура ПроверитьЧтоКомандаВыполнена() + Если Не ЗначениеЗаполнено(мКоманда) Тогда + ВызватьИсключение СтрШаблон("Команда еще не выполнялась. <%1>", мПуть); + КонецЕсли; +КонецПроцедуры + +// Инициализация работы библиотеки. +// Задает минимальные настройки. +// +Процедура Инициализация() + + Лог = Логирование.ПолучитьЛог("oscript.lib.commands"); + + СистемнаяИнформация = Новый СистемнаяИнформация; + ЭтоWindows = Найти(НРег(СистемнаяИнформация.ВерсияОС), "windows") > 0; + + мТекстФайла = ""; +КонецПроцедуры + +Инициализация();