diff --git "a/src/\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" index b3aa234..88c15c6 100644 --- "a/src/\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" @@ -4,6 +4,7 @@ #Использовать logos #Использовать asserts + Перем Приложение; Перем ИспользуетсяЕдинаяСтрокаЗапуска; Перем Параметры; @@ -19,6 +20,7 @@ Перем НемедленнныйВывод; Перем ПодключенныеЛоги; +Перем ВерсияБольшеИлиРавна21; Перем ЭтоWindows; Перем Лог; @@ -38,6 +40,23 @@ КонецФункции +// Запуск на выполнение процесса +// +// Возвращаемое значение: +// Процесс - объект класса Процесс +// +Функция ЗапуститьПроцесс() Экспорт + + ПроверитьВозможностьВыполненияКоманды(); + + Процесс = ЗапуститьПроцессКоманды(); + + Лог.Отладка("Запущен процесс с идентификатором <%1>", Процесс.Идентификатор); + + Возврат Процесс; + +КонецФункции + // Получить имя лога продукта // // Возвращаемое значение: @@ -304,48 +323,51 @@ ПерехватыватьПотоки = Истина; + Процесс = ЗапуститьПроцессКоманды(ПерехватыватьПотоки); + + ПолучитьВыводПокаПроцессИсполняется(Процесс); + + КодВозврата = Процесс.КодВозврата; + ПроверитьКодВозврата(КодВозврата); + + Возврат КодВозврата; + +КонецФункции + + +// Запустить команду в операционной системе с ожиданием ее выполнения +// +// Параметры: +// Параметры - Массив - Массив строковых аргументов, передаваемых в командную +// строку. Добавляются после исполняемого файла. +// +// Возвращаемое значение: +// Процесс - запущенный процесс +// +Функция ЗапуститьПроцессКоманды(ПерехватыватьПотоки = Ложь) + + СтрокаЗапуска = СформироватьСтрокуЗапускаПроцесса(); + Попытка - + Если КодировкаВывода = Неопределено Тогда Процесс = СоздатьПроцесс(СтрокаЗапуска, РабочийКаталог, ПерехватыватьПотоки, ПерехватыватьПотоки, , ПеременныеСреды()); Иначе - Процесс = СоздатьПроцесс(СтрокаЗапуска, РабочийКаталог, ПерехватыватьПотоки, ПерехватыватьПотоки, КодировкаВывода, ПеременныеСреды()); + Процесс = СоздатьПроцесс(СтрокаЗапуска, РабочийКаталог, ПерехватыватьПотоки, ПерехватыватьПотоки, КодировкаВывода, ПеременныеСреды()); КонецЕсли; + Исключение + Инфо = ИнформацияОбОшибке(); - // TODO код проверки на регулярку (ниже) убрать после выпуска релиза OneScript 1.0.21 - РегуляркаОшибкиПеременныхСреды = Новый РегулярноеВыражение("\(System\.ArgumentException\):[^:]+:.*HOME[^:]+:.*home"); - Если РегуляркаОшибкиПеременныхСреды.Совпадает(Инфо.Описание) Тогда - Лог.Предупреждение("Возникла ошибка, связанная с переменными среды при старте нового процесса - |В связи с багом в движке OneScript до версии 1.0.21 - |%1 - | - |Выполняю старт процесса без указания переменных среды.", Инфо.Описание); - - Лог.Отладка("Полное описание ошибки: - |%1", Инфо.ПодробноеОписаниеОшибки()); - - Если КодировкаВывода = Неопределено Тогда - Процесс = СоздатьПроцесс(СтрокаЗапуска, РабочийКаталог, ПерехватыватьПотоки, ПерехватыватьПотоки); - Иначе - Процесс = СоздатьПроцесс(СтрокаЗапуска, РабочийКаталог, ПерехватыватьПотоки, ПерехватыватьПотоки, КодировкаВывода); - КонецЕсли; - Иначе - ВызватьИсключение Инфо.ПодробноеОписаниеОшибки(); - КонецЕсли; + ВызватьИсключение Инфо.ПодробноеОписаниеОшибки(); КонецПопытки; - Процесс.Запустить(); + Процесс.Запустить(); - ПолучитьВыводПокаПроцессИсполняется(Процесс); - - КодВозврата = Процесс.КодВозврата; - ПроверитьКодВозврата(КодВозврата); - - Возврат КодВозврата; + Возврат Процесс; КонецФункции @@ -375,14 +397,14 @@ Если ИспользуемКомандныйПроцессор Тогда Если ЭтоWindows Тогда - ШаблонЗапуска = "cmd /c ""%1"""; + ШаблонЗапуска = "cmd /c %1"; Иначе ШаблонЗапуска = "sh -c '%1'"; КонецЕсли; СтрокаЗапуска = СтрШаблон(ШаблонЗапуска, СтрокаЗапуска); КонецЕсли; - Лог.Отладка("СтрокаЗапуска <%1>", СтрокаЗапуска); + Лог.Отладка("СтрокаЗапуска <%1>", СтрокаЗапуска); Возврат СтрокаЗапуска; КонецФункции // СформироватьСтрокуЗапускаПроцесса() @@ -482,7 +504,7 @@ РабочийКаталог = "."; ВыводКоманды = ""; - КодировкаВывода = Неопределено; //КодировкаТекста.UTF8; + КодировкаВывода = Неопределено;//КодировкаТекста.UTF8; Параметры = Новый Массив; ИспользуетсяЕдинаяСтрокаЗапуска = Ложь; @@ -495,7 +517,7 @@ НемедленнныйВывод = Ложь; ПодключенныеЛоги = Новый Массив; - + КонецПроцедуры Инициализация();