Skip to content

Commit

Permalink
ВыполнитьКомандуОС*СВыводом в линуксе не получает вывод (vanessa-open…
Browse files Browse the repository at this point in the history
…source#789)

* ВыполнитьКомандуОС*СВыводом в линуксе не получал вывод

Исправлено: Метод ВыполнитьКомандуОСБезПоказаЧерногоОкнаСВыводом()
в линуксе не получал вывод (stdout) выполненной команды и всегда
возвращал пустую строку.

* Выгрузил обрабтку в формате 8.3.10

* Удаление временных файлов защищено от исключений при вызове команды
  • Loading branch information
kuntashov authored Oct 26, 2020
1 parent 8a623bf commit f4674ee
Show file tree
Hide file tree
Showing 2 changed files with 154 additions and 29 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -93,14 +93,36 @@
// Возвращаемое значение:
// Число - Результат выполнения скрипта. 0 - если не было ошибок.
//
&НаКлиенте
Функция ВыполнитьКомандуОСБезПоказаЧерногоОкнаСВыводом(Знач ТекстКоманды, Знач ЖдатьОкончания = Истина,
Знач ИспользоватьКодировкуТекстаUTF8 = Истина, КонсольныйВывод = "") Экспорт

Если КонтекстЯдра.ЭтоLinux Тогда

КодВозврата = 0;
ЗапуститьПриложение(ТекстКоманды,, ЖдатьОкончания, КодВозврата);
Возврат КодВозврата;

ИмяФайлаВывода = ПолучитьИмяВременногоФайла("txt");
ВремКоманда = ТекстКоманды + " > """ + ИмяФайлаВывода + """";

Попытка

ЗапуститьПриложение(ВремКоманда,, ЖдатьОкончания, КодВозврата);

Если КодВозврата = 0 Тогда
КонсольныйВывод = ПрочитатьФайлКакТекст(ИмяФайлаВывода, ИспользоватьКодировкуТекстаUTF8);
КонецЕсли;

Исключение

УдалитьВременныйФайл(ИмяФайлаВывода);

ВызватьИсключение;

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

УдалитьВременныйФайл(ИмяФайлаВывода);

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

КонецЕсли;

Если ЖдатьОкончания = -1 Тогда
Expand Down Expand Up @@ -133,24 +155,37 @@

WshShell = ПолучитьWshShell();

Рез = WshShell.Run(ИмяВременногоФайлаКоманды, 0, ?(ЖдатьОкончания, -1, 0));
Если Рез = 0 Тогда
// команда выполнилась успешно
ЧТ = Новый ЧтениеТекста(ИмяФайлаВывода);
КонсольныйВывод = ЧТ.Прочитать();
ЧТ.Закрыть();
КонецЕсли;
Попытка

Рез = WshShell.Run(ИмяВременногоФайлаКоманды, 0, ?(ЖдатьОкончания, -1, 0));

Если Рез = 0 Тогда
// команда выполнилась успешно
КонсольныйВывод = ПрочитатьФайлКакТекст(ИмяФайлаВывода, ИспользоватьКодировкуТекстаUTF8);
КонецЕсли;

Исключение

УдалитьВременныйФайл(ИмяФайлаВывода);

Если ЖдатьОкончания И УдалятьФайл Тогда
//иначе удалять нельзя
УдалитьВременныйФайл(ИмяВременногоФайлаКоманды);
КонецЕсли;

ВызватьИсключение;

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

УдалитьВременныйФайл(ИмяФайлаВывода);

Если ЖдатьОкончания И УдалятьФайл Тогда
//иначе удалять нельзя
Если КонтекстЯдра.ЕстьПоддержкаАсинхронныхВызовов Тогда
// для скорости не удаляем временный файл, сервер потом удалит КонтекстЯдра.УдалитьФайлыКомандаСистемы(ИмяВременногоФайлаКоманды);
Иначе
УдалитьФайлы(ИмяВременногоФайлаКоманды);
КонецЕсли;
УдалитьВременныйФайл(ИмяВременногоФайлаКоманды);
КонецЕсли;

Возврат Рез;

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

// далее переменная WshShell будет закеширована, чтобы не создавать ComObject каждый раз
Expand Down Expand Up @@ -417,4 +452,30 @@

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

Функция ПрочитатьФайлКакТекст(ИмяФайла, ИспользоватьКодировкуТекстаUTF8)

Если ИспользоватьКодировкуТекстаUTF8 Тогда
ЧТ = Новый ЧтениеТекста(ИмяФайла, КодировкаТекста.UTF8);
Иначе
ЧТ = Новый ЧтениеТекста(ИмяФайла);
КонецЕсли;

СодержимоеФайла = ЧТ.Прочитать();

ЧТ.Закрыть();

Возврат СодержимоеФайла;

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

Процедура УдалитьВременныйФайл(ИмяФайла)

Если КонтекстЯдра.ЕстьПоддержкаАсинхронныхВызовов Тогда
// для скорости не удаляем временный файл, сервер потом удалит КонтекстЯдра.УдалитьФайлыКомандаСистемы(ИмяФайла);
Иначе
УдалитьФайлы(ИмяФайла);
КонецЕсли;

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

// } Helpers
Original file line number Diff line number Diff line change
Expand Up @@ -113,9 +113,32 @@
Знач ИспользоватьКодировкуТекстаUTF8 = Истина, КонсольныйВывод = "") Экспорт

Если КонтекстЯдра.ЭтоLinux Тогда

КодВозврата = 0;
ЗапуститьПриложение(ТекстКоманды,, ЖдатьОкончания, КодВозврата);
Возврат КодВозврата;

ИмяФайлаВывода = ПолучитьИмяВременногоФайла("txt");
ВремКоманда = ТекстКоманды + " > """ + ИмяФайлаВывода + """";

Попытка

ЗапуститьПриложение(ВремКоманда,, ЖдатьОкончания, КодВозврата);

Если КодВозврата = 0 Тогда
КонсольныйВывод = ПрочитатьФайлКакТекст(ИмяФайлаВывода, ИспользоватьКодировкуТекстаUTF8);
КонецЕсли;

Исключение

УдалитьВременныйФайл(ИмяФайлаВывода);

ВызватьИсключение;

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

УдалитьВременныйФайл(ИмяФайлаВывода);

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

КонецЕсли;

Если ЖдатьОкончания = -1 Тогда
Expand Down Expand Up @@ -148,24 +171,37 @@

WshShell = ПолучитьWshShell();

Рез = WshShell.Run(ИмяВременногоФайлаКоманды, 0, ?(ЖдатьОкончания, -1, 0));
Если Рез = 0 Тогда
// команда выполнилась успешно
ЧТ = Новый ЧтениеТекста(ИмяФайлаВывода);
КонсольныйВывод = ЧТ.Прочитать();
ЧТ.Закрыть();
КонецЕсли;
Попытка

Рез = WshShell.Run(ИмяВременногоФайлаКоманды, 0, ?(ЖдатьОкончания, -1, 0));

Если Рез = 0 Тогда
// команда выполнилась успешно
КонсольныйВывод = ПрочитатьФайлКакТекст(ИмяФайлаВывода, ИспользоватьКодировкуТекстаUTF8);
КонецЕсли;

Исключение

УдалитьВременныйФайл(ИмяФайлаВывода);

Если ЖдатьОкончания И УдалятьФайл Тогда
//иначе удалять нельзя
УдалитьВременныйФайл(ИмяВременногоФайлаКоманды);
КонецЕсли;

ВызватьИсключение;

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

УдалитьВременныйФайл(ИмяФайлаВывода);

Если ЖдатьОкончания И УдалятьФайл Тогда
//иначе удалять нельзя
Если КонтекстЯдра.ЕстьПоддержкаАсинхронныхВызовов Тогда
// для скорости не удаляем временный файл, сервер потом удалит КонтекстЯдра.УдалитьФайлыКомандаСистемы(ИмяВременногоФайлаКоманды);
Иначе
УдалитьФайлы(ИмяВременногоФайлаКоманды);
КонецЕсли;
УдалитьВременныйФайл(ИмяВременногоФайлаКоманды);
КонецЕсли;

Возврат Рез;

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

// далее переменная WshShell будет закеширована, чтобы не создавать ComObject каждый раз
Expand Down Expand Up @@ -447,4 +483,32 @@

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

&НаКлиенте
Функция ПрочитатьФайлКакТекст(ИмяФайла, ИспользоватьКодировкуТекстаUTF8)

Если ИспользоватьКодировкуТекстаUTF8 Тогда
ЧТ = Новый ЧтениеТекста(ИмяФайла, КодировкаТекста.UTF8);
Иначе
ЧТ = Новый ЧтениеТекста(ИмяФайла);
КонецЕсли;

СодержимоеФайла = ЧТ.Прочитать();

ЧТ.Закрыть();

Возврат СодержимоеФайла;

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

&НаКлиенте
Процедура УдалитьВременныйФайл(ИмяФайла)

Если КонтекстЯдра.ЕстьПоддержкаАсинхронныхВызовов Тогда
// для скорости не удаляем временный файл, сервер потом удалит КонтекстЯдра.УдалитьФайлыКомандаСистемы(ИмяФайла);
Иначе
УдалитьФайлы(ИмяФайла);
КонецЕсли;

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

// } Helpers

0 comments on commit f4674ee

Please sign in to comment.