diff --git a/.gitignore b/.gitignore
index 29d8318..100d358 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,4 @@
 exec.log
 bdd-log.xml
+*.ospx
+coverage/
diff --git a/Jenkinsfile b/Jenkinsfile
new file mode 100644
index 0000000..ddcd33c
--- /dev/null
+++ b/Jenkinsfile
@@ -0,0 +1,94 @@
+
+pipeline {
+    agent none
+    options {
+        buildDiscarder(logRotator(numToKeepStr: '7'))
+        skipDefaultCheckout()
+    }
+    
+    stages {
+        stage('Тестирование кода пакета WIN') {
+
+            agent { label 'windows' }
+
+            steps {
+                checkout scm
+                
+                script {
+                    if( fileExists ('tasks/test.os') ){
+                        bat 'chcp 65001 > nul && oscript tasks/test.os'
+
+                        junit allowEmptyResults: true, testResults: 'tests.xml'
+                        junit allowEmptyResults: true, testResults: 'bdd-log.xml'
+                    }
+                    else
+                        echo 'no testing task'
+                }
+                
+            }
+
+        }
+
+        stage('Тестирование кода пакета LINUX') {
+
+            agent { label 'master' }
+
+            steps {
+                echo 'under development'
+            }
+
+        }
+
+        stage('Сборка пакета') {
+
+            agent { label 'windows' }
+
+            steps {
+                checkout scm
+
+                bat 'erase /Q *.ospx'
+                bat 'chcp 65001 > nul && call opm build .'
+
+                stash includes: '*.ospx', name: 'package'
+                archiveArtifacts '*.ospx'
+            }
+
+        }
+        
+        stage('Публикация в хабе') {
+            when {
+                branch 'master'
+            }
+            agent { label 'master' }
+            steps {
+                sh 'rm -f *.ospx'
+                unstash 'package'
+
+                sh '''
+                artifact=`ls -1 *.ospx`
+                basename=`echo $artifact | sed -r 's/(.+)-.*(.ospx)/\\1/'`
+                cp $artifact $basename.ospx
+                sudo rsync -rv *.ospx /var/www/hub.oscript.io/download/$basename/
+                '''.stripIndent()
+            }
+        }
+
+        stage('Публикация в нестабильном хабе') {
+            when {
+                branch 'develop'
+            }
+            agent { label 'master' }
+            steps {
+                sh 'rm -f *.ospx'
+                unstash 'package'
+
+                sh '''
+                artifact=`ls -1 *.ospx`
+                basename=`echo $artifact | sed -r 's/(.+)-.*(.ospx)/\\1/'`
+                cp $artifact $basename.ospx
+                sudo rsync -rv *.ospx /var/www/hub.oscript.io/dev-channel/$basename/
+                '''.stripIndent()
+            }
+        }
+    }
+}
diff --git a/appveyor-runtests.cmd b/appveyor-runtests.cmd
index 32abd89..f7dc690 100644
--- a/appveyor-runtests.cmd
+++ b/appveyor-runtests.cmd
@@ -9,7 +9,7 @@ set OSCRIPT=%ProgramFiles(x86)%\OneScript
 @echo .
 
 @rem call 1bdd features -junit-out ./bdd-log.xml
-@call opm test
+@call oscript tasks/test.os
 
 @if %ERRORLEVEL%==2 GOTO good_exit_bdd
 @if %ERRORLEVEL%==0 GOTO good_exit_bdd
diff --git "a/features/step_definitions/\320\222\321\213\320\277\320\276\320\273\320\275\320\265\320\275\320\270\320\265\320\232\320\276\320\274\320\260\320\275\320\264\321\213.os" "b/features/step_definitions/\320\222\321\213\320\277\320\276\320\273\320\275\320\265\320\275\320\270\320\265\320\232\320\276\320\274\320\260\320\275\320\264\321\213.os"
index 3bf1b8b..12019bb 100644
--- "a/features/step_definitions/\320\222\321\213\320\277\320\276\320\273\320\275\320\265\320\275\320\270\320\265\320\232\320\276\320\274\320\260\320\275\320\264\321\213.os"
+++ "b/features/step_definitions/\320\222\321\213\320\277\320\276\320\273\320\275\320\265\320\275\320\270\320\265\320\232\320\276\320\274\320\260\320\275\320\264\321\213.os"
@@ -17,6 +17,9 @@
 	ВсеШаги.Добавить("ЯУстанавливаюОжидаемыйДиапазонКодовВозвратаОтДоДляКоманды");
 	ВсеШаги.Добавить("ЯУстанавливаюПериодОпросаЗавершенияКомандыВМиллисекунду");
 	ВсеШаги.Добавить("ЯСнимаюФлагПоказаНемедленногоВыводаКоманды");
+	ВсеШаги.Добавить("ЯПодключаюВыводКомандыВЛог");
+	ВсеШаги.Добавить("ЯПодключаюВыводВФайлДляЛога");
+	ВсеШаги.Добавить("ЯУстанавливаюФлагПоказаНемедленногоВыводаКоманды");
 
 	Возврат ВсеШаги;
 КонецФункции
@@ -89,6 +92,13 @@
 	Команда.ПоказыватьВыводНемедленно(Ложь);
 КонецПроцедуры
 
+//Я устанавливаю флаг показа немедленного вывода команды "oscript"
+Процедура ЯУстанавливаюФлагПоказаНемедленногоВыводаКоманды(Знач ИмяИлиТекстКоманды) Экспорт
+	Команда = ПолучитьКомандуИзКонтекста(ИмяИлиТекстКоманды);
+	
+	Команда.ПоказыватьВыводНемедленно(Истина);
+КонецПроцедуры
+
 //Я добавляю параметры для команды "oscript"
 //| -version |
 //| -encoding=utf-8 |
@@ -101,8 +111,34 @@
 	Команда.ДобавитьПараметры(МассивПараметров);
 КонецПроцедуры
 
+//Я подключаю вывод команды "oscript" в лог "ТестовыйЛог"
+Процедура ЯПодключаюВыводКомандыВЛог(Знач ИмяИлиТекстКоманды, Знач ИмяЛога) Экспорт
+	Команда = ПолучитьКомандуИзКонтекста(ИмяИлиТекстКоманды);
+	Команда.ДобавитьЛогВыводаКоманды(ИмяЛога);
+
+	НовыйЛог = Логирование.ПолучитьЛог(ИмяЛога);
+	НовыйЛог.УстановитьРаскладку(ЭтотОбъект);
+КонецПроцедуры
+
+//Я подключаю вывод в файл "лог1.Log" для лога "ТестовыйЛог"
+Процедура ЯПодключаюВыводВФайлДляЛога(Знач ПутьФайла, Знач ИмяЛога) Экспорт
+	НовыйЛог = Логирование.ПолучитьЛог(ИмяЛога);
+
+	ФайлЖурнала = Новый ВыводЛогаВФайл;
+    ФайлЖурнала.ОткрытьФайл(ПутьФайла);
+
+	НовыйЛог.ДобавитьСпособВывода(ФайлЖурнала);
+
+КонецПроцедуры
+
 // { Служебные функции
 
+Функция Форматировать(Знач Уровень, Знач Сообщение) Экспорт
+	
+	Возврат СтрШаблон("ФИЧА ВыполнениеКоманды: %1 - %2", УровниЛога.НаименованиеУровня(Уровень), Сообщение);
+	
+КонецФункции
+	
 Процедура ВыполнитьКоманду(Знач ИмяИлиТекстКоманды, Знач ИспользуемКомандныйПроцессор = Истина)
 	Команда = ПолучитьКомандуИзКонтекста(ИмяИлиТекстКоманды);
 	Команда.УстановитьИсполнениеЧерезКомандыСистемы(ИспользуемКомандныйПроцессор);
diff --git "a/features/step_definitions/\320\232\320\276\320\274\320\260\320\275\320\264\320\275\321\213\320\265\320\244\320\260\320\271\320\273\321\213.os" "b/features/step_definitions/\320\232\320\276\320\274\320\260\320\275\320\264\320\275\321\213\320\265\320\244\320\260\320\271\320\273\321\213.os"
index 5d26a8f..8ea8554 100644
--- "a/features/step_definitions/\320\232\320\276\320\274\320\260\320\275\320\264\320\275\321\213\320\265\320\244\320\260\320\271\320\273\321\213.os"
+++ "b/features/step_definitions/\320\232\320\276\320\274\320\260\320\275\320\264\320\275\321\213\320\265\320\244\320\260\320\271\320\273\321\213.os"
@@ -2,6 +2,8 @@
 #Использовать "../.."
 
 Перем БДД; //контекст фреймворка 1bdd
+Перем ЭтоWindows;
+Перем ПропускаюВЛинукс;
 
 // Метод выдает список шагов, реализованных в данном файле-шагов
 Функция ПолучитьСписокШагов(КонтекстФреймворкаBDD) Экспорт
@@ -10,11 +12,14 @@
 	ВсеШаги = Новый Массив;
 
 	ВсеШаги.Добавить("ЯСоздаюКомандныйФайл");
+	ВсеШаги.Добавить("ЯСоздаюКомандныйФайлPowerShell");
 	ВсеШаги.Добавить("ЯДобавляюСтрокуВКомандныйФайл");
 	ВсеШаги.Добавить("ЯСообщаюСодержимоеКомандногоФайла");
 	ВсеШаги.Добавить("ЯВыполняюКомандныйФайл");
 	ВсеШаги.Добавить("ВыводКомандногоФайлаСодержит");
 	ВсеШаги.Добавить("КодВозвратаКомандногоФайлаРавен");
+	ВсеШаги.Добавить("ЯУстанавливаюПриложениеЗапуска");
+	ВсеШаги.Добавить("ЯПропускаюЭтотСценарийВЛинукс");
 
 	Возврат ВсеШаги;
 КонецФункции
@@ -23,7 +28,7 @@
 
 // Процедура выполняется перед запуском каждого сценария
 Процедура ПередЗапускомСценария(Знач Узел) Экспорт
-	
+	ПропускаюВЛинукс = Ложь;
 КонецПроцедуры
 
 // Процедура выполняется после завершения каждого сценария
@@ -33,13 +38,31 @@
 
 //Я создаю командный файл
 Процедура ЯСоздаюКомандныйФайл() Экспорт
-	КомандныйФайл = Новый КомандныйФайл; 
-	КомандныйФайл.Создать();
-	БДД.СохранитьВКонтекст("КомандныйФайл", КомандныйФайл);
+	СоздатьФайл();
+КонецПроцедуры
+
+// Я пропускаю этот сценарий в Линукс
+Процедура  ЯПропускаюЭтотСценарийВЛинукс() Экспорт
+	ПропускаюВЛинукс = Истина;
+КонецПроцедуры
+
+//Я создаю командный файл PowerShell ""  ".ps1"
+Процедура ЯСоздаюКомандныйФайлPowerShell(Знач Путь="", Знач Расширение="") Экспорт
+	Если ПропускаюШагВЛинукс() Тогда
+		БДД.ВыполнитьШаг("Пропускаю шаг в Linux");
+		Возврат;
+	КонецЕсли;
+
+	СоздатьФайл(Путь,Расширение);
 КонецПроцедуры
 
 //я добавляю строку "echo командный файл" в командный файл
 Процедура ЯДобавляюСтрокуВКомандныйФайл(Знач СтрокаКоманды) Экспорт
+	Если ПропускаюШагВЛинукс() Тогда
+		БДД.ВыполнитьШаг("Пропускаю шаг в Linux");
+		Возврат;
+	КонецЕсли;
+
 	КомандныйФайл = БДД.ПолучитьИзКонтекста("КомандныйФайл");
 
 	КомандныйФайл.ДобавитьКоманду(СтрокаКоманды);
@@ -47,6 +70,11 @@
 
 //Я выполняю командный файл
 Процедура ЯВыполняюКомандныйФайл() Экспорт
+	Если ПропускаюШагВЛинукс() Тогда
+		БДД.ВыполнитьШаг("Пропускаю шаг в Linux");
+		Возврат;
+	КонецЕсли;
+
 	КомандныйФайл = БДД.ПолучитьИзКонтекста("КомандныйФайл");
 
 	КомандныйФайл.Исполнить();
@@ -54,11 +82,20 @@
 
 //Я сообщаю содержимое файла "ИмяФайла"
 Процедура ЯСообщаюСодержимоеФайла(Знач ИмяФайла) Экспорт
+	Если ПропускаюШагВЛинукс() Тогда
+		БДД.ВыполнитьШаг("Пропускаю шаг в Linux");
+		Возврат;
+	КонецЕсли;
+
 	ВывестиТекстФайла(ИмяФайла);
 КонецПроцедуры
 
 //Я сообщаю содержимое командного файла
 Процедура ЯСообщаюСодержимоеКомандногоФайла() Экспорт
+	Если ПропускаюШагВЛинукс() Тогда
+		БДД.ВыполнитьШаг("Пропускаю шаг в Linux");
+		Возврат;
+	КонецЕсли;
 	КомандныйФайл = БДД.ПолучитьИзКонтекста("КомандныйФайл");
 
 	ТекстФайла = КомандныйФайл.ПолучитьТекстФайла();
@@ -67,6 +104,11 @@
 
 //Вывод командного файла содержит "командный файл"
 Процедура ВыводКомандногоФайлаСодержит(Знач ОжидаемыйВыводКоманды) Экспорт
+	Если ПропускаюШагВЛинукс() Тогда
+		БДД.ВыполнитьШаг("Пропускаю шаг в Linux");
+		Возврат;
+	КонецЕсли;
+
 	КомандныйФайл = БДД.ПолучитьИзКонтекста("КомандныйФайл");
 
 	ВыводКоманды = КомандныйФайл.ПолучитьВывод();
@@ -75,11 +117,31 @@
 
 //Код возврата командного файла равен 0
 Процедура КодВозвратаКомандногоФайлаРавен(Знач ОжидаемыйКодВозврата) Экспорт
+	Если ПропускаюШагВЛинукс() Тогда
+		БДД.ВыполнитьШаг("Пропускаю шаг в Linux");
+		Возврат;
+	КонецЕсли;
+
 	КомандныйФайл = БДД.ПолучитьИзКонтекста("КомандныйФайл");
 
 	Ожидаем.Что(КомандныйФайл.ПолучитьКодВозврата(), "Код возврата").Равно(ОжидаемыйКодВозврата);
 КонецПроцедуры
 
+//Я устанавливаю приложение запуска "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe"
+Процедура ЯУстанавливаюПриложениеЗапуска(Знач ПутьПриложения="") Экспорт
+	Если ПропускаюШагВЛинукс() Тогда
+		БДД.ВыполнитьШаг("Пропускаю шаг в Linux");
+		Возврат;
+	КонецЕсли;
+
+	КомандныйФайл = БДД.ПолучитьИзКонтекста("КомандныйФайл");
+	Если КомандныйФайл=Неопределено Тогда
+		КомандныйФайл = Новый КомандныйФайл; 
+	КонецЕсли;
+	КомандныйФайл.УстановитьПриложение(ПутьПриложения);
+	БДД.СохранитьВКонтекст("КомандныйФайл", КомандныйФайл);
+КонецПроцедуры
+
 
 Процедура ВывестиТекстФайла(Знач ИмяФайла, Знач Кодировка = Неопределено)
 
@@ -87,15 +149,34 @@
 	Если НЕ Файл.Существует() Тогда
 		Возврат;
 	КонецЕсли;
-	
+
 	Если Кодировка = Неопределено Тогда
 		Кодировка = "utf-8";
 	КонецЕсли;
-	
+
 	ЧТ = Новый ЧтениеТекста(ИмяФайла, Кодировка);
 	СтрокаФайла = ЧТ.Прочитать();
 	ЧТ.Закрыть();
-	
+
 	Сообщить(СтрокаФайла);
 
 КонецПроцедуры
+
+Процедура СоздатьФайл(Знач Путь="", Знач Расширение="")
+	КомандныйФайл = БДД.ПолучитьИзКонтекста("КомандныйФайл");
+	Если КомандныйФайл=Неопределено Тогда
+		КомандныйФайл = Новый КомандныйФайл; 
+	КонецЕсли;
+	
+	КомандныйФайл.Создать(Путь,Расширение);
+	БДД.СохранитьВКонтекст("КомандныйФайл", КомандныйФайл);	
+КонецПроцедуры
+
+Функция ПропускаюШагВЛинукс()
+	Если ЭтоWindows = Неопределено Тогда
+		СистемнаяИнформация = Новый СистемнаяИнформация;
+		ЭтоWindows = Найти(НРег(СистемнаяИнформация.ВерсияОС), "windows") > 0;
+	КонецЕсли;
+
+	Возврат ПропускаюВЛинукс И НЕ ЭтоWindows;
+КонецФункции // ЭтоWindows()
diff --git "a/features/\320\222\321\213\320\277\320\276\320\273\320\275\320\265\320\275\320\270\320\265\320\232\320\276\320\274\320\260\320\275\320\264\321\213.feature" "b/features/\320\222\321\213\320\277\320\276\320\273\320\275\320\265\320\275\320\270\320\265\320\232\320\276\320\274\320\260\320\275\320\264\321\213.feature"
index 09f06e4..d0d5e81 100644
--- "a/features/\320\222\321\213\320\277\320\276\320\273\320\275\320\265\320\275\320\270\320\265\320\232\320\276\320\274\320\260\320\275\320\264\321\213.feature"
+++ "b/features/\320\222\321\213\320\277\320\276\320\273\320\275\320\265\320\275\320\270\320\265\320\232\320\276\320\274\320\260\320\275\320\264\321\213.feature"
@@ -71,3 +71,53 @@
     Когда Я устанавливаю ожидаемый диапазон кодов возврата от 1 до 10 для команды "oscript"
     Тогда Я получаю исключение при выполнении команды "oscript"
     И Код возврата команды "oscript" равен 0
+
+Сценарий: Выполнение команды с выводом в отдельный лог
+    Допустим Я создаю временный каталог и сохраняю его в контекст
+    И Я устанавливаю временный каталог как рабочий каталог
+    И Я установил рабочий каталог как текущий каталог
+    
+    Допустим Я подключаю вывод команды "oscript" в лог "ТестовыйЛог"
+    И Я подключаю вывод в файл "лог1.Log" для лога "ТестовыйЛог"
+    И Я добавляю параметр "-version" для команды "oscript"
+    
+    Когда Я выполняю команду "oscript"
+    Тогда я не вижу в консоли строку подобно "(\d+\.){3}\d+"
+    Тогда я не вижу в консоли вывод "ФИЧА ВыполнениеКоманды"
+    И Код возврата команды "oscript" равен 0
+    И Файл "лог1.Log" содержит "ФИЧА ВыполнениеКоманды"
+
+Сценарий: Выполнение команды с выводом в отдельные логи
+    Допустим Я создаю временный каталог и сохраняю его в контекст
+    И Я устанавливаю временный каталог как рабочий каталог
+    И Я установил рабочий каталог как текущий каталог
+
+    Допустим Я подключаю вывод команды "oscript" в лог "ТестовыйЛог"
+    И Я подключаю вывод в файл "лог1.Log" для лога "ТестовыйЛог"
+    И Я подключаю вывод в файл "лог2.txt" для лога "ТестовыйЛог2"
+    Допустим Я подключаю вывод команды "oscript" в лог "ТестовыйЛог2"
+    И Я добавляю параметр "-version" для команды "oscript"
+    
+    Когда Я выполняю команду "oscript"
+    Тогда я не вижу в консоли строку подобно "(\d+\.){3}\d+"
+    Тогда я не вижу в консоли вывод "ФИЧА ВыполнениеКоманды"
+    И Код возврата команды "oscript" равен 0
+    И Файл "лог1.Log" содержит "ФИЧА ВыполнениеКоманды"
+    И Файл "лог2.txt" содержит "ФИЧА ВыполнениеКоманды"
+
+Сценарий: Выполнение команды с выводом в отдельный лог при включенном немедленном выводом команды
+    Допустим Я создаю временный каталог и сохраняю его в контекст
+    И Я устанавливаю временный каталог как рабочий каталог
+    И Я установил рабочий каталог как текущий каталог
+
+    Допустим Я устанавливаю флаг показа немедленного вывода команды "oscript"
+    Допустим Я подключаю вывод команды "oscript" в лог "ТестовыйЛог"
+    И Я подключаю вывод в файл "лог1.Log" для лога "ТестовыйЛог"
+    И Я добавляю параметр "-version" для команды "oscript"
+    
+    Когда Я выполняю команду "oscript"
+    Тогда я не вижу в консоли строку подобно "(\d+\.){3}\d+"
+    Тогда я не вижу в консоли вывод "ФИЧА ВыполнениеКоманды"
+    И Код возврата команды "oscript" равен 0
+
+    И Файл "лог1.Log" содержит "ФИЧА ВыполнениеКоманды"
diff --git "a/features/\320\232\320\276\320\274\320\260\320\275\320\264\320\275\321\213\320\265\320\244\320\260\320\271\320\273\321\213.feature" "b/features/\320\232\320\276\320\274\320\260\320\275\320\264\320\275\321\213\320\265\320\244\320\260\320\271\320\273\321\213.feature"
index 853efbd..8ad0dfb 100644
--- "a/features/\320\232\320\276\320\274\320\260\320\275\320\264\320\275\321\213\320\265\320\244\320\260\320\271\320\273\321\213.feature"
+++ "b/features/\320\232\320\276\320\274\320\260\320\275\320\264\320\275\321\213\320\265\320\244\320\260\320\271\320\273\321\213.feature"
@@ -9,7 +9,17 @@
 Контекст: Отключение отладки в логах
     Допустим Я выключаю отладку лога с именем "oscript.lib.commands"
 
-Сценарий: Выполнение простого командного файла
+Сценарий: Выполнение командного файла PowerShell
+    Когда Я пропускаю этот сценарий в Линукс
+    И Я устанавливаю приложение запуска "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe"
+    И Я создаю командный файл PowerShell ""  ".ps1"
+    И Я добавляю строку "Write-Host PowerShell" в командный файл
+    И Я сообщаю содержимое командного файла
+    И Я выполняю командный файл
+    Тогда Вывод командного файла содержит "PowerShell"
+    И Код возврата командного файла равен 0
+
+Сценарий: Выполнение командного файла
     Когда Я создаю командный файл
     И Я добавляю строку "echo command file" в командный файл
     И Я сообщаю содержимое командного файла
diff --git a/packagedef b/packagedef
index 35474a7..848e66b 100644
--- a/packagedef
+++ b/packagedef
@@ -1,7 +1,7 @@
 
 Описание.Имя("1commands")
-		.Версия("1.2.1")
-		.ВерсияСреды("1.0.16")
+		.Версия("1.3.0")
+		.ВерсияСреды("1.0.17")
 		.ЗависитОт("logos")
 		.ЗависитОт("asserts")
 		.ЗависитОт("tempfiles")
@@ -10,4 +10,5 @@
 		.ВключитьФайл("readme.md")
 		.ВключитьФайл("LICENSE.md")
 		.ВключитьФайл("NOTICE")
+		.ВключитьФайл("packagedef")
 		.ВключитьФайл("lib.config");
diff --git a/readme.md b/readme.md
index 709d301..6f73bd1 100644
--- a/readme.md
+++ b/readme.md
@@ -3,7 +3,7 @@
 Обсудить [![Join the chat at https://gitter.im/EvilBeaver/oscript-library](https://badges.gitter.im/EvilBeaver/oscript-library.svg)](https://gitter.im/EvilBeaver/oscript-library?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![GitHub release](https://img.shields.io/github/release/artbear/1commands.svg)](https://github.com/artbear/1commands/releases) [![Build Status](http://build.oscript.io/buildStatus/icon?job=oscript-library/1commands/develop)](http://build.oscript.io/job/oscript-library/job/1commands/job/develop/) 
 [![Build status](https://ci.appveyor.com/api/projects/status/ervidk37h9m0tgs5?svg=true)](https://ci.appveyor.com/project/artbear/1commands)
 
-## Библиотека для упрощения работы c запуском различных приложений и командных файлов (cmd, bat, bash) из oscript.
+## Библиотека для упрощения работы c запуском различных приложений и командных файлов (cmd, bat, bash, PowerShell и др.) из oscript.
 
 Позволяет выполнять рутинные операции по запуску приложений и командных файлов системы.
 
@@ -30,7 +30,22 @@
 КомандныйФайл.ДобавитьКоманду("@echo off");	
 КомандныйФайл.ДобавитьКоманду("oscript -version");	
 
-Сообщить(КомандныйФайл.ПолучитьСодержимоеФайла());
+Сообщить(КомандныйФайл.ПолучитьТекстФайла());
+
+КодВозврата = КомандныйФайл.Исполнить();
+Сообщить(КодВозврата);
+
+Сообщить(КомандныйФайл.ПолучитьВывод());
+```
+или запуск командного файла PowerShell
+```bsl
+КомандныйФайл = Новый КомандныйФайл;
+КомандныйФайл.УстановитьПриложение("C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe");
+КомандныйФайл.Создать("",".ps1");
+
+КомандныйФайл.ДобавитьКоманду("Get-Help");		
+
+Сообщить(КомандныйФайл.ПолучитьТекстФайла());
 
 КодВозврата = КомандныйФайл.Исполнить();
 Сообщить(КодВозврата);
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 7e934ea..29b8270 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"
@@ -17,6 +17,7 @@
 Перем МаксимальныйОжидаемыйКодВозврата;
 Перем ПериодОпросаВМиллисекундах;
 Перем НемедленнныйВывод;
+Перем ПодключенныеЛоги;
 
 Перем ЭтоWindows;
 Перем Лог;
@@ -30,7 +31,12 @@
     
     ПроверитьВозможностьВыполненияКоманды();
     
-    КодВозврата = ЗапуститьИПодождать();
+	КодВозврата = ЗапуститьИПодождать();
+	
+	Для каждого ПодключенныйЛог Из ПодключенныеЛоги Цикл
+		ПодключенныйЛог.Закрыть();
+	КонецЦикла;
+
 	Лог.Отладка("Код возврата равен %1", КодВозврата);
     Возврат КодВозврата;
 
@@ -149,6 +155,22 @@
 	НемедленнныйВывод = НемедленныйПоказ;
 КонецПроцедуры
 
+// Устанавливает передачу вывода команды в дополнительный лог
+//
+// Параметры:
+//   ИмяЛогаИлиЛог - <Строка, Лог> - имя лога или объект лога
+//
+Процедура ДобавитьЛогВыводаКоманды(Знач ИмяЛогаИлиЛог) Экспорт
+
+	НовыйЛог = ИмяЛогаИлиЛог;
+	Если ТипЗнч(ИмяЛогаИлиЛог) = Тип("Строка") Тогда
+		НовыйЛог = Логирование.ПолучитьЛог(ИмяЛогаИлиЛог);
+	КонецЕсли;
+
+	ПодключенныеЛоги.Добавить(НовыйЛог);
+
+КонецПроцедуры
+
 // Установить ожидаемый код возврата
 // После исполнения команды будет выброшено исключение, если полученный код возврата не совпадает с ожидаемым
 //
@@ -353,12 +375,12 @@
 		КонецЕсли;
 
 		ОбработатьОчереднуюСтрокуВывода(Процесс.ПотокВывода, ЗаписьXML, "В цикле");
-		ОбработатьОчереднуюСтрокуВывода(Процесс.ПотокОшибок, ЗаписьXML, "В цикле");
+		ОбработатьОчереднуюСтрокуВывода(Процесс.ПотокОшибок, ЗаписьXML, "В цикле", Истина);
 
 	КонецЦикла;
 
 	ОбработатьОчереднуюСтрокуВывода(Процесс.ПотокВывода, ЗаписьXML, "После цикла");
-	ОбработатьОчереднуюСтрокуВывода(Процесс.ПотокОшибок, ЗаписьXML, "После цикла");
+	ОбработатьОчереднуюСтрокуВывода(Процесс.ПотокОшибок, ЗаписьXML, "После цикла", Истина);
 
 	РезультатРаботыПроцесса = ЗаписьXML.Закрыть();
 	Если Не НемедленнныйВывод Тогда
@@ -370,7 +392,7 @@
 	УстановитьВывод(РезультатРаботыПроцесса);
 КонецПроцедуры
 
-Функция ОбработатьОчереднуюСтрокуВывода(ПотокПроцесса, ЗаписьXML, Знач ПрефиксДляОтладки)
+Функция ОбработатьОчереднуюСтрокуВывода(ПотокПроцесса, ЗаписьXML, Знач ПрефиксДляОтладки, Знач ЭтоВыводОшибки = Ложь)
 	Рез = "";
 	Если ПотокПроцесса.ЕстьДанные Тогда
 		Рез = ПотокПроцесса.Прочитать();
@@ -378,11 +400,23 @@
 
 	Если Рез <> "" Тогда
 		Лог.Отладка("в цикле %2%1", Рез, Символы.ПС);
-		ЗаписьXML.ЗаписатьБезОбработки(Рез + Символы.ПС);
-		
-		Если НемедленнныйВывод Тогда
-			Сообщить(Рез);
+		Если ЗначениеЗаполнено(ПодключенныеЛоги) Тогда
+			Лог.Отладка("	Вывожу в отдельные логи");
+			Для каждого ПодключенныйЛог Из ПодключенныеЛоги Цикл
+				Если ЭтоВыводОшибки Тогда
+					ПодключенныйЛог.Ошибка(Рез);
+				Иначе
+					ПодключенныйЛог.Информация(Рез);
+				КонецЕсли;
+			КонецЦикла;
+		Иначе
+			ЗаписьXML.ЗаписатьБезОбработки(Рез + Символы.ПС);
+
+			Если НемедленнныйВывод Тогда
+				Сообщить(Рез);
+			КонецЕсли;
 		КонецЕсли;
+		
 	КонецЕсли;
 	
 	Возврат Рез;
@@ -392,11 +426,16 @@
 	Если ПроверяемКодВозврата Тогда
 		Если КодВозврата < МинимальныйОжидаемыйКодВозврата или КодВозврата > МаксимальныйОжидаемыйКодВозврата Тогда
 			Если МинимальныйОжидаемыйКодВозврата <> МаксимальныйОжидаемыйКодВозврата Тогда
-				ТекстОшибки = СтрШаблон("Ожидали, что код возврата <%1> команды <%2> совпадет с ожидаемым диапазоном <%3>-<%4>, а это не так", 
-					КодВозврата, Приложение, МинимальныйОжидаемыйКодВозврата, МаксимальныйОжидаемыйКодВозврата);
+				ТекстОшибки = СтрШаблон("Ожидали, что код возврата <%1> команды <%2> совпадет с ожидаемым диапазоном <%3>-<%4>, а это не так!
+					|Лог команды:
+					|%5", 
+					КодВозврата, Приложение, МинимальныйОжидаемыйКодВозврата, МаксимальныйОжидаемыйКодВозврата,
+					ПолучитьВывод());
 			Иначе
-				ТекстОшибки = СтрШаблон("Ожидали, что код возврата <%1> команды <%2> совпадет с ожидаемым <%3>, а это не так", 
-					КодВозврата, Приложение, МинимальныйОжидаемыйКодВозврата);
+				ТекстОшибки = СтрШаблон("Ожидали, что код возврата <%1> команды <%2> совпадет с ожидаемым <%3>, а это не так!
+					|Лог команды:
+					|%4", 
+					КодВозврата, Приложение, МинимальныйОжидаемыйКодВозврата, ПолучитьВывод());
 			КонецЕсли;
 			Ожидаем.Что(КодВозврата, СтрШаблон("%1, вывод %2", ТекстОшибки, ВыводКоманды)).
 				БольшеИлиРавно(МинимальныйОжидаемыйКодВозврата).
@@ -428,6 +467,8 @@
 
 	ПериодОпросаВМиллисекундах = 100;
 	НемедленнныйВывод = Ложь;
+
+	ПодключенныеЛоги = Новый Массив;
         
 КонецПроцедуры
 
diff --git "a/src/\320\232\320\276\320\274\320\260\320\275\320\264\320\275\321\213\320\271\320\244\320\260\320\271\320\273.os" "b/src/\320\232\320\276\320\274\320\260\320\275\320\264\320\275\321\213\320\271\320\244\320\260\320\271\320\273.os"
index 21625e0..46d74ba 100644
--- "a/src/\320\232\320\276\320\274\320\260\320\275\320\264\320\275\321\213\320\271\320\244\320\260\320\271\320\273.os"
+++ "b/src/\320\232\320\276\320\274\320\260\320\275\320\264\320\275\321\213\320\271\320\244\320\260\320\271\320\273.os"
@@ -7,6 +7,7 @@
 Перем ПутьКоманды;
 Перем Команда;
 Перем ТекстФайла;
+Перем Приложение;
 
 Перем ЭтоWindows;
 Перем Лог;
@@ -22,6 +23,20 @@
 	Возврат "oscript.lib.commands";
 КонецФункции
 
+// Установить путь к приложению.
+//
+//  Параметры:
+//   ПутьПриложения - Путь приложения (Строка)
+//  Например для запуска скриптов PowerShell
+//      Для 64bit PowerShell если стоит 64 битная система или 32bit PowerShell, если стоит 32 битная система
+//      "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe"
+//      Для 32bit PowerShell на 64 битных системах находится в папке:
+//      "C:\Windows\syswow64\Windowspowershell\v1.0\powershell.exe"
+//
+Процедура УстановитьПриложение(Знач ПутьПриложения) Экспорт
+	Приложение = ПутьПриложения;
+КонецПроцедуры // УстановитьПриложение()
+
 // Получить путь командного файла
 //
 // Возвращаемое значение:
@@ -75,14 +90,19 @@
 // Параметры:
 //   Путь - Строка - путь создаваемого файла. Необязательное значение.
 //		Если не задан, создается временный файл в каталоге временных файлов
+//   Расширение - Строка - расширение исполняемого командного файла.
+//      Если не задано, подставляется ".bat" для Windows или ".sh" для Linux.    
 //
 //  Возвращаемое значение:
 //   Строка - Путь созданного файла
 //
-Функция Создать(Знач Путь = "") Экспорт
+Функция Создать(Знач Путь = "", Знач Расширение="") Экспорт
 	
+	Если ПустаяСтрока(Расширение) Тогда
+		Расширение = ?(ЭтоWindows, ".bat", ".sh");
+	КонецЕсли;
 	Если ПустаяСтрока(Путь) Тогда
-		ПутьКоманды = ВременныеФайлы.НовоеИмяФайла(?(ЭтоWindows, ".bat", ".sh"));
+		ПутьКоманды = ВременныеФайлы.НовоеИмяФайла(Расширение);
 		Лог.Отладка("КомандныйФайл: задаю временный путь командного файла <%1>.", ПутьКоманды);
 	Иначе
 		ПутьКоманды = Путь;
@@ -125,7 +145,9 @@
 	Команда.УстановитьКодировкуВывода(КодировкаВывода);
 	Команда.ПоказыватьВыводНемедленно(НемедленнныйВывод);
 
-	Если ЭтоWindows Тогда 
+	Если ЗначениеЗаполнено(Приложение) Тогда
+		СтрокаЗапуска = """%1""";
+	ИначеЕсли ЭтоWindows Тогда 
 		Приложение = "cmd.exe";
 		СтрокаЗапуска = "/C ""%1""";
 	Иначе
diff --git a/tasks/coverage.os b/tasks/coverage.os
new file mode 100644
index 0000000..ca026d3
--- /dev/null
+++ b/tasks/coverage.os
@@ -0,0 +1,73 @@
+#Использовать 1commands
+#Использовать asserts
+#Использовать fs
+#Использовать json
+
+СистемнаяИнформация = Новый СистемнаяИнформация;
+ЭтоWindows = Найти(НРег(СистемнаяИнформация.ВерсияОС), "windows") > 0;
+
+ФС.ОбеспечитьПустойКаталог("coverage");
+ПутьКСтат = "coverage/stat.json";
+
+Команда = Новый Команда;
+Команда.УстановитьКоманду("oscript");
+Если НЕ ЭтоWindows Тогда
+	Команда.ДобавитьПараметр("-encoding=utf-8");
+КонецЕсли;
+Команда.ДобавитьПараметр(СтрШаблон("-codestat=%1", ПутьКСтат));    
+Команда.ДобавитьПараметр("tasks/test.os");
+Команда.ПоказыватьВыводНемедленно(Истина);    
+
+КодВозврата = Команда.Исполнить();
+Сообщить(Команда.ПолучитьВывод());
+Ожидаем.Что(КодВозврата).Равно(0);
+
+Файл_Стат = Новый Файл(ПутьКСтат);
+Ожидаем.Что(Файл_Стат.Существует(), СтрШаблон("Файл <%1> с результатами покрытия не существует!", Файл_Стат.ПолноеИмя)).ЭтоИстина();
+
+ЧтениеТекста = Новый ЧтениеТекста(ПутьКСтат, КодировкаТекста.UTF8);
+
+СтрокаJSON = ЧтениеТекста.Прочитать();
+ЧтениеТекста.Закрыть();
+
+Парсер = Новый ПарсерJSON();
+ДанныеПокрытия = Парсер.ПрочитатьJSON(СтрокаJSON);
+
+ЗаписьXML = Новый ЗаписьXML;
+ЗаписьXML.ОткрытьФайл("coverage/genericCoverage.xml");
+ЗаписьXML.ЗаписатьОбъявлениеXML();
+ЗаписьXML.ЗаписатьНачалоЭлемента("coverage");
+ЗаписьXML.ЗаписатьАтрибут("version", "1");
+
+Для Каждого Файл Из ДанныеПокрытия Цикл
+	
+	ДанныеФайла = Файл.Значение;
+	
+	ЗаписьXML.ЗаписатьНачалоЭлемента("file");
+	ЗаписьXML.ЗаписатьАтрибут("path", ДанныеФайла.Получить("#path"));
+	
+	Для Каждого КлючИЗначение Из ДанныеФайла Цикл
+		
+		Если КлючИЗначение.Ключ = "#path" Тогда
+			Продолжить;
+		КонецЕсли;
+		
+		ДанныеПроцедуры = КлючИЗначение.Значение;
+		Для Каждого ДанныеСтроки Из ДанныеПроцедуры Цикл
+			
+			ЗаписьXML.ЗаписатьНачалоЭлемента("lineToCover");
+			
+			ЗаписьXML.ЗаписатьАтрибут("lineNumber", ДанныеСтроки.Ключ);
+			Покрыто = Число(ДанныеСтроки.Значение.Получить("count")) > 0;
+			ЗаписьXML.ЗаписатьАтрибут("covered", Формат(Покрыто, "БИ=true; БЛ=false"));
+			
+			ЗаписьXML.ЗаписатьКонецЭлемента(); // lineToCover
+		КонецЦикла
+	КонецЦикла;
+	
+	ЗаписьXML.ЗаписатьКонецЭлемента(); // file
+	
+КонецЦикла;
+
+ЗаписьXML.ЗаписатьКонецЭлемента(); // coverage
+ЗаписьXML.Закрыть();
diff --git a/tasks/test.os b/tasks/test.os
index 8e7218c..5c8c4a9 100644
--- a/tasks/test.os
+++ b/tasks/test.os
@@ -15,7 +15,7 @@
 Если РезультатыВыполнения.Строки.Количество() > 0 Тогда
 	СтатусВыполнения = ИсполнительБДД.ПолучитьИтоговыйСтатусВыполнения(РезультатыВыполнения);
 
-	// ИсполнительБДД.ВывестиИтоговыеРезультатыВыполнения(РезультатыВыполнения, ФайлФичи.ЭтоКаталог());
+	ИсполнительБДД.ВывестиИтоговыеРезультатыВыполнения(РезультатыВыполнения, Файл_КаталогФич.ЭтоКаталог());
 КонецЕсли;
 
 ГенераторОтчетаJUnit = Новый ГенераторОтчетаJUnit;