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

Добавил возможность запуска командных файлов на язке PowerShell и др. #2

Merged
merged 6 commits into from
Oct 16, 2017
83 changes: 77 additions & 6 deletions features/step_definitions/КомандныеФайлы.os
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
#Использовать "../.."

Перем БДД; //контекст фреймворка 1bdd
Перем ЭтоWindows;

// Метод выдает список шагов, реализованных в данном файле-шагов
Функция ПолучитьСписокШагов(КонтекстФреймворкаBDD) Экспорт
Expand All @@ -10,11 +11,13 @@
ВсеШаги = Новый Массив;

ВсеШаги.Добавить("ЯСоздаюКомандныйФайл");
ВсеШаги.Добавить("ЯСоздаюКомандныйФайлPowerShell");
ВсеШаги.Добавить("ЯДобавляюСтрокуВКомандныйФайл");
ВсеШаги.Добавить("ЯСообщаюСодержимоеКомандногоФайла");
ВсеШаги.Добавить("ЯВыполняюКомандныйФайл");
ВсеШаги.Добавить("ВыводКомандногоФайлаСодержит");
ВсеШаги.Добавить("КодВозвратаКомандногоФайлаРавен");
ВсеШаги.Добавить("ЯУстанавливаюПриложениеЗапуска");

Возврат ВсеШаги;
КонецФункции
Expand All @@ -33,32 +36,54 @@

//Я создаю командный файл
Процедура ЯСоздаюКомандныйФайл() Экспорт
КомандныйФайл = Новый КомандныйФайл;
КомандныйФайл.Создать();
БДД.СохранитьВКонтекст("КомандныйФайл", КомандныйФайл);
СоздатьФайл();
КонецПроцедуры

//Я создаю командный файл PowerShell "" ".ps1"
Процедура ЯСоздаюКомандныйФайлPowerShell(Знач Путь="", Знач Расширение="") Экспорт
Если ПропускаюШагВЛинукс() Тогда
Возврат;
КонецЕсли;

СоздатьФайл(Путь,Расширение);
КонецПроцедуры

//я добавляю строку "echo командный файл" в командный файл
Процедура ЯДобавляюСтрокуВКомандныйФайл(Знач СтрокаКоманды) Экспорт
Если ПропускаюШагВЛинукс() Тогда
Возврат;
КонецЕсли;

КомандныйФайл = БДД.ПолучитьИзКонтекста("КомандныйФайл");

КомандныйФайл.ДобавитьКоманду(СтрокаКоманды);
КонецПроцедуры

//Я выполняю командный файл
Процедура ЯВыполняюКомандныйФайл() Экспорт
Если ПропускаюШагВЛинукс() Тогда
Возврат;
КонецЕсли;

КомандныйФайл = БДД.ПолучитьИзКонтекста("КомандныйФайл");

КомандныйФайл.Исполнить();
КонецПроцедуры

//Я сообщаю содержимое файла "ИмяФайла"
Процедура ЯСообщаюСодержимоеФайла(Знач ИмяФайла) Экспорт
Если ПропускаюШагВЛинукс() Тогда
Copy link
Member

Choose a reason for hiding this comment

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

Шаг Я сообщаю содержимое файла "ИмяФайла" является универсальным.
В него не нужно вставлять проверку на линукс, т.к. этот шаг должен работать в линукс

Возврат;
КонецЕсли;

ВывестиТекстФайла(ИмяФайла);
КонецПроцедуры

//Я сообщаю содержимое командного файла
Процедура ЯСообщаюСодержимоеКомандногоФайла() Экспорт
Если ПропускаюШагВЛинукс() Тогда
Copy link
Member

Choose a reason for hiding this comment

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

Шаг Я сообщаю содержимое командного файла является универсальным.
В него не нужно вставлять проверку на линукс, т.к. этот шаг должен работать в линукс

Возврат;
КонецЕсли;
КомандныйФайл = БДД.ПолучитьИзКонтекста("КомандныйФайл");

ТекстФайла = КомандныйФайл.ПолучитьТекстФайла();
Expand All @@ -67,6 +92,10 @@

//Вывод командного файла содержит "командный файл"
Процедура ВыводКомандногоФайлаСодержит(Знач ОжидаемыйВыводКоманды) Экспорт
Если ПропускаюШагВЛинукс() Тогда
Copy link
Member

Choose a reason for hiding this comment

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

Шаг Вывод командного файла содержит "командный файл" является универсальным.
В него не нужно вставлять проверку на линукс, т.к. этот шаг должен работать в линукс

Возврат;
КонецЕсли;

КомандныйФайл = БДД.ПолучитьИзКонтекста("КомандныйФайл");

ВыводКоманды = КомандныйФайл.ПолучитьВывод();
Expand All @@ -75,27 +104,69 @@

//Код возврата командного файла равен 0
Процедура КодВозвратаКомандногоФайлаРавен(Знач ОжидаемыйКодВозврата) Экспорт
Если ПропускаюШагВЛинукс() Тогда
Copy link
Member

Choose a reason for hiding this comment

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

Шаг Код возврата командного файла равен 0 является универсальным.
В него не нужно вставлять проверку на линукс, т.к. этот шаг должен работать в линукс

Copy link
Author

Choose a reason for hiding this comment

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

Да, но в сценарии с PowerShell в линуксе никого файла на этом шаге нет.
И тесты валятся.
Я поэтому и добавил проверку во все шаги.

Copy link
Author

Choose a reason for hiding this comment

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

В линуксе можно создать файл с расширением ps1, т.к. расширение ни на что не влияет.
Но тесты выпадут с ошибкой на шаге Я выполняю командный файл, т.к. Write-Host PowerShell в линукс не отработает.
Поэтому я изначально спрашивал, как пропустить весь сценарий под линукс.

Возврат;
КонецЕсли;

КомандныйФайл = БДД.ПолучитьИзКонтекста("КомандныйФайл");

Ожидаем.Что(КомандныйФайл.ПолучитьКодВозврата(), "Код возврата").Равно(ОжидаемыйКодВозврата);
КонецПроцедуры

//Я устанавливаю приложение запуска "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe"
Процедура ЯУстанавливаюПриложениеЗапуска(Знач ПутьПриложения="") Экспорт
Если ПропускаюШагВЛинукс() Тогда
Возврат;
КонецЕсли;

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


Процедура ВывестиТекстФайла(Знач ИмяФайла, Знач Кодировка = Неопределено)

Файл = Новый Файл(ИмяФайла);
Если НЕ Файл.Существует() Тогда
Возврат;
КонецЕсли;

Если Кодировка = Неопределено Тогда
Кодировка = "utf-8";
КонецЕсли;

ЧТ = Новый ЧтениеТекста(ИмяФайла, Кодировка);
СтрокаФайла = ЧТ.Прочитать();
ЧТ.Закрыть();

Сообщить(СтрокаФайла);

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

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

КомандныйФайл.Создать(Путь,Расширение);
БДД.СохранитьВКонтекст("КомандныйФайл", КомандныйФайл);
КонецПроцедуры

Функция ПропускаюШагВЛинукс()
Если НЕ ЗначениеЗаполнено(ЭтоWindows) Тогда
Copy link
Member

Choose a reason for hiding this comment

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

Проверка Если НЕ ЗначениеЗаполнено(ЭтоWindows) Тогда в Линуксе всегда будет срабатывать и выполнять код внутри блока Если.
Т.к. значение ЭтоWindows будет Ложь, а ЗначениеЗаполнено(Ложь) всегда выдает Истину :(

Предлагаю исправить на Если ЭтоWindows = Неопределено Тогда

Сделай это последнее исправления и я принимаю пулл-реквест!

СистемнаяИнформация = Новый СистемнаяИнформация;
ЭтоWindows = Найти(НРег(СистемнаяИнформация.ВерсияОС), "windows") > 0;
КонецЕсли;

Если НЕ ЭтоWindows Тогда
БДД.ВыполнитьШаг("Пропускаю шаг в Linux");
КонецЕсли;

Возврат НЕ ЭтоWindows;

КонецФункции // ЭтоWindows()
11 changes: 10 additions & 1 deletion features/КомандныеФайлы.feature
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,16 @@
Контекст: Отключение отладки в логах
Допустим Я выключаю отладку лога с именем "oscript.lib.commands"

Сценарий: Выполнение простого командного файла
Сценарий: Выполнение командного файла PowerShell
Когда Я устанавливаю приложение запуска "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe"
Copy link
Member

Choose a reason for hiding this comment

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

На Линуксе шаг упадет.
Предлагаю в реализацию шага ЯУстанавливаюПриложениеЗапуска добавить проверку на Линукс
Если Линукс, то отмечать шаг как пропущенный.

Это лучше, чем падающий тест

Copy link
Author

Choose a reason for hiding this comment

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

Тут наверно для Линукса надо вообще весь сценарий проускать, но я не представляю как.

Copy link
Member

Choose a reason for hiding this comment

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

Внутри кода реализации вызови спец.метод БДД.ВыполнитьШаг("Пропускаю шаг в Linux")
Документация на этот метод

ИМХО за счет того, что у нас нет реализации шага Пропускаю шаг в Linux, твой шаг/сценарий будет отмечен как пропущенный.

Попробуй.

Copy link
Author

Choose a reason for hiding this comment

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

В консоле добавляется сообщение "Пропускаю шаг в Linux".
В отчете bdd-log.xml шаг отмечается как status="passed".

И Я создаю командный файл PowerShell "" ".ps1"
И Я добавляю строку "Write-Host PowerShell" в командный файл
И Я сообщаю содержимое командного файла
И Я выполняю командный файл
Тогда Вывод командного файла содержит "PowerShell"
И Код возврата командного файла равен 0

Сценарий: Выполнение командного файла
Когда Я создаю командный файл
И Я добавляю строку "echo command file" в командный файл
И Я сообщаю содержимое командного файла
Expand Down
19 changes: 17 additions & 2 deletions readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -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](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.

Позволяет выполнять рутинные операции по запуску приложений и командных файлов системы.

Expand All @@ -30,7 +30,22 @@
КомандныйФайл.ДобавитьКоманду("@echo off");
КомандныйФайл.ДобавитьКоманду("oscript -version");

Сообщить(КомандныйФайл.ПолучитьСодержимоеФайла());
Сообщить(КомандныйФайл.ПолучитьТекстФайла());

КодВозврата = КомандныйФайл.Исполнить();
Сообщить(КодВозврата);

Сообщить(КомандныйФайл.ПолучитьВывод());
```
или запуск командного файла PowerShell
```bsl
КомандныйФайл = Новый КомандныйФайл;
КомандныйФайл.УстановитьПриложение("C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe");
КомандныйФайл.Создать("",".ps1");

КомандныйФайл.ДобавитьКоманду("Get-Help");

Сообщить(КомандныйФайл.ПолучитьТекстФайла());

КодВозврата = КомандныйФайл.Исполнить();
Сообщить(КодВозврата);
Expand Down
28 changes: 25 additions & 3 deletions src/КомандныйФайл.os
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
Перем ПутьКоманды;
Перем Команда;
Перем ТекстФайла;
Перем Приложение;

Перем ЭтоWindows;
Перем Лог;
Expand All @@ -22,6 +23,20 @@
Возврат "oscript.lib.commands";
КонецФункции

// Установить путь к приложению.
//
// Параметры:
// ПутьПриложения - Путь приложения (Строка)
Copy link
Member

Choose a reason for hiding this comment

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

Предлагаю добавить пример задания приложения в описание метода
"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe"

// Например для запуска скриптов 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"
//
Процедура УстановитьПриложение(Знач ПутьПриложения) Экспорт
Приложение = ПутьПриложения;
КонецПроцедуры // УстановитьПриложение()

// Получить путь командного файла
//
// Возвращаемое значение:
Expand Down Expand Up @@ -75,14 +90,19 @@
// Параметры:
// Путь - Строка - путь создаваемого файла. Необязательное значение.
// Если не задан, создается временный файл в каталоге временных файлов
// Расширение - Строка - расширение исполняемого командного файла.
// Если не задано, подставляется ".bat" для Windows или ".sh" для Linux.
//
// Возвращаемое значение:
// Строка - Путь созданного файла
//
Функция Создать(Знач Путь = "") Экспорт
Функция Создать(Знач Путь = "", Знач Расширение="") Экспорт

Если ПустаяСтрока(Расширение) Тогда
Расширение = ?(ЭтоWindows, ".bat", ".sh");
КонецЕсли;
Если ПустаяСтрока(Путь) Тогда
ПутьКоманды = ВременныеФайлы.НовоеИмяФайла(?(ЭтоWindows, ".bat", ".sh"));
ПутьКоманды = ВременныеФайлы.НовоеИмяФайла(Расширение);
Лог.Отладка("КомандныйФайл: задаю временный путь командного файла <%1>.", ПутьКоманды);
Иначе
ПутьКоманды = Путь;
Expand Down Expand Up @@ -125,7 +145,9 @@
Команда.УстановитьКодировкуВывода(КодировкаВывода);
Команда.ПоказыватьВыводНемедленно(НемедленнныйВывод);

Если ЭтоWindows Тогда
Если ЗначениеЗаполнено(Приложение) Тогда
СтрокаЗапуска = """%1""";
ИначеЕсли ЭтоWindows Тогда
Приложение = "cmd.exe";
СтрокаЗапуска = "/C ""%1""";
Иначе
Expand Down