Запустить программу. Запускает внешнюю программу в соответствии с параметрами запуска.
// Запускает внешнюю программу в соответствии с параметрами запуска.
//
// Параметры:
// КомандаЗапуска - Строка - командная строка для запуска программы.
// - Массив - первый элемент массива, путь к исполняемому приложению,
// остальные элементы массива - это передаваемые параметры,
// массив соответствует тому, который получит вызываемая программа в argv.
// ПараметрыЗапускаПрограммы - - Структура - См. ФайловаяСистема.ПараметрыЗапускаПрограммы
//
// Возвращаемое значение:
// Структура - где:
// * КодВозврата - Число - код возврата программы;
// * ПотокВывода - Строка - результат работы программы, направленный в поток stdout;
// * ПотокОшибок - Строка - ошибки исполнения программы, направленные в поток stderr.
//
// Пример:
// // Простой запуск
// ФайловаяСистема.ЗапуститьПрограмму("calc");
//
// // Запуск с ожиданием завершения
// ПараметрыЗапускаПрограммы = ФайловаяСистема.ПараметрыЗапускаПрограммы();
// ПараметрыЗапускаПрограммы.ДождатьсяЗавершения = Истина;
// ФайловаяСистема.ЗапуститьПрограмму("C:\Program Files\1cv8\common\1cestart.exe",
// ПараметрыЗапускаПрограммы);
//
// // Запуск с ожиданием завершения и получением потока вывода
// ПараметрыЗапускаПрограммы = ФайловаяСистема.ПараметрыЗапускаПрограммы();
// ПараметрыЗапускаПрограммы.ДождатьсяЗавершения = Истина;
// ПараметрыЗапускаПрограммы.ПолучитьПотокВывода = Истина;
// Результат = ФайловаяСистема("ping 127.0.0.1 -n 5", ПараметрыЗапускаПрограммы);
// ОбщегоНазначений.СообщитьПользователю(Результат.ПотокВывода);
//
// // Запуск с ожиданием завершения и получением потока вывода и с конкатенацией команды запуска
// ПараметрыЗапускаПрограммы = ФайловаяСистема.ПараметрыЗапускаПрограммы();
// ПараметрыЗапускаПрограммы.ДождатьсяЗавершения = Истина;
// ПараметрыЗапускаПрограммы.ПолучитьПотокВывода = Истина;
// КомандаЗапуска = Новый Массив;
// КомандаЗапуска.Добавить("ping");
// КомандаЗапуска.Добавить("127.0.0.1");
// КомандаЗапуска.Добавить("-n");
// КомандаЗапуска.Добавить(5);
// Результат = ФайловаяСистема.ЗапуститьПрограмму(КомандаЗапуска, ПараметрыЗапускаПрограммы);
// ОбщегоНазначений.СообщитьПользователю(Результат.ПотокВывода);
//
Функция ЗапуститьПрограмму(Знач КомандаЗапуска, ПараметрыЗапускаПрограммы = Неопределено) Экспорт
// АПК:534-выкл методы безопасного запуска обеспечиваются этой функцией
СтрокаКоманды = ОбщегоНазначенияСлужебныйКлиентСервер.БезопаснаяСтрокаКоманды(КомандаЗапуска);
Если ПараметрыЗапускаПрограммы = Неопределено Тогда
ПараметрыЗапускаПрограммы = ПараметрыЗапускаПрограммы();
КонецЕсли;
ТекущийКаталог = ПараметрыЗапускаПрограммы.ТекущийКаталог;
ДождатьсяЗавершения = ПараметрыЗапускаПрограммы.ДождатьсяЗавершения;
ПолучитьПотокВывода = ПараметрыЗапускаПрограммы.ПолучитьПотокВывода;
ПолучитьПотокОшибок = ПараметрыЗапускаПрограммы.ПолучитьПотокОшибок;
КодировкаПотоков = ПараметрыЗапускаПрограммы.КодировкаПотоков;
КодировкаИсполнения = ПараметрыЗапускаПрограммы.КодировкаИсполнения;
ПроверитьТекущийКаталог(СтрокаКоманды, ТекущийКаталог);
Если ДождатьсяЗавершения Тогда
Если ПолучитьПотокВывода Тогда
ИмяФайлаПотокаВывода = ПолучитьИмяВременногоФайла("stdout.tmp");
СтрокаКоманды = СтрокаКоманды + " > """ + ИмяФайлаПотокаВывода + """";
КонецЕсли;
Если ПолучитьПотокОшибок Тогда
ИмяФайлаПотокаОшибок = ПолучитьИмяВременногоФайла("stderr.tmp");
СтрокаКоманды = СтрокаКоманды + " 2>""" + ИмяФайлаПотокаОшибок + """";
КонецЕсли;
КонецЕсли;
Если КодировкаПотоков = Неопределено Тогда
КодировкаПотоков = КодировкаСтандартныхПотоков();
КонецЕсли;
КодВозврата = Неопределено;
Если ОбщегоНазначения.ЭтоWindowsСервер() Тогда
ИмяФайлаКоманды = ПолучитьИмяВременногоФайла("run.bat");
ТекстовыйДокумент = ОбщегоНазначенияСлужебныйКлиентСервер.НовыйФайлЗапускаКомандыWindows(
СтрокаКоманды, ТекущийКаталог, ДождатьсяЗавершения, КодировкаИсполнения);
ТекстовыйДокумент.Записать(ИмяФайлаКоманды, КодировкаПотоков);
Если ОбщегоНазначения.ИнформационнаяБазаФайловая() Тогда
// В файловой информационной базе показывать окно консоли не следует и в серверном контексте.
Оболочка = Новый COMОбъект("Wscript.Shell");
КодВозврата = Оболочка.Run(ИмяФайлаКоманды, 0, ДождатьсяЗавершения);
Оболочка = Неопределено;
Иначе
ЗапуститьПриложение(ИмяФайлаКоманды,, ДождатьсяЗавершения, КодВозврата);
КонецЕсли;
Если ДождатьсяЗавершения Тогда
// Автоматически удаление включено только в случае не ожидания завершения, т.к. код возврата там не интересен.
// В случае, когда нужен корректный код возврата автоматического удаления нет, потому следует удалить файл здесь.
УдалитьВременныйФайл(ИмяФайлаКоманды);
КонецЕсли;
Иначе
ЗапуститьПриложение(СтрокаКоманды, ТекущийКаталог, ДождатьсяЗавершения, КодВозврата);
КонецЕсли;
ПотокВывода = "";
ПотокОшибок = "";
Если ДождатьсяЗавершения Тогда
Если ПолучитьПотокВывода Тогда
ПотокВывода = ПрочитатьФайлЕслиСуществует(ИмяФайлаПотокаВывода, КодировкаПотоков);
УдалитьВременныйФайл(ИмяФайлаПотокаВывода);
КонецЕсли;
Если ПолучитьПотокОшибок Тогда
ПотокОшибок = ПрочитатьФайлЕслиСуществует(ИмяФайлаПотокаОшибок, КодировкаПотоков);
УдалитьВременныйФайл(ИмяФайлаПотокаОшибок);
КонецЕсли;
КонецЕсли;
Результат = Новый Структура;
Результат.Вставить("КодВозврата", КодВозврата);
Результат.Вставить("ПотокВывода", ПотокВывода);
Результат.Вставить("ПотокОшибок", ПотокОшибок);
Возврат Результат;
// АПК:534-вкл
КонецФункции
///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2019, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////
ЗапуститьПрограммуПриОбработкеОшибки (БСП)
ЗапуститьПрограммуПослеПроверкиРасширенияРаботыСФайлами (БСП)
ЗапуститьПрограммуПослеПроверкиСуществования (БСП)
ЗапуститьПрограммуПослеПроверкиЭтоКаталог (БСП)
ЗапуститьПрограммуПослеЗапускаПриложения (БСП)
Канал FastCode 1C в Телеграм! Шаблоны кода, статьи, полезные советы, курсы по 1С (8К участников)