Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix #38 Запуска команды и получения процесса выполнения #39

Merged
merged 3 commits into from
Mar 1, 2019
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
88 changes: 55 additions & 33 deletions src/Команда.os
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
#Использовать logos
#Использовать asserts


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Возврат КодВозврата;

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


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

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

Попытка

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


Исключение

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

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

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

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

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

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

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

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

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

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

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

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

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@khorevaa А вот с удаленной тобой строкой "cmd /c ""%1"""; что-то важное было связано.

сначала вроде бы не было кавычек, а затем они понадобились.

@nixel2007 @EvilBeaver не помните, почему они стояли?

ШаблонЗапуска = "cmd /c %1";
Иначе
ШаблонЗапуска = "sh -c '%1'";
КонецЕсли;

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

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

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

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

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

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