Skip to content

Commit

Permalink
fix artbear#38 Запуска команды и получения процесса выполнения
Browse files Browse the repository at this point in the history
  • Loading branch information
khorevaa committed Jan 29, 2019
1 parent 649427d commit 43d19a0
Show file tree
Hide file tree
Showing 2 changed files with 72 additions and 33 deletions.
1 change: 1 addition & 0 deletions packagedef
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
.ВерсияСреды("1.0.17")
.ЗависитОт("logos")
.ЗависитОт("asserts")
.ЗависитОт("semver")
.ЗависитОт("tempfiles")
.ВключитьФайл("src")
.ВключитьФайл("features")
Expand Down
104 changes: 71 additions & 33 deletions src/Команда.os
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

#Использовать logos
#Использовать asserts
#Использовать semver

Перем Приложение;
Перем ИспользуетсяЕдинаяСтрокаЗапуска;
Expand All @@ -19,6 +20,7 @@
Перем НемедленнныйВывод;
Перем ПодключенныеЛоги;

Перем ВерсияБольшеИлиРавна21;
Перем ЭтоWindows;
Перем Лог;

Expand All @@ -38,6 +40,23 @@

КонецФункции

// Выполнение произвольной команды
//
// Возвращаемое значение:
// Число - код возврата команды
//
Функция ЗапуститьПроцесс() Экспорт

ПроверитьВозможностьВыполненияКоманды();

Процесс = ЗапуститьПроцессКоманды();

Лог.Отладка("Запущен процесс с идентификатором <%1>", Процесс.Идентификатор);

Возврат Процесс;

КонецФункции

// Получить имя лога продукта
//
// Возвращаемое значение:
Expand Down Expand Up @@ -304,48 +323,63 @@

ПерехватыватьПотоки = Истина;

Попытка

Если КодировкаВывода = Неопределено Тогда
Процесс = СоздатьПроцесс(СтрокаЗапуска, РабочийКаталог, ПерехватыватьПотоки, ПерехватыватьПотоки, , ПеременныеСреды());
Иначе
Процесс = СоздатьПроцесс(СтрокаЗапуска, РабочийКаталог, ПерехватыватьПотоки, ПерехватыватьПотоки, КодировкаВывода, ПеременныеСреды());
КонецЕсли;
Процесс = ЗапуститьПроцессКоманды(ПерехватыватьПотоки);

ПолучитьВыводПокаПроцессИсполняется(Процесс);

Исключение
Инфо = ИнформацияОбОшибке();
КодВозврата = Процесс.КодВозврата;
ПроверитьКодВозврата(КодВозврата);

// TODO код проверки на регулярку (ниже) убрать после выпуска релиза OneScript 1.0.21
РегуляркаОшибкиПеременныхСреды = Новый РегулярноеВыражение("\(System\.ArgumentException\):[^:]+:.*HOME[^:]+:.*home");
Если РегуляркаОшибкиПеременныхСреды.Совпадает(Инфо.Описание) Тогда
Лог.Предупреждение("Возникла ошибка, связанная с переменными среды при старте нового процесса
|В связи с багом в движке OneScript до версии 1.0.21
|%1
|
|Выполняю старт процесса без указания переменных среды.", Инфо.Описание);
Возврат КодВозврата;

КонецФункции

Лог.Отладка("Полное описание ошибки:
|%1", Инфо.ПодробноеОписаниеОшибки());

// Запустить команду в операционной системе с ожиданием ее выполнения
//
// Параметры:
// Параметры - Массив - Массив строковых аргументов, передаваемых в командную
// строку. Добавляются после исполняемого файла.
//
// Возвращаемое значение:
// Число - Код возврата приложения
//
Функция ЗапуститьПроцессКоманды(ПерехватыватьПотоки = Ложь)

СтрокаЗапуска = СформироватьСтрокуЗапускаПроцесса();

Попытка

Если ВерсияБольшеИлиРавна21 Тогда

Если КодировкаВывода = Неопределено Тогда
Процесс = СоздатьПроцесс(СтрокаЗапуска, РабочийКаталог, ПерехватыватьПотоки, ПерехватыватьПотоки);
Процесс = СоздатьПроцесс(СтрокаЗапуска, РабочийКаталог, ПерехватыватьПотоки, ПерехватыватьПотоки, , ПеременныеСреды());
Иначе
Процесс = СоздатьПроцесс(СтрокаЗапуска, РабочийКаталог, ПерехватыватьПотоки, ПерехватыватьПотоки, КодировкаВывода);
Процесс = СоздатьПроцесс(СтрокаЗапуска, РабочийКаталог, ПерехватыватьПотоки, ПерехватыватьПотоки, КодировкаВывода, ПеременныеСреды());
КонецЕсли;


Иначе
ВызватьИсключение Инфо.ПодробноеОписаниеОшибки();

Если КодировкаВывода = Неопределено Тогда
Процесс = СоздатьПроцесс(СтрокаЗапуска, РабочийКаталог, ПерехватыватьПотоки, ПерехватыватьПотоки);
Иначе
Процесс = СоздатьПроцесс(СтрокаЗапуска, РабочийКаталог, ПерехватыватьПотоки, ПерехватыватьПотоки, КодировкаВывода);
КонецЕсли;

КонецЕсли;

Исключение

Инфо = ИнформацияОбОшибке();

ВызватьИсключение Инфо.ПодробноеОписаниеОшибки();

КонецПопытки;

Процесс.Запустить();
Процесс.Запустить();

ПолучитьВыводПокаПроцессИсполняется(Процесс);

КодВозврата = Процесс.КодВозврата;
ПроверитьКодВозврата(КодВозврата);

Возврат КодВозврата;
Возврат Процесс;

КонецФункции

Expand Down Expand Up @@ -375,14 +409,14 @@

Если ИспользуемКомандныйПроцессор Тогда
Если ЭтоWindows Тогда
ШаблонЗапуска = "cmd /c ""%1""";
ШаблонЗапуска = "cmd /c %1";
Иначе
ШаблонЗапуска = "sh -c '%1'";
КонецЕсли;

СтрокаЗапуска = СтрШаблон(ШаблонЗапуска, СтрокаЗапуска);
КонецЕсли;
Лог.Отладка("СтрокаЗапуска <%1>", СтрокаЗапуска);
Лог.Отладка("СтрокаЗапуска <%1>", СтрокаЗапуска);

Возврат СтрокаЗапуска;
КонецФункции // СформироватьСтрокуЗапускаПроцесса()
Expand Down Expand Up @@ -482,7 +516,7 @@

РабочийКаталог = ".";
ВыводКоманды = "";
КодировкаВывода = Неопределено; //КодировкаТекста.UTF8;
КодировкаВывода = Неопределено;//КодировкаТекста.UTF8;
Параметры = Новый Массив;

ИспользуетсяЕдинаяСтрокаЗапуска = Ложь;
Expand All @@ -495,7 +529,11 @@
НемедленнныйВывод = Ложь;

ПодключенныеЛоги = Новый Массив;


СИ = Новый СистемнаяИнформация;
ТекущаяВерсия = Новый Версия(СИ.Версия);
ВерсияБольшеИлиРавна21 = ТекущаяВерсия.БольшеИлиРавны(Новый Версия("1.0.21"));

КонецПроцедуры

Инициализация();
Expand Down

0 comments on commit 43d19a0

Please sign in to comment.