├── .gitignore
├── .vscode
├── settings.json
└── tasks.json
├── lib.config
├── packagedef
├── appveyor-runtests.cmd
├── features
├── step_definitions
│ ├── fixtures
│ │ ├── ДолгоеВыполнение.os
│ │ └── ОбработчикОжиданияПроцесса.os
│ ├── wait-handler.os
│ ├── КомандныеФайлы.os
│ └── ВыполнениеКоманды.os
├── opm-build.feature
├── КомандныеФайлы.feature
├── wait-handler.feature
└── ВыполнениеКоманды.feature
├── NOTICE
├── tasks
├── test-feature.os
├── test.os
└── coverage.os
├── appveyor.yml
├── Jenkinsfile
├── readme.md
├── src
├── КомандныйФайл.os
└── Команда.os
└── LICENSE.md
/.gitignore:
--------------------------------------------------------------------------------
1 | exec.log
2 | bdd-log.xml
3 | *.ospx
4 | coverage/
5 | oscript_modules/
6 |
--------------------------------------------------------------------------------
/.vscode/settings.json:
--------------------------------------------------------------------------------
1 | // Place your settings in this file to overwrite default and user settings.
2 | {
3 | "editor.rulers": [120]
4 | }
--------------------------------------------------------------------------------
/lib.config:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/packagedef:
--------------------------------------------------------------------------------
1 |
2 | Описание.Имя("1commands")
3 | .Версия("1.4.0")
4 | .ВерсияСреды("1.0.17")
5 | .ЗависитОт("logos")
6 | .ЗависитОт("asserts")
7 | .ЗависитОт("semver")
8 | .ЗависитОт("tempfiles")
9 | .ВключитьФайл("src")
10 | .ВключитьФайл("features")
11 | .ВключитьФайл("readme.md")
12 | .ВключитьФайл("LICENSE.md")
13 | .ВключитьФайл("NOTICE")
14 | .ВключитьФайл("packagedef")
15 | .ВключитьФайл("lib.config");
16 |
--------------------------------------------------------------------------------
/appveyor-runtests.cmd:
--------------------------------------------------------------------------------
1 | @echo on
2 | @chcp 65001
3 |
4 | set OSCRIPT=%ProgramFiles(x86)%\OneScript
5 |
6 | @echo .
7 | @echo ======================= ======================= ======================= =======================
8 | @echo .
9 | @echo .
10 |
11 | @rem call 1bdd features -junit-out ./bdd-log.xml
12 | @call oscript tasks/test.os
13 |
14 | @if %ERRORLEVEL%==2 GOTO good_exit_bdd
15 | @if %ERRORLEVEL%==0 GOTO good_exit_bdd
16 |
17 | dir .
18 |
19 | exit /B 1
20 |
21 | :good_exit_bdd
22 |
23 | dir .
24 |
25 | exit /B 0
26 |
--------------------------------------------------------------------------------
/features/step_definitions/fixtures/ДолгоеВыполнение.os:
--------------------------------------------------------------------------------
1 |
2 | Процедура Запустить(ВремяВыполнения)
3 |
4 | Ожидание = ТекущаяУниверсальнаяДатаВМиллисекундах() + ВремяВыполнения * 1000; // сек
5 |
6 | Пока Ожидание > ТекущаяУниверсальнаяДатаВМиллисекундах() Цикл
7 | Сообщить("Полезная работа");
8 | Приостановить(1000);
9 | КонецЦикла;
10 |
11 |
12 | КонецПроцедуры
13 |
14 | Если АргументыКоманднойСтроки.Количество() Тогда
15 |
16 | ВремяВыполнения = АргументыКоманднойСтроки[0];
17 | Запустить(ВремяВыполнения);
18 |
19 | КонецЕсли;
20 |
--------------------------------------------------------------------------------
/NOTICE:
--------------------------------------------------------------------------------
1 | This product contains parts of V8Runner, which is licensed under the Apache License,
2 | Version 2.0.
3 | The license can be downloaded from
4 | http://www.apache.org/licenses/LICENSE-2.0.html.
5 | The source code for this software is available from
6 | https://github.com/oscript-library/v8runner.
7 |
8 | This product contains parts of Gitsync, which is licensed under the Apache License,
9 | Version 2.0.
10 | The license can be downloaded from
11 | http://www.apache.org/licenses/LICENSE-2.0.html.
12 | The source code for this software is available from
13 | https://github.com/oscript-library/Gitsync.
14 |
--------------------------------------------------------------------------------
/features/step_definitions/fixtures/ОбработчикОжиданияПроцесса.os:
--------------------------------------------------------------------------------
1 |
2 | Перем Счетчик;
3 | Перем ТребуетсяОтказ;
4 |
5 | Функция ПолучитьСчетчик() Экспорт
6 | Возврат Счетчик;
7 | КонецФункции
8 |
9 | Процедура УстановитьОтказ() Экспорт
10 | ТребуетсяОтказ = Истина;
11 | КонецПроцедуры
12 |
13 | Процедура ОбработкаОжиданияПроцесса(Процесс, Отказ, ПериодОпроса, ДополнительныеПараметрыОбработчика, СтандартнаяОбработка) Экспорт
14 |
15 | Счетчик = Счетчик + 1;
16 |
17 | Если ТребуетсяОтказ Тогда
18 | Отказ = Истина;
19 | КонецЕсли;
20 |
21 | КонецПроцедуры
22 |
23 | Счетчик = 0;
24 | ТребуетсяОтказ = Ложь;
--------------------------------------------------------------------------------
/tasks/test-feature.os:
--------------------------------------------------------------------------------
1 | #Использовать ".."
2 | #Использовать 1bdd
3 |
4 | КаталогФич = ОбъединитьПути(".", "features");
5 | ПутьФичи = ОбъединитьПути(".", "features", АргументыКоманднойСтроки[0]);
6 | Файл_КаталогФич = Новый Файл(КаталогФич);
7 | ФайлФичи = Новый Файл(ПутьФичи);
8 |
9 | ИсполнительБДД = Новый ИсполнительБДД;
10 | РезультатВыполнения = ИсполнительБДД.ВыполнитьФичу(ФайлФичи, Файл_КаталогФич);
11 | ИтоговыйРезультатВыполнения = ИсполнительБДД.ПолучитьИтоговыйСтатусВыполнения(РезультатВыполнения);
12 |
13 | Сообщить(ИтоговыйРезультатВыполнения);
14 | Если ИтоговыйРезультатВыполнения = ИсполнительБДД.ВозможныеСтатусыВыполнения().Сломался Тогда
15 | ВызватьИсключение 1;
16 | КонецЕсли;
17 |
--------------------------------------------------------------------------------
/features/opm-build.feature:
--------------------------------------------------------------------------------
1 | # language: ru
2 |
3 | Функционал: Проверка сборки продукта
4 | Как Пользователь
5 | Я хочу автоматически проверять сборку моего продукта
6 | Чтобы гарантировать возможность установку моего продукта у пользователей
7 |
8 | Контекст: Отключение отладки в логах
9 | Допустим Я выключаю отладку лога с именем "oscript.lib.commands"
10 | И Я очищаю параметры команды "opm" в контексте
11 |
12 | Сценарий: Выполнение команды без параметров
13 | Когда Я добавляю параметр "build ." для команды "opm"
14 | И Я выполняю команду "opm"
15 | Тогда Вывод команды "opm" содержит "Сборка пакета завершена"
16 | И Вывод команды "opm" не содержит "Внешнее исключение"
17 | И Код возврата команды "opm" равен 0
18 |
--------------------------------------------------------------------------------
/tasks/test.os:
--------------------------------------------------------------------------------
1 | #Использовать ".."
2 | #Использовать 1bdd
3 |
4 | ПутьОтчетаJUnit = "./bdd-log.xml";
5 |
6 | КаталогФич = ОбъединитьПути(".", "features");
7 |
8 | Файл_КаталогФич = Новый Файл(КаталогФич);
9 |
10 | ИсполнительБДД = Новый ИсполнительБДД;
11 | РезультатыВыполнения = ИсполнительБДД.ВыполнитьФичу(Файл_КаталогФич, Файл_КаталогФич);
12 | ИтоговыйРезультатВыполнения = ИсполнительБДД.ПолучитьИтоговыйСтатусВыполнения(РезультатыВыполнения);
13 |
14 | СтатусВыполнения = ИсполнительБДД.ВозможныеСтатусыВыполнения().НеВыполнялся;
15 | Если РезультатыВыполнения.Строки.Количество() > 0 Тогда
16 | СтатусВыполнения = ИсполнительБДД.ПолучитьИтоговыйСтатусВыполнения(РезультатыВыполнения);
17 |
18 | ИсполнительБДД.ВывестиИтоговыеРезультатыВыполнения(РезультатыВыполнения, Файл_КаталогФич.ЭтоКаталог());
19 | КонецЕсли;
20 |
21 | ГенераторОтчетаJUnit = Новый ГенераторОтчетаJUnit;
22 | ГенераторОтчетаJUnit.Сформировать(РезультатыВыполнения, СтатусВыполнения, ПутьОтчетаJUnit);
23 |
24 | Сообщить(ИтоговыйРезультатВыполнения);
25 | Если ИтоговыйРезультатВыполнения = ИсполнительБДД.ВозможныеСтатусыВыполнения().Сломался Тогда
26 | ВызватьИсключение 1;
27 | КонецЕсли;
28 |
--------------------------------------------------------------------------------
/features/КомандныеФайлы.feature:
--------------------------------------------------------------------------------
1 | # language: ru
2 |
3 | Функциональность: Выполнение командных файлов
4 |
5 | Как разработчик
6 | Я хочу иметь возможность создавать и выполнять командные файлы
7 | Чтобы я мог проще автоматизировать больше действий на OneScript
8 |
9 | Контекст: Отключение отладки в логах
10 | Допустим Я выключаю отладку лога с именем "oscript.lib.commands"
11 |
12 | Сценарий: Выполнение командного файла PowerShell
13 | Когда Я пропускаю этот сценарий в Линукс
14 | И Я устанавливаю приложение запуска "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe"
15 | И Я создаю командный файл PowerShell "" ".ps1"
16 | И Я добавляю строку "Write-Host PowerShell" в командный файл
17 | И Я сообщаю содержимое командного файла
18 | И Я выполняю командный файл
19 | Тогда Вывод командного файла содержит "PowerShell"
20 | И Код возврата командного файла равен 0
21 |
22 | Сценарий: Выполнение командного файла
23 | Когда Я создаю командный файл
24 | И Я добавляю строку "echo command file" в командный файл
25 | И Я сообщаю содержимое командного файла
26 | И Я выполняю командный файл
27 | Тогда Вывод командного файла содержит "command file"
28 | И Код возврата командного файла равен 0
29 |
--------------------------------------------------------------------------------
/features/wait-handler.feature:
--------------------------------------------------------------------------------
1 | # language: ru
2 |
3 | Функциональность: Выполнение команды
4 |
5 | Как разработчик
6 | Я хочу иметь возможность выполнять команды
7 | Чтобы я мог проще автоматизировать больше действий на OneScript
8 |
9 | Контекст: Отключение отладки в логах
10 | Допустим Я выключаю отладку лога с именем "oscript.lib.commands"
11 | И Я очищаю параметры команды "oscript" в контексте
12 |
13 | Сценарий: Выполнение долгой команды
14 | Когда Я добавляю параметры для команды "oscript"
15 | # | -encoding=utf-8 |
16 | | features/step_definitions/fixtures/ДолгоеВыполнение.os |
17 | | 1 |
18 | # И Я добавляю параметр "features/step_definitions/fixtures/ДолгоеВыполнение.os" для команды "oscript"
19 | # И Я добавляю параметр "5" для команды "oscript"
20 | И Я устанавливаю период опроса завершения команды "oscript" в 1 миллисекунду
21 | И Я выполняю команду "oscript"
22 | Тогда Вывод команды "oscript" содержит "Полезная работа"
23 | И Код возврата команды "oscript" равен 0
24 |
25 | Сценарий: Выполнение долгой команды
26 | Когда Я добавляю параметры для команды "oscript"
27 | # | -encoding=utf-8 |
28 | | features/step_definitions/fixtures/ДолгоеВыполнение.os |
29 | | 1 |
30 | # И Я добавляю параметр "features/step_definitions/fixtures/ДолгоеВыполнение.os" для команды "oscript"
31 | # И Я добавляю параметр "5" для команды "oscript"
32 | И Я создаю обработчик ожидания процесса
33 | И Я устанавливаю отказ в обработчик ожидания процесса
34 | И Я устанавливаю обработчик ожидания процесса команды "oscript" с интервалом "1000"
35 | И Я устанавливаю ожидаемый код возврата -1 для команды "oscript"
36 | И Я выполняю команду "oscript"
37 | Тогда Вывод команды "oscript" содержит "Полезная работа"
38 | # И Код возврата команды "oscript" равен 1
39 | И Счетчик обработчика равен "1"
40 |
--------------------------------------------------------------------------------
/appveyor.yml:
--------------------------------------------------------------------------------
1 | version: 1.2.{build}
2 | pull_requests:
3 | do_not_increment_build_number: true
4 | max_jobs: 1
5 | init:
6 | - ps: Set-WinSystemLocale ru-RU
7 |
8 | # appveyor DownloadFile http://oscript.io/downloads/latest/exe -FileName ./oscriptlatest.exe
9 | # dir /w
10 | # oscriptlatest.exe /VERYSILENT /DIR=".\engine\"
11 | # SET PATH=%CD%\engine\bin;%PATH%
12 | # oscript
13 |
14 | install:
15 | - cmd: >-
16 | @echo on
17 |
18 | git submodule update --init --recursive
19 |
20 | set
21 |
22 | curl -o %temp%\oscript-setup.exe http://oscript.io/downloads/latest/exe
23 |
24 | %temp%\oscript-setup.exe /silent /log="%temp%\oscript-setup.log" /saveinf="%temp%\oscript-setup-settings.txt"
25 |
26 | set OSCRIPT=%ProgramFiles(x86)%\OneScript
27 |
28 | dir "%OSCRIPT%\bin"
29 | dir "%OSCRIPT%\lib"
30 |
31 | rem SET PATH=%CD%\engine\bin;%PATH%
32 |
33 | SET PATH=%OSCRIPT%\bin;%PATH%
34 |
35 | where oscript
36 |
37 | oscript -version
38 |
39 | chcp 65001
40 |
41 | opm install opm
42 |
43 | opm list
44 |
45 | opm install 1commands
46 |
47 | opm install 1testrunner
48 |
49 | opm install 1bdd
50 |
51 | opm list
52 |
53 | dir "%OSCRIPT%\bin"
54 | dir "%OSCRIPT%\lib"
55 |
56 | # to disable automatic builds
57 | build: off
58 | test_script:
59 | - cmd: >-
60 |
61 | appveyor-runtests.cmd
62 |
63 | pushd %APPVEYOR_BUILD_FOLDER%
64 |
65 | after_test:
66 | - ps: # upload results to AppVeyor
67 | - ps: Write-Host "Загружаю результаты тестов на CI"
68 | - ps: $wc = New-Object 'System.Net.WebClient'
69 | # - ps: $wc.UploadFile("https://ci.appveyor.com/api/testresults/junit/$($env:APPVEYOR_JOB_ID)", (Resolve-Path .\tests\tests.xml))
70 | - ps: $wc.UploadFile("https://ci.appveyor.com/api/testresults/junit/$($env:APPVEYOR_JOB_ID)", (Resolve-Path .\bdd-log.xml))
71 | artifacts:
72 | # - path: tests\tests.xml
73 | - path: .\bdd-log.xml
--------------------------------------------------------------------------------
/tasks/coverage.os:
--------------------------------------------------------------------------------
1 | #Использовать 1commands
2 | #Использовать asserts
3 | #Использовать fs
4 | #Использовать json
5 |
6 | СистемнаяИнформация = Новый СистемнаяИнформация;
7 | ЭтоWindows = Найти(НРег(СистемнаяИнформация.ВерсияОС), "windows") > 0;
8 |
9 | ФС.ОбеспечитьПустойКаталог("coverage");
10 | ПутьКСтат = "coverage/stat.json";
11 |
12 | Команда = Новый Команда;
13 | Команда.УстановитьКоманду("oscript");
14 | Если НЕ ЭтоWindows Тогда
15 | Команда.ДобавитьПараметр("-encoding=utf-8");
16 | КонецЕсли;
17 | Команда.ДобавитьПараметр(СтрШаблон("-codestat=%1", ПутьКСтат));
18 | Команда.ДобавитьПараметр("tasks/test.os");
19 | Команда.ПоказыватьВыводНемедленно(Истина);
20 |
21 | КодВозврата = Команда.Исполнить();
22 | Сообщить(Команда.ПолучитьВывод());
23 | // Ожидаем.Что(КодВозврата).Равно(0);
24 | Сообщить("ПутьКСтат " + ПутьКСтат);
25 |
26 | Файл_Стат = Новый Файл(ПутьКСтат);
27 | Ожидаем.Что(Файл_Стат.Существует(), СтрШаблон("Файл <%1> с результатами покрытия не существует!", Файл_Стат.ПолноеИмя)).ЭтоИстина();
28 |
29 | ЧтениеТекста = Новый ЧтениеТекста(ПутьКСтат, КодировкаТекста.UTF8);
30 |
31 | СтрокаJSON = ЧтениеТекста.Прочитать();
32 | ЧтениеТекста.Закрыть();
33 |
34 | // Сообщить("СтрокаJSON " + СтрокаJSON);
35 |
36 | Парсер = Новый ПарсерJSON();
37 | ДанныеПокрытия = Парсер.ПрочитатьJSON(СтрокаJSON);
38 |
39 | ЗаписьXML = Новый ЗаписьXML;
40 | ЗаписьXML.ОткрытьФайл("coverage/genericCoverage.xml");
41 | ЗаписьXML.ЗаписатьОбъявлениеXML();
42 | ЗаписьXML.ЗаписатьНачалоЭлемента("coverage");
43 | ЗаписьXML.ЗаписатьАтрибут("version", "1");
44 |
45 | Для Каждого Файл Из ДанныеПокрытия Цикл
46 |
47 | ДанныеФайла = Файл.Значение;
48 |
49 | ЗаписьXML.ЗаписатьНачалоЭлемента("file");
50 | ЗаписьXML.ЗаписатьАтрибут("path", ДанныеФайла.Получить("#path"));
51 |
52 | Для Каждого КлючИЗначение Из ДанныеФайла Цикл
53 |
54 | Если КлючИЗначение.Ключ = "#path" Тогда
55 | Продолжить;
56 | КонецЕсли;
57 |
58 | ДанныеПроцедуры = КлючИЗначение.Значение;
59 | Для Каждого ДанныеСтроки Из ДанныеПроцедуры Цикл
60 |
61 | ЗаписьXML.ЗаписатьНачалоЭлемента("lineToCover");
62 |
63 | ЗаписьXML.ЗаписатьАтрибут("lineNumber", ДанныеСтроки.Ключ);
64 | Покрыто = Число(ДанныеСтроки.Значение.Получить("count")) > 0;
65 | ЗаписьXML.ЗаписатьАтрибут("covered", Формат(Покрыто, "БИ=true; БЛ=false"));
66 |
67 | ЗаписьXML.ЗаписатьКонецЭлемента(); // lineToCover
68 | КонецЦикла
69 | КонецЦикла;
70 |
71 | ЗаписьXML.ЗаписатьКонецЭлемента(); // file
72 |
73 | КонецЦикла;
74 |
75 | ЗаписьXML.ЗаписатьКонецЭлемента(); // coverage
76 | ЗаписьXML.Закрыть();
77 |
--------------------------------------------------------------------------------
/Jenkinsfile:
--------------------------------------------------------------------------------
1 |
2 | pipeline {
3 | agent none
4 | options {
5 | buildDiscarder(logRotator(numToKeepStr: '7'))
6 | skipDefaultCheckout()
7 | }
8 |
9 | stages {
10 | stage('Тестирование кода пакета WIN') {
11 |
12 | agent { label 'windows' }
13 |
14 | steps {
15 | checkout scm
16 |
17 | script {
18 | if( fileExists ('tasks/test.os') ){
19 | bat 'chcp 65001 > nul && oscript tasks/test.os'
20 |
21 | junit allowEmptyResults: true, testResults: 'tests.xml'
22 | junit allowEmptyResults: true, testResults: 'bdd-log.xml'
23 | }
24 | else
25 | echo 'no testing task'
26 | }
27 |
28 | }
29 |
30 | }
31 |
32 | stage('Тестирование кода пакета LINUX') {
33 |
34 | agent { label 'master' }
35 |
36 | steps {
37 | echo 'under development'
38 | }
39 |
40 | }
41 |
42 | stage('Сборка пакета') {
43 |
44 | agent { label 'windows' }
45 |
46 | steps {
47 | checkout scm
48 |
49 | bat 'erase /Q *.ospx'
50 | bat 'chcp 65001 > nul && call opm build .'
51 |
52 | stash includes: '*.ospx', name: 'package'
53 | archiveArtifacts '*.ospx'
54 | }
55 |
56 | }
57 |
58 | stage('Публикация в хабе') {
59 | when {
60 | branch 'master'
61 | }
62 | agent { label 'master' }
63 | steps {
64 | sh 'rm -f *.ospx'
65 | unstash 'package'
66 |
67 | sh '''
68 | artifact=`ls -1 *.ospx`
69 | basename=`echo $artifact | sed -r 's/(.+)-.*(.ospx)/\\1/'`
70 | cp $artifact $basename.ospx
71 | sudo rsync -rv *.ospx /var/www/hub.oscript.io/download/$basename/
72 | '''.stripIndent()
73 | }
74 | }
75 |
76 | stage('Публикация в нестабильном хабе') {
77 | when {
78 | branch 'develop'
79 | }
80 | agent { label 'master' }
81 | steps {
82 | sh 'rm -f *.ospx'
83 | unstash 'package'
84 |
85 | sh '''
86 | artifact=`ls -1 *.ospx`
87 | basename=`echo $artifact | sed -r 's/(.+)-.*(.ospx)/\\1/'`
88 | cp $artifact $basename.ospx
89 | sudo rsync -rv *.ospx /var/www/hub.oscript.io/dev-channel/$basename/
90 | '''.stripIndent()
91 | }
92 | }
93 | }
94 | }
95 |
--------------------------------------------------------------------------------
/features/step_definitions/wait-handler.os:
--------------------------------------------------------------------------------
1 | // Реализация шагов BDD-фич/сценариев c помощью фреймворка https://github.com/artbear/1bdd
2 | #Использовать "../.."
3 |
4 | Перем БДД; //контекст фреймворка 1bdd
5 |
6 | // Метод выдает список шагов, реализованных в данном файле-шагов
7 | Функция ПолучитьСписокШагов(КонтекстФреймворкаBDD) Экспорт
8 | БДД = КонтекстФреймворкаBDD;
9 |
10 | ВсеШаги = Новый Массив;
11 |
12 | ВсеШаги.Добавить("ЯСоздаюОбработчикОжиданияПроцесса");
13 | ВсеШаги.Добавить("ЯУстанавливаюОтказВОбработчикОжиданияПроцесса");
14 | ВсеШаги.Добавить("ЯУстанавливаюОбработчикОжиданияПроцессаКомандыСИнтервалом");
15 | ВсеШаги.Добавить("СчетчикОбработчикаРавен");
16 |
17 | Возврат ВсеШаги;
18 | КонецФункции
19 |
20 | // Реализация шагов
21 |
22 | // Процедура выполняется перед запуском каждого сценария
23 | Процедура ПередЗапускомСценария(Знач Узел) Экспорт
24 |
25 | КонецПроцедуры
26 |
27 | // Процедура выполняется после завершения каждого сценария
28 | Процедура ПослеЗапускаСценария(Знач Узел) Экспорт
29 |
30 | КонецПроцедуры
31 |
32 | //Я создаю обработчик ожидания процесса
33 | Процедура ЯСоздаюОбработчикОжиданияПроцесса() Экспорт
34 |
35 | Обработчик = ЗагрузитьСценарий(".\features\step_definitions\fixtures\ОбработчикОжиданияПроцесса.os");
36 |
37 | БДД.СохранитьВКонтекст("Обработчик", Обработчик);
38 |
39 | КонецПроцедуры
40 |
41 | //Я устанавливаю отказ в обработчик ожидая процесса
42 | Процедура ЯУстанавливаюОтказВОбработчикОжиданияПроцесса() Экспорт
43 |
44 | Обработчик = БДД.ПолучитьИзКонтекста("Обработчик");
45 | Обработчик.УстановитьОтказ();
46 |
47 | КонецПроцедуры
48 |
49 | //Счетчик обработчика равен "0"
50 | Процедура СчетчикОбработчикаРавен(Знач ЧислоСчетчика) Экспорт
51 |
52 | Обработчик = БДД.ПолучитьИзКонтекста("Обработчик");
53 |
54 | Ожидаем.Что(Обработчик.ПолучитьСчетчик(), "Счетчик должен быть равен").Равно(Число(ЧислоСчетчика));
55 |
56 | КонецПроцедуры
57 |
58 | //Я устанавливаю обработчик ожидания процесса команды "oscript" с интервалом "1000"
59 | Процедура ЯУстанавливаюОбработчикОжиданияПроцессаКомандыСИнтервалом(Знач ИмяКоманды, Знач Интервал) Экспорт
60 |
61 | Обработчик = БДД.ПолучитьИзКонтекста("Обработчик");
62 | Команда = ПолучитьКомандуИзКонтекста(ИмяКоманды);
63 | Команда.УстановитьОбработчикОжидания(Обработчик, Число(Интервал));
64 |
65 | КонецПроцедуры
66 |
67 | //TODO дубль кода с 1bdd::ВыполнениеКоманд.os
68 | Функция ПолучитьКомандуИзКонтекста(Знач ИмяКоманды)
69 |
70 | КлючКонтекста = КлючКоманды(ИмяКоманды);
71 | Команда = БДД.ПолучитьИзКонтекста(КлючКонтекста);
72 |
73 | Если Не ЗначениеЗаполнено(Команда) Тогда
74 | Команда = Новый Команда;
75 | Команда.УстановитьСтрокуЗапуска(ИмяКоманды);
76 | БДД.СохранитьВКонтекст(КлючКонтекста, Команда);
77 | КонецЕсли;
78 |
79 | Возврат Команда;
80 | КонецФункции
81 |
82 | //TODO дубль кода с 1bdd::ВыполнениеКоманд.os
83 | Функция КлючКоманды(Знач ИмяКоманды)
84 | Возврат "Команда-" + ИмяКоманды;
85 | КонецФункции
86 |
--------------------------------------------------------------------------------
/readme.md:
--------------------------------------------------------------------------------
1 | # 1commands
2 |
3 | Обсудить [](https://gitter.im/EvilBeaver/oscript-library?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [](https://github.com/artbear/1commands/releases) [](http://build.oscript.io/job/oscript-library/job/1commands/job/develop/)
4 | [](https://ci.appveyor.com/project/artbear/1commands)
5 |
6 | ## Библиотека для упрощения работы c запуском различных приложений и командных файлов (cmd, bat, bash, PowerShell и др.) из oscript.
7 |
8 | Позволяет выполнять рутинные операции по запуску приложений и командных файлов системы.
9 |
10 | Пример работы:
11 | ```bsl
12 | Команда = Новый Команда;
13 |
14 | Команда.УстановитьКоманду("oscript");
15 | Команда.ДобавитьПараметр("-version");
16 |
17 | // или сразу Команда.УстановитьСтрокуЗапуска("oscript -version");
18 |
19 | КодВозврата = Команда.Исполнить();
20 | Сообщить(КодВозврата);
21 |
22 | Сообщить(Команда.ПолучитьВывод());
23 | ```
24 |
25 | или запуск командного файла
26 | ```bsl
27 | КомандныйФайл = Новый КомандныйФайл;
28 | КомандныйФайл.Создать();
29 |
30 | КомандныйФайл.ДобавитьКоманду("@echo off");
31 | КомандныйФайл.ДобавитьКоманду("oscript -version");
32 |
33 | Сообщить(КомандныйФайл.ПолучитьТекстФайла());
34 |
35 | КодВозврата = КомандныйФайл.Исполнить();
36 | Сообщить(КодВозврата);
37 |
38 | Сообщить(КомандныйФайл.ПолучитьВывод());
39 | ```
40 | или запуск командного файла PowerShell
41 | ```bsl
42 | КомандныйФайл = Новый КомандныйФайл;
43 | КомандныйФайл.УстановитьПриложение("C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe");
44 | КомандныйФайл.Создать("",".ps1");
45 |
46 | КомандныйФайл.ДобавитьКоманду("Get-Help");
47 |
48 | Сообщить(КомандныйФайл.ПолучитьТекстФайла());
49 |
50 | КодВозврата = КомандныйФайл.Исполнить();
51 | Сообщить(КодВозврата);
52 |
53 | Сообщить(КомандныйФайл.ПолучитьВывод());
54 | ```
55 |
56 | Так же описание функциональности содержится в папке `features`. В прилагающихся `step_definitions` можно подсмотреть больше примеров.
57 |
58 | ## FAQ
59 |
60 | Вопрос:
61 | >при использовании классов Команда/Командный файл происходит зависание выполнения команды.
62 | В консоли та же команда выполняется без зависания.
63 |
64 | >Например, при использовании `gitsync`. [Описание ошибки и расследование](https://github.com/artbear/1commands/issues/14)
65 |
66 | >Что делать?
67 |
68 | Ответ:
69 | > Отключить режим использования немедленного вывода лога команды, использовав метод `ПоказыватьВыводНемедленно(Ложь);`
70 | В этом случае вывод команды будет получен после завершения работы команды, а не во время ее выполнения.
--------------------------------------------------------------------------------
/features/step_definitions/КомандныеФайлы.os:
--------------------------------------------------------------------------------
1 | // Реализация шагов BDD-фич/сценариев c помощью фреймворка https://github.com/artbear/1bdd
2 | #Использовать "../.."
3 |
4 | Перем БДД; //контекст фреймворка 1bdd
5 | Перем ЭтоWindows;
6 | Перем ПропускаюВЛинукс;
7 |
8 | // Метод выдает список шагов, реализованных в данном файле-шагов
9 | Функция ПолучитьСписокШагов(КонтекстФреймворкаBDD) Экспорт
10 | БДД = КонтекстФреймворкаBDD;
11 |
12 | ВсеШаги = Новый Массив;
13 |
14 | ВсеШаги.Добавить("ЯСоздаюКомандныйФайл");
15 | ВсеШаги.Добавить("ЯСоздаюКомандныйФайлPowerShell");
16 | ВсеШаги.Добавить("ЯДобавляюСтрокуВКомандныйФайл");
17 | ВсеШаги.Добавить("ЯСообщаюСодержимоеКомандногоФайла");
18 | ВсеШаги.Добавить("ЯВыполняюКомандныйФайл");
19 | ВсеШаги.Добавить("ВыводКомандногоФайлаСодержит");
20 | ВсеШаги.Добавить("КодВозвратаКомандногоФайлаРавен");
21 | ВсеШаги.Добавить("ЯУстанавливаюПриложениеЗапуска");
22 | ВсеШаги.Добавить("ЯПропускаюЭтотСценарийВЛинукс");
23 |
24 | Возврат ВсеШаги;
25 | КонецФункции
26 |
27 | // Реализация шагов
28 |
29 | // Процедура выполняется перед запуском каждого сценария
30 | Процедура ПередЗапускомСценария(Знач Узел) Экспорт
31 | ПропускаюВЛинукс = Ложь;
32 | КонецПроцедуры
33 |
34 | // Процедура выполняется после завершения каждого сценария
35 | Процедура ПослеЗапускаСценария(Знач Узел) Экспорт
36 |
37 | КонецПроцедуры
38 |
39 | //Я создаю командный файл
40 | Процедура ЯСоздаюКомандныйФайл() Экспорт
41 | СоздатьФайл();
42 | КонецПроцедуры
43 |
44 | // Я пропускаю этот сценарий в Линукс
45 | Процедура ЯПропускаюЭтотСценарийВЛинукс() Экспорт
46 | ПропускаюВЛинукс = Истина;
47 | КонецПроцедуры
48 |
49 | //Я создаю командный файл PowerShell "" ".ps1"
50 | Процедура ЯСоздаюКомандныйФайлPowerShell(Знач Путь="", Знач Расширение="") Экспорт
51 | Если ПропускаюШагВЛинукс() Тогда
52 | БДД.ВыполнитьШаг("Пропускаю шаг в Linux");
53 | Возврат;
54 | КонецЕсли;
55 |
56 | СоздатьФайл(Путь,Расширение);
57 | КонецПроцедуры
58 |
59 | //я добавляю строку "echo командный файл" в командный файл
60 | Процедура ЯДобавляюСтрокуВКомандныйФайл(Знач СтрокаКоманды) Экспорт
61 | Если ПропускаюШагВЛинукс() Тогда
62 | БДД.ВыполнитьШаг("Пропускаю шаг в Linux");
63 | Возврат;
64 | КонецЕсли;
65 |
66 | КомандныйФайл = БДД.ПолучитьИзКонтекста("КомандныйФайл");
67 |
68 | КомандныйФайл.ДобавитьКоманду(СтрокаКоманды);
69 | КонецПроцедуры
70 |
71 | //Я выполняю командный файл
72 | Процедура ЯВыполняюКомандныйФайл() Экспорт
73 | Если ПропускаюШагВЛинукс() Тогда
74 | БДД.ВыполнитьШаг("Пропускаю шаг в Linux");
75 | Возврат;
76 | КонецЕсли;
77 |
78 | КомандныйФайл = БДД.ПолучитьИзКонтекста("КомандныйФайл");
79 |
80 | КомандныйФайл.Исполнить();
81 | КонецПроцедуры
82 |
83 | //Я сообщаю содержимое файла "ИмяФайла"
84 | Процедура ЯСообщаюСодержимоеФайла(Знач ИмяФайла) Экспорт
85 | Если ПропускаюШагВЛинукс() Тогда
86 | БДД.ВыполнитьШаг("Пропускаю шаг в Linux");
87 | Возврат;
88 | КонецЕсли;
89 |
90 | ВывестиТекстФайла(ИмяФайла);
91 | КонецПроцедуры
92 |
93 | //Я сообщаю содержимое командного файла
94 | Процедура ЯСообщаюСодержимоеКомандногоФайла() Экспорт
95 | Если ПропускаюШагВЛинукс() Тогда
96 | БДД.ВыполнитьШаг("Пропускаю шаг в Linux");
97 | Возврат;
98 | КонецЕсли;
99 | КомандныйФайл = БДД.ПолучитьИзКонтекста("КомандныйФайл");
100 |
101 | ТекстФайла = КомандныйФайл.ПолучитьТекстФайла();
102 | Сообщить(ТекстФайла);
103 | КонецПроцедуры
104 |
105 | //Вывод командного файла содержит "командный файл"
106 | Процедура ВыводКомандногоФайлаСодержит(Знач ОжидаемыйВыводКоманды) Экспорт
107 | Если ПропускаюШагВЛинукс() Тогда
108 | БДД.ВыполнитьШаг("Пропускаю шаг в Linux");
109 | Возврат;
110 | КонецЕсли;
111 |
112 | КомандныйФайл = БДД.ПолучитьИзКонтекста("КомандныйФайл");
113 |
114 | ВыводКоманды = КомандныйФайл.ПолучитьВывод();
115 | Ожидаем.Что(ВыводКоманды).Содержит(ОжидаемыйВыводКоманды);
116 | КонецПроцедуры
117 |
118 | //Код возврата командного файла равен 0
119 | Процедура КодВозвратаКомандногоФайлаРавен(Знач ОжидаемыйКодВозврата) Экспорт
120 | Если ПропускаюШагВЛинукс() Тогда
121 | БДД.ВыполнитьШаг("Пропускаю шаг в Linux");
122 | Возврат;
123 | КонецЕсли;
124 |
125 | КомандныйФайл = БДД.ПолучитьИзКонтекста("КомандныйФайл");
126 |
127 | Ожидаем.Что(КомандныйФайл.ПолучитьКодВозврата(), "Код возврата").Равно(ОжидаемыйКодВозврата);
128 | КонецПроцедуры
129 |
130 | //Я устанавливаю приложение запуска "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe"
131 | Процедура ЯУстанавливаюПриложениеЗапуска(Знач ПутьПриложения="") Экспорт
132 | Если ПропускаюШагВЛинукс() Тогда
133 | БДД.ВыполнитьШаг("Пропускаю шаг в Linux");
134 | Возврат;
135 | КонецЕсли;
136 |
137 | КомандныйФайл = БДД.ПолучитьИзКонтекста("КомандныйФайл");
138 | Если КомандныйФайл=Неопределено Тогда
139 | КомандныйФайл = Новый КомандныйФайл;
140 | КонецЕсли;
141 | КомандныйФайл.УстановитьПриложение(ПутьПриложения);
142 | БДД.СохранитьВКонтекст("КомандныйФайл", КомандныйФайл);
143 | КонецПроцедуры
144 |
145 |
146 | Процедура ВывестиТекстФайла(Знач ИмяФайла, Знач Кодировка = Неопределено)
147 |
148 | Файл = Новый Файл(ИмяФайла);
149 | Если НЕ Файл.Существует() Тогда
150 | Возврат;
151 | КонецЕсли;
152 |
153 | Если Кодировка = Неопределено Тогда
154 | Кодировка = "utf-8";
155 | КонецЕсли;
156 |
157 | ЧТ = Новый ЧтениеТекста(ИмяФайла, Кодировка);
158 | СтрокаФайла = ЧТ.Прочитать();
159 | ЧТ.Закрыть();
160 |
161 | Сообщить(СтрокаФайла);
162 |
163 | КонецПроцедуры
164 |
165 | Процедура СоздатьФайл(Знач Путь="", Знач Расширение="")
166 | КомандныйФайл = БДД.ПолучитьИзКонтекста("КомандныйФайл");
167 | Если КомандныйФайл=Неопределено Тогда
168 | КомандныйФайл = Новый КомандныйФайл;
169 | КонецЕсли;
170 |
171 | КомандныйФайл.Создать(Путь,Расширение);
172 | БДД.СохранитьВКонтекст("КомандныйФайл", КомандныйФайл);
173 | КонецПроцедуры
174 |
175 | Функция ПропускаюШагВЛинукс()
176 | Если ЭтоWindows = Неопределено Тогда
177 | СистемнаяИнформация = Новый СистемнаяИнформация;
178 | ЭтоWindows = Найти(НРег(СистемнаяИнформация.ВерсияОС), "windows") > 0;
179 | КонецЕсли;
180 |
181 | Возврат ПропускаюВЛинукс И НЕ ЭтоWindows;
182 | КонецФункции // ЭтоWindows()
183 |
--------------------------------------------------------------------------------
/features/ВыполнениеКоманды.feature:
--------------------------------------------------------------------------------
1 | # language: ru
2 |
3 | Функциональность: Выполнение команды
4 |
5 | Как разработчик
6 | Я хочу иметь возможность выполнять команды
7 | Чтобы я мог проще автоматизировать больше действий на OneScript
8 |
9 | Контекст: Отключение отладки в логах
10 | Допустим Я выключаю отладку лога с именем "oscript.lib.commands"
11 | И Я очищаю параметры команды "git" в контексте
12 | И Я очищаю параметры команды "oscript" в контексте
13 |
14 | Сценарий: Выполнение команды без параметров
15 | Когда Я выполняю команду "git"
16 | Тогда Вывод команды "git" содержит "[--version]"
17 | И Код возврата команды "git" равен 1
18 |
19 | Сценарий: Выполнение команды с параметрами
20 | Когда Я добавляю параметр "--version" для команды "git"
21 | И Я выполняю команду "git"
22 | Тогда Я сообщаю вывод команды "git"
23 | И Вывод команды "git" содержит "version"
24 | И Код возврата команды "git" равен 0
25 |
26 | Сценарий: Выполнение команды с массивом параметров
27 | Когда Я добавляю параметры для команды "oscript"
28 | | -version |
29 | | -encoding=utf-8 |
30 | И Я выполняю команду "oscript"
31 | Тогда я вижу в консоли строку подобно "(\d+\.){3}\d+"
32 |
33 | Сценарий: Выполнение команды через командный процессор системы
34 | Когда Я выполняю команду "oscript" через командный процессор системы
35 | Тогда Вывод команды "oscript" содержит "1Script Execution Engine"
36 | И Код возврата команды "oscript" равен 0
37 |
38 | Сценарий: Выполнение команды без командного процессора системы
39 | Когда Я выполняю команду "oscript" без командного процессора системы
40 | Тогда Вывод команды "oscript" содержит "1Script Execution Engine"
41 | И Код возврата команды "oscript" равен 0
42 |
43 | Сценарий: Проверка правильного кода возврата команды
44 | Когда Я устанавливаю ожидаемый код возврата 0 для команды "oscript"
45 | Когда Я выполняю команду "oscript"
46 | Тогда Код возврата команды "oscript" равен 0
47 |
48 | Сценарий: Проверка неправильного кода возврата команды
49 | Когда Я устанавливаю ожидаемый код возврата 123 для команды "oscript"
50 | Тогда Я получаю исключение при выполнении команды "oscript"
51 | И Код возврата команды "oscript" равен 0
52 |
53 | Сценарий: Проверка правильного диапазона кодов возврата команды
54 | Когда Я устанавливаю ожидаемый диапазон кодов возврата от 0 до 10 для команды "oscript"
55 | Когда Я выполняю команду "oscript"
56 | Тогда Код возврата команды "oscript" равен 0
57 |
58 | Сценарий: Выполнение команды c установленным периодом опроса завершения команды
59 | Когда Я устанавливаю период опроса завершения команды "oscript" в 1 миллисекунду
60 | И Я выполняю команду "oscript"
61 | Тогда Вывод команды "oscript" содержит "1Script Execution Engine"
62 | И Код возврата команды "oscript" равен 0
63 |
64 | Сценарий: Выполнение команды c запретом немедленного вывода команды команды
65 | Когда Я снимаю флаг показа немедленного вывода команды "oscript"
66 | И Я выполняю команду "oscript"
67 | Тогда Вывод команды "oscript" содержит "1Script Execution Engine"
68 | И Код возврата команды "oscript" равен 0
69 |
70 | Сценарий: Проверка неправильного диапазона кодов возврата команды
71 | Когда Я устанавливаю ожидаемый диапазон кодов возврата от 1 до 10 для команды "oscript"
72 | Тогда Я получаю исключение при выполнении команды "oscript"
73 | И Код возврата команды "oscript" равен 0
74 |
75 | Сценарий: Выполнение команды с выводом в отдельный лог
76 | Допустим Я создаю временный каталог и сохраняю его в контекст
77 | И Я устанавливаю временный каталог как рабочий каталог
78 | И Я установил рабочий каталог как текущий каталог
79 |
80 | Допустим Я подключаю вывод команды "oscript" в лог "ТестовыйЛог"
81 | И Я подключаю вывод в файл "лог1.Log" для лога "ТестовыйЛог"
82 | И Я добавляю параметр "-version" для команды "oscript"
83 |
84 | Когда Я выполняю команду "oscript"
85 | Тогда я не вижу в консоли строку подобно "(\d+\.){3}\d+"
86 | Тогда я не вижу в консоли вывод "ФИЧА ВыполнениеКоманды"
87 | И Код возврата команды "oscript" равен 0
88 | И Я закрываю лог "ТестовыйЛог"
89 | И Файл "лог1.Log" содержит "ФИЧА ВыполнениеКоманды"
90 |
91 | Сценарий: Выполнение команды с выводом в отдельные логи
92 | Допустим Я создаю временный каталог и сохраняю его в контекст
93 | И Я устанавливаю временный каталог как рабочий каталог
94 | И Я установил рабочий каталог как текущий каталог
95 |
96 | Допустим Я подключаю вывод команды "oscript" в лог "ТестовыйЛог"
97 | И Я подключаю вывод в файл "лог1.Log" для лога "ТестовыйЛог"
98 | И Я подключаю вывод в файл "лог2.txt" для лога "ТестовыйЛог2"
99 | Допустим Я подключаю вывод команды "oscript" в лог "ТестовыйЛог2"
100 | И Я добавляю параметр "-version" для команды "oscript"
101 |
102 | Когда Я выполняю команду "oscript"
103 | Тогда я не вижу в консоли строку подобно "(\d+\.){3}\d+"
104 | Тогда я не вижу в консоли вывод "ФИЧА ВыполнениеКоманды"
105 | И Код возврата команды "oscript" равен 0
106 | И Я закрываю лог "ТестовыйЛог"
107 | И Я закрываю лог "ТестовыйЛог2"
108 | И Файл "лог1.Log" содержит "ФИЧА ВыполнениеКоманды"
109 | И Файл "лог2.txt" содержит "ФИЧА ВыполнениеКоманды"
110 |
111 | Сценарий: Выполнение команды с выводом в отдельный лог при включенном немедленном выводом команды
112 | Допустим Я создаю временный каталог и сохраняю его в контекст
113 | И Я устанавливаю временный каталог как рабочий каталог
114 | И Я установил рабочий каталог как текущий каталог
115 |
116 | Допустим Я устанавливаю флаг показа немедленного вывода команды "oscript"
117 | Допустим Я подключаю вывод команды "oscript" в лог "ТестовыйЛог"
118 | И Я подключаю вывод в файл "лог1.Log" для лога "ТестовыйЛог"
119 | И Я добавляю параметр "-version" для команды "oscript"
120 |
121 | Когда Я выполняю команду "oscript"
122 | Тогда я не вижу в консоли строку подобно "(\d+\.){3}\d+"
123 | Тогда я не вижу в консоли вывод "ФИЧА ВыполнениеКоманды"
124 | И Код возврата команды "oscript" равен 0
125 | И Я закрываю лог "ТестовыйЛог"
126 |
127 | И Файл "лог1.Log" содержит "ФИЧА ВыполнениеКоманды"
128 |
129 | Сценарий: Выполнение команды с пробелами
130 | Допустим Я создаю временный каталог и сохраняю его в контекст
131 | И Я устанавливаю временный каталог как рабочий каталог
132 | И Я установил рабочий каталог как текущий каталог
133 |
134 | Когда Я выполняю команду 'echo echo 456 > "Мой командный файл.cmd"' через командный процессор системы
135 | Когда Я выполняю команду '"Мой командный файл.cmd" "78 9"' через командный процессор системы
136 | И Вывод команды '"Мой командный файл.cmd" "78 9"' содержит "456"
137 |
--------------------------------------------------------------------------------
/features/step_definitions/ВыполнениеКоманды.os:
--------------------------------------------------------------------------------
1 | // Реализация шагов BDD-фич/сценариев c помощью фреймворка https://github.com/artbear/1bdd
2 | #Использовать "../.."
3 |
4 | Перем БДД; //контекст фреймворка 1bdd
5 |
6 | // Метод выдает список шагов, реализованных в данном файле-шагов
7 | Функция ПолучитьСписокШагов(КонтекстФреймворкаBDD) Экспорт
8 | БДД = КонтекстФреймворкаBDD;
9 |
10 | ВсеШаги = Новый Массив;
11 |
12 | ВсеШаги.Добавить("ЯДобавляюПараметрыДляКоманды");
13 | ВсеШаги.Добавить("ЯВыполняюКомандуЧерезКомандныйПроцессорСистемы");
14 | ВсеШаги.Добавить("ЯВыполняюКомандуБезКомандногоПроцессораСистемы");
15 | ВсеШаги.Добавить("ЯУстанавливаюОжидаемыйКодВозвратаДляКоманды");
16 | ВсеШаги.Добавить("ЯПолучаюИсключениеПриВыполненииКоманды");
17 | ВсеШаги.Добавить("ЯУстанавливаюОжидаемыйДиапазонКодовВозвратаОтДоДляКоманды");
18 | ВсеШаги.Добавить("ЯУстанавливаюПериодОпросаЗавершенияКомандыВМиллисекунду");
19 | ВсеШаги.Добавить("ЯСнимаюФлагПоказаНемедленногоВыводаКоманды");
20 | ВсеШаги.Добавить("ЯПодключаюВыводКомандыВЛог");
21 | ВсеШаги.Добавить("ЯПодключаюВыводВФайлДляЛога");
22 | ВсеШаги.Добавить("ЯЗакрываюЛог");
23 | ВсеШаги.Добавить("ЯУстанавливаюФлагПоказаНемедленногоВыводаКоманды");
24 |
25 | Возврат ВсеШаги;
26 | КонецФункции
27 |
28 | // Реализация шагов
29 |
30 | // Процедура выполняется перед запуском каждого сценария
31 | Процедура ПередЗапускомСценария(Знач Узел) Экспорт
32 |
33 | КонецПроцедуры
34 |
35 | // Процедура выполняется после завершения каждого сценария
36 | Процедура ПослеЗапускаСценария(Знач Узел) Экспорт
37 |
38 | КонецПроцедуры
39 |
40 | // TODO перенести методы (2 шт) в 1bdd для исключения дублирования
41 |
42 | //Я выполняю команду "oscript" через командный процессор системы
43 | Процедура ЯВыполняюКомандуЧерезКомандныйПроцессорСистемы(Знач ИмяИлиТекстКоманды) Экспорт
44 | ВыполнитьКоманду(ИмяИлиТекстКоманды, Истина);
45 | КонецПроцедуры
46 |
47 | //Я выполняю команду "oscript" без командного процессора системы
48 | Процедура ЯВыполняюКомандуБезКомандногоПроцессораСистемы(Знач ИмяИлиТекстКоманды) Экспорт
49 | ВыполнитьКоманду(ИмяИлиТекстКоманды, Ложь);
50 | КонецПроцедуры
51 |
52 | //Я устанавливаю ожидаемый код возврата 0 для команды "oscript"
53 | Процедура ЯУстанавливаюОжидаемыйКодВозвратаДляКоманды(Знач ОжидаемыйКодВозврата, Знач ИмяИлиТекстКоманды) Экспорт
54 | Команда = ПолучитьКомандуИзКонтекста(ИмяИлиТекстКоманды);
55 |
56 | Команда.УстановитьПравильныйКодВозврата(Число(ОжидаемыйКодВозврата));
57 | КонецПроцедуры
58 |
59 | //Я устанавливаю ожидаемый диапазон кодов возврата от 0 до 10 для команды "oscript"
60 | Процедура ЯУстанавливаюОжидаемыйДиапазонКодовВозвратаОтДоДляКоманды(Знач МинимальныйОжидаемыйКодВозврата,
61 | Знач МаксимальныйОжидаемыйКодВозврата, Знач ИмяИлиТекстКоманды) Экспорт
62 |
63 | Команда = ПолучитьКомандуИзКонтекста(ИмяИлиТекстКоманды);
64 |
65 | Команда.УстановитьДиапазонПравильныхКодовВозврата(
66 | МинимальныйОжидаемыйКодВозврата,
67 | МаксимальныйОжидаемыйКодВозврата);
68 | КонецПроцедуры
69 |
70 | //Я получаю исключение при выполнении команды "oscript"
71 | Процедура ЯПолучаюИсключениеПриВыполненииКоманды(Знач ИмяИлиТекстКоманды) Экспорт
72 | Попытка
73 | ВыполнитьКоманду(ИмяИлиТекстКоманды, Истина);
74 | Исключение
75 | Возврат;
76 | КонецПопытки;
77 |
78 | ВызватьИсключение СтрШаблон("Не получили исключение при выполнении команды", ИмяИлиТекстКоманды);
79 | КонецПроцедуры
80 |
81 | //Я устанавливаю период опроса завершения команды "oscript" в 1 миллисекунду
82 | Процедура ЯУстанавливаюПериодОпросаЗавершенияКомандыВМиллисекунду(Знач ИмяИлиТекстКоманды, Знач ТаймаутВМиллисекундах) Экспорт
83 |
84 | Команда = ПолучитьКомандуИзКонтекста(ИмяИлиТекстКоманды);
85 |
86 | Команда.УстановитьПериодОпросаЗавершения(ТаймаутВМиллисекундах);
87 | КонецПроцедуры
88 |
89 | //Я снимаю флаг показа немедленного вывода команды "oscript"
90 | Процедура ЯСнимаюФлагПоказаНемедленногоВыводаКоманды(Знач ИмяИлиТекстКоманды) Экспорт
91 | Команда = ПолучитьКомандуИзКонтекста(ИмяИлиТекстКоманды);
92 |
93 | Команда.ПоказыватьВыводНемедленно(Ложь);
94 | КонецПроцедуры
95 |
96 | //Я устанавливаю флаг показа немедленного вывода команды "oscript"
97 | Процедура ЯУстанавливаюФлагПоказаНемедленногоВыводаКоманды(Знач ИмяИлиТекстКоманды) Экспорт
98 | Команда = ПолучитьКомандуИзКонтекста(ИмяИлиТекстКоманды);
99 |
100 | Команда.ПоказыватьВыводНемедленно(Истина);
101 | КонецПроцедуры
102 |
103 | //Я добавляю параметры для команды "oscript"
104 | //| -version |
105 | //| -encoding=utf-8 |
106 | Процедура ЯДобавляюПараметрыДляКоманды(Знач ИмяИлиТекстКоманды, Знач ТаблицаПараметров) Экспорт
107 | //TODO перенести шаг в библиотеку 1bdd
108 | Команда = ПолучитьКомандуИзКонтекста(ИмяИлиТекстКоманды);
109 |
110 | // ПараметрКоманды = ЗаменитьШаблоныВПараметрахКоманды(ПараметрКоманды);//TODO раскомментировать код внутри 1bdd
111 | МассивПараметров = ТаблицаПараметров.ВыгрузитьКолонку(0);
112 | Команда.ДобавитьПараметры(МассивПараметров);
113 | КонецПроцедуры
114 |
115 | //Я подключаю вывод команды "oscript" в лог "ТестовыйЛог"
116 | Процедура ЯПодключаюВыводКомандыВЛог(Знач ИмяИлиТекстКоманды, Знач ИмяЛога) Экспорт
117 | Команда = ПолучитьКомандуИзКонтекста(ИмяИлиТекстКоманды);
118 | Команда.ДобавитьЛогВыводаКоманды(ИмяЛога);
119 |
120 | НовыйЛог = Логирование.ПолучитьЛог(ИмяЛога);
121 | НовыйЛог.УстановитьРаскладку(ЭтотОбъект);
122 | КонецПроцедуры
123 |
124 | //Я подключаю вывод в файл "лог1.Log" для лога "ТестовыйЛог"
125 | Процедура ЯПодключаюВыводВФайлДляЛога(Знач ПутьФайла, Знач ИмяЛога) Экспорт
126 | НовыйЛог = Логирование.ПолучитьЛог(ИмяЛога);
127 |
128 | ФайлЖурнала = Новый ВыводЛогаВФайл;
129 | ФайлЖурнала.ОткрытьФайл(ПутьФайла);
130 |
131 | НовыйЛог.ДобавитьСпособВывода(ФайлЖурнала);
132 |
133 | КонецПроцедуры
134 |
135 | //Я закрываю лог "ТестовыйЛог"
136 | Процедура ЯЗакрываюЛог(Знач ИмяЛога) Экспорт
137 | НовыйЛог = Логирование.ПолучитьЛог(ИмяЛога);
138 | НовыйЛог.Закрыть();
139 | КонецПроцедуры
140 |
141 | // { Служебные функции
142 |
143 | Функция Форматировать(Знач Уровень, Знач Сообщение) Экспорт
144 |
145 | Возврат СтрШаблон("ФИЧА ВыполнениеКоманды: %1 - %2", УровниЛога.НаименованиеУровня(Уровень), Сообщение);
146 |
147 | КонецФункции
148 |
149 | Процедура ВыполнитьКоманду(Знач ИмяИлиТекстКоманды, Знач ИспользуемКомандныйПроцессор = Истина)
150 | Команда = ПолучитьКомандуИзКонтекста(ИмяИлиТекстКоманды);
151 | Команда.УстановитьИсполнениеЧерезКомандыСистемы(ИспользуемКомандныйПроцессор);
152 |
153 | Команда.Исполнить();
154 | КонецПроцедуры
155 |
156 | //TODO дубль кода с 1bdd::ВыполнениеКоманд.os
157 | Функция ПолучитьКомандуИзКонтекста(Знач ИмяКоманды)
158 |
159 | КлючКонтекста = КлючКоманды(ИмяКоманды);
160 | Команда = БДД.ПолучитьИзКонтекста(КлючКонтекста);
161 |
162 | Если Не ЗначениеЗаполнено(Команда) Тогда
163 | Команда = Новый Команда;
164 | Команда.УстановитьСтрокуЗапуска(ИмяКоманды);
165 | БДД.СохранитьВКонтекст(КлючКонтекста, Команда);
166 | КонецЕсли;
167 |
168 | Возврат Команда;
169 | КонецФункции
170 |
171 | //TODO дубль кода с 1bdd::ВыполнениеКоманд.os
172 | Функция КлючКоманды(Знач ИмяКоманды)
173 | Возврат "Команда-" + ИмяКоманды;
174 | КонецФункции
175 |
176 | //}
177 |
--------------------------------------------------------------------------------
/src/КомандныйФайл.os:
--------------------------------------------------------------------------------
1 | //////////////////////////////////////////////////////////////////////////
2 | // Работа с командными файлами
3 |
4 | #Использовать tempfiles
5 |
6 | Перем ЗаписьТекста;
7 | Перем ПутьКоманды;
8 | Перем Команда;
9 | Перем ТекстФайла;
10 | Перем Приложение;
11 |
12 | Перем ЭтоWindows;
13 | Перем Лог;
14 | Перем НемедленнныйВывод;
15 | Перем КодировкаВывода;
16 |
17 | // Получить имя лога продукта
18 | //
19 | // Возвращаемое значение:
20 | // Строка - имя лога продукта
21 | //
22 | Функция ИмяЛога() Экспорт
23 | Возврат "oscript.lib.commands";
24 | КонецФункции
25 |
26 | // Установить путь к приложению.
27 | //
28 | // Параметры:
29 | // ПутьПриложения - Путь приложения (Строка)
30 | // Например для запуска скриптов PowerShell
31 | // Для 64bit PowerShell если стоит 64 битная система или 32bit PowerShell, если стоит 32 битная система
32 | // "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe"
33 | // Для 32bit PowerShell на 64 битных системах находится в папке:
34 | // "C:\Windows\syswow64\Windowspowershell\v1.0\powershell.exe"
35 | //
36 | Процедура УстановитьПриложение(Знач ПутьПриложения) Экспорт
37 | Приложение = ПутьПриложения;
38 | КонецПроцедуры // УстановитьПриложение()
39 |
40 | // Получить путь командного файла
41 | //
42 | // Возвращаемое значение:
43 | // Строка - путь командного файла
44 | //
45 | Функция ПолучитьПуть() Экспорт
46 | Возврат ПутьКоманды;
47 | КонецФункции
48 |
49 | // Получить вывод выполненной команды.
50 | //
51 | // Возвращаемое значение:
52 | // Строка - Вывод команды
53 | //
54 | Функция ПолучитьВывод() Экспорт
55 | ПроверитьЧтоКомандаВыполнена();
56 | Возврат Команда.ПолучитьВывод();
57 | КонецФункции
58 |
59 | // Установить кодировку вывода для выполнения команды.
60 | //
61 | // Параметры:
62 | // Строка, Неопределено - кодировка вывода
63 | // Если Неопределено, кодировка сбрасывается и используется значение по умолчанию от операционной системы
64 | //
65 | Процедура УстановитьКодировкуВывода(Знач НоваяКодировкаВывода) Экспорт
66 | КодировкаВывода = НоваяКодировкаВывода;
67 | КонецПроцедуры
68 |
69 | // Получить кодировка вывода выполняемой команды.
70 | //
71 | // Возвращаемое значение:
72 | // Строка - кодировка вывода команды
73 | //
74 | Функция ПолучитьКодировкуВывода() Экспорт
75 | Возврат КодировкаВывода;
76 | КонецФункции
77 |
78 | // Получить код возврата выполненной команды.
79 | //
80 | // Возвращаемое значение:
81 | // Число - код возврата команды
82 | //
83 | Функция ПолучитьКодВозврата() Экспорт
84 | ПроверитьЧтоКомандаВыполнена();
85 | Возврат Команда.ПолучитьКодВозврата();
86 | КонецФункции
87 |
88 | // Создать новый командный файл по переданному пути или создать новый временный файл
89 | //
90 | // Параметры:
91 | // Путь - Строка - путь создаваемого файла. Необязательное значение.
92 | // Если не задан, создается временный файл в каталоге временных файлов
93 | // Расширение - Строка - расширение исполняемого командного файла.
94 | // Если не задано, подставляется ".bat" для Windows или ".sh" для Linux.
95 | //
96 | // Возвращаемое значение:
97 | // Строка - Путь созданного файла
98 | //
99 | Функция Создать(Знач Путь = "", Знач Расширение="") Экспорт
100 |
101 | Если ПустаяСтрока(Расширение) Тогда
102 | Расширение = ?(ЭтоWindows, ".bat", ".sh");
103 | КонецЕсли;
104 | Если ПустаяСтрока(Путь) Тогда
105 | ПутьКоманды = ВременныеФайлы.НовоеИмяФайла(Расширение);
106 | Лог.Отладка("КомандныйФайл: задаю временный путь командного файла <%1>.", ПутьКоманды);
107 | Иначе
108 | ПутьКоманды = Путь;
109 | Лог.Отладка("КомандныйФайл: использую путь командного файла <%1>.", ПутьКоманды);
110 | КонецЕсли;
111 | Кодировка = ?(ЭтоWindows, "cp866", КодировкаТекста.UTF8NoBOM);
112 | Если ЭтоWindows Тогда
113 | ЗаписьТекста = Новый ЗаписьТекста(ПутьКоманды, Кодировка);
114 | Иначе
115 | ЗаписьТекста = Новый ЗаписьТекста(ПутьКоманды, Кодировка, , , Символы.ПС);
116 | КонецЕсли;
117 |
118 | ТекстФайла = "";
119 |
120 | Возврат ПутьКоманды;
121 |
122 | КонецФункции
123 |
124 | // Добавить очередную команду в командный файл
125 | //
126 | // Параметры:
127 | // Команда - Строка - очередная команда
128 | //
129 | Процедура ДобавитьКоманду(Знач Команда) Экспорт
130 | ПроверитьЧтоФайлОткрыт();
131 | ЗаписьТекста.ЗаписатьСтроку(Команда);
132 | ТекстФайла = ТекстФайла + Команда + Символы.ПС;
133 | КонецПроцедуры
134 |
135 | // Выполнить командный файл и вернуть код возврата
136 | //
137 | // Возвращаемое значение:
138 | // Число - код возврата
139 | //
140 | Функция Исполнить() Экспорт
141 |
142 | Закрыть();
143 |
144 | Команда = Новый Команда;
145 | Команда.УстановитьКодировкуВывода(КодировкаВывода);
146 | Команда.ПоказыватьВыводНемедленно(НемедленнныйВывод);
147 |
148 | Если ЗначениеЗаполнено(Приложение) Тогда
149 | СтрокаЗапуска = """%1""";
150 | ИначеЕсли ЭтоWindows Тогда
151 | Приложение = "cmd.exe";
152 | СтрокаЗапуска = "/C ""%1""";
153 | Иначе
154 | Приложение = "sh";
155 | СтрокаЗапуска = "'%1'";
156 | КонецЕсли;
157 | Команда.УстановитьКоманду(Приложение);
158 | Команда.ДобавитьПараметр(СтрШаблон(СтрокаЗапуска, ПутьКоманды));
159 |
160 | КодВозврата = Команда.Исполнить();
161 |
162 | Возврат КодВозврата;
163 |
164 | КонецФункции
165 |
166 | // Завершает запись командного файла
167 | //
168 | // Возвращаемое значение:
169 | // Строка - путь командного файла
170 | //
171 | Функция Закрыть() Экспорт
172 |
173 | Если ЗаписьТекста <> Неопределено Тогда
174 | ЗаписьТекста.Закрыть();
175 | ЗаписьТекста = Неопределено;
176 | КонецЕсли;
177 |
178 | Возврат ПутьКоманды;
179 |
180 | КонецФункции
181 |
182 | // Получить текст командного файла
183 | //
184 | // Возвращаемое значение:
185 | // Строка - текст командного файла
186 | //
187 | Функция ПолучитьТекстФайла() Экспорт
188 | Возврат ТекстФайла;
189 | КонецФункции
190 |
191 | // Управляет мгновенным выводом лога команды
192 | //
193 | // Параметры:
194 | // НемедленныйПоказ - Булевое
195 | // Ложь: показывает вывод только после завершения выполнения команды
196 | // Истина: показ вывода выполняется почти сразу, после появления очередной порции сообщений от команды
197 | //
198 | Процедура ПоказыватьВыводНемедленно(Знач НемедленныйПоказ) Экспорт
199 | НемедленнныйВывод = НемедленныйПоказ;
200 | КонецПроцедуры
201 |
202 | // Получить строку перенаправления ввода-вывода "> файл"
203 | //
204 | // Параметры:
205 | // ИмяФайлаПриемника - Строка - имя файла для перенаправления вывода
206 | // УчитыватьStdErr - Булево - Если Истина, писать ошибки в этот же файл
207 | // ПерезаписыватьФайл - Булево - Если Истина, файл предварительно очищается
208 | //
209 | // Возвращаемое значение:
210 | // Строка - строка перенаправления ввода-вывода "> файл"
211 | //
212 | Функция СуффиксПеренаправленияВывода(Знач ИмяФайлаПриемника, Знач УчитыватьStdErr = Истина, Знач ПерезаписыватьФайл = Истина) Экспорт
213 | Рез = "> """ + ИмяФайлаПриемника + """" + ?(УчитыватьStdErr, " 2>&1", "");
214 | Если Не ПерезаписыватьФайл Тогда
215 | Рез = ">" + Рез;
216 | КонецЕсли;
217 | Возврат Рез;
218 | КонецФункции
219 |
220 | //////////////////////////////////////////////////////////////////////////
221 | // Служебные процедуры и функции
222 |
223 | Процедура ПроверитьЧтоФайлОткрыт()
224 | Если ЗаписьТекста = Неопределено Тогда
225 | Создать();
226 | КонецЕсли;
227 | КонецПроцедуры
228 |
229 | Процедура ПроверитьЧтоКомандаВыполнена()
230 | Если Не ЗначениеЗаполнено(Команда) Тогда
231 | ВызватьИсключение СтрШаблон("Команда еще не выполнялась. <%1>", ПутьКоманды);
232 | КонецЕсли;
233 | КонецПроцедуры
234 |
235 | // Инициализация работы библиотеки.
236 | // Задает минимальные настройки.
237 | //
238 | Процедура Инициализация()
239 |
240 | Лог = Логирование.ПолучитьЛог(ИмяЛога());
241 |
242 | СистемнаяИнформация = Новый СистемнаяИнформация;
243 | ЭтоWindows = Найти(НРег(СистемнаяИнформация.ВерсияОС), "windows") > 0;
244 |
245 | ТекстФайла = "";
246 | НемедленнныйВывод = Ложь;
247 | КодировкаВывода = КодировкаТекста.OEM;
248 |
249 | Создать();
250 | КонецПроцедуры
251 |
252 | Инициализация();
253 |
--------------------------------------------------------------------------------
/.vscode/tasks.json:
--------------------------------------------------------------------------------
1 | {
2 | "version": "2.0.0",
3 | "_runner": "terminal",
4 | "windows": {
5 | "command": "cmd",
6 | "args": ["/c", "chcp", "65001", "&&"]
7 | // "args": ["/c", "chcp 65001 ;"]
8 | },
9 | "linux": {
10 | "command": "sh",
11 | "args": ["-c"]
12 | },
13 | // "isShellCommand": true,
14 | // "showOutput": "silent",
15 | "tasks": [
16 | {
17 | "taskName": "Testing project",
18 | "args": [
19 | "1testrunner",
20 | "-runall",
21 | "${workspaceRoot}/tests"
22 | ],
23 | "echoCommand": true,
24 | "showOutput": "always",
25 | // "suppressTaskName": true,
26 | // "isBuildCommand": false,
27 | "isTestCommand": false,
28 | "problemMatcher": {
29 | "fileLocation": "absolute",
30 | "pattern": {
31 | "regexp": "{Модуль\\s+(.+)\\s\\/\\s.*:\\s+(\\d+)\\s+\\/\\s+([^{]*)",
32 | "file": 1,
33 | "location": 2,
34 | "message": 3
35 | }
36 | }
37 | },
38 | {
39 | "taskName": "Testing current test-file",
40 | "args": [
41 | "1testrunner",
42 | "-run",
43 | "${file}"
44 | ],
45 | "echoCommand": true,
46 | "showOutput": "always",
47 | "suppressTaskName": true,
48 | "isBuildCommand": false,
49 | "isTestCommand": true,
50 | "problemMatcher": {
51 | "fileLocation": "absolute",
52 | "pattern": {
53 | "regexp": "{Модуль\\s+(.+)\\s\\/\\s.*:\\s+(\\d+)\\s+\\/\\s+([^{]*)",
54 | "file": 1,
55 | "location": 2,
56 | "message": 3
57 | }
58 | }
59 | },
60 | {
61 | "taskName": "Opm: package build",
62 | "args": [
63 | "opm",
64 | "build",
65 | "${workspaceRoot}"
66 | ],
67 | "echoCommand": true,
68 | "showOutput": "always",
69 | "suppressTaskName": true,
70 | "isBuildCommand": false
71 | },
72 | {
73 | "taskName": "Exec all features",
74 | "args": [
75 | "1bdd",
76 | "${workspaceRoot}/features",
77 | "-out",
78 | "${workspaceRoot}/exec.log"
79 | ],
80 | "echoCommand": true,
81 | "showOutput": "always",
82 | "suppressTaskName": true,
83 | "isBuildCommand": true,
84 | "isTestCommand": false,
85 | "problemMatcher": {
86 | "fileLocation": "absolute",
87 | "pattern": {
88 | "regexp": "{Модуль\\s+(.+)\\s\\/\\s.*:\\s+(\\d+)\\s+\\/\\s+([^{]*)",
89 | "file": 1,
90 | "location": 2,
91 | "message": 3
92 | }
93 | }
94 | },
95 | {
96 | "taskName": "Exec feature",
97 | "args": [
98 | "1bdd",
99 | "${file}",
100 | "-fail-fast",
101 | "-out",
102 | "${workspaceRoot}/exec.log"
103 | ],
104 | "echoCommand": true,
105 | "showOutput": "always",
106 | "suppressTaskName": true,
107 | "isBuildCommand": false,
108 | "isTestCommand": true,
109 | "problemMatcher": {
110 | "fileLocation": "absolute",
111 | "pattern": [
112 | {
113 | "regexp": "{Модуль\\s+(.+)\\s\\/\\s.*:\\s+(\\d+)\\s+\\/\\s+([^{]*)",
114 | "file": 1,
115 | "location": 2,
116 | "message": 3
117 | }
118 | ]
119 | }
120 | },
121 | {
122 | "taskName": "Exec feature for current step def",
123 | "args": [
124 | "1bdd",
125 | "${fileDirname}/../${fileBasenameNoExtension}.feature",
126 | "-fail-fast",
127 | "-out",
128 | "${workspaceRoot}/exec.log"
129 | ],
130 | "echoCommand": true,
131 | "showOutput": "always",
132 | "suppressTaskName": true,
133 | "isBuildCommand": false,
134 | "isTestCommand": true,
135 | "problemMatcher": {
136 | "fileLocation": "absolute",
137 | "pattern": [
138 | {
139 | "regexp": "{Модуль\\s+(.+)\\s\\/\\s.*:\\s+(\\d+)\\s+\\/\\s+([^{]*)",
140 | "file": 1,
141 | "location": 2,
142 | "message": 3
143 | }
144 | ]
145 | }
146 | },
147 | {
148 | "taskName": "Exec feature + debug",
149 | "args": [
150 | "1bdd",
151 | "${file}",
152 | "-fail-fast",
153 | "-verbose",
154 | "on",
155 | "-out",
156 | "${workspaceRoot}/exec.log"
157 | ],
158 | "echoCommand": true,
159 | "showOutput": "always",
160 | "suppressTaskName": true,
161 | // "isBuildCommand": false,
162 | "isTestCommand": false,
163 | "problemMatcher": {
164 | "fileLocation": "absolute",
165 | "pattern": {
166 | "regexp": "{Модуль\\s+(.+)\\s\\/\\s.*:\\s+(\\d+)\\s+\\/\\s+([^{]*)",
167 | "file": 1,
168 | "location": 2,
169 | "message": 3
170 | }
171 | }
172 | },
173 | {
174 | "taskName": "Generate feature steps",
175 | "args": [
176 | "1bdd",
177 | "gen",
178 | "${file}",
179 | "-out",
180 | "${workspaceRoot}/exec.log"
181 | ],
182 | "echoCommand": true,
183 | "showOutput": "always",
184 | "suppressTaskName": true,
185 | "isBuildCommand": false,
186 | "isTestCommand": false,
187 | "problemMatcher": {
188 | "fileLocation": "absolute",
189 | "pattern": {
190 | "regexp": "{Модуль\\s+(.+)\\s\\/\\s.*:\\s+(\\d+)\\s+\\/\\s+([^{]*)",
191 | "file": 1,
192 | "location": 2,
193 | "message": 3
194 | }
195 | }
196 | },
197 | {
198 | "taskName": "OneScript: compile",
199 | "args": [
200 | "oscript",
201 | "-encoding=utf-8",
202 | "-compile",
203 | "${file}"
204 | ],
205 | "echoCommand": true,
206 | "showOutput": "always",
207 | "suppressTaskName": true,
208 | "isBuildCommand": false
209 | },
210 | {
211 | "taskName": "OneScript: check",
212 | "args": [
213 | "oscript",
214 | "-encoding=utf-8",
215 | "-check",
216 | "${file}"
217 | ],
218 | "echoCommand": true,
219 | "showOutput": "always",
220 | "suppressTaskName": true,
221 | "isBuildCommand": false
222 | },
223 | {
224 | "taskName": "OneScript: make",
225 | "args": [
226 | "oscript",
227 | "-encoding=utf-8",
228 | "-make",
229 | "${file}",
230 | "${fileBasename}.exe"
231 | ],
232 | "echoCommand": true,
233 | "showOutput": "always",
234 | "suppressTaskName": true,
235 | "isBuildCommand": false
236 | },
237 | {
238 | "taskName": "OneScript: run",
239 | "args": [
240 | "oscript",
241 | "-encoding=utf-8",
242 | "${file}"
243 | ],
244 | "echoCommand": true,
245 | "showOutput": "always",
246 | "suppressTaskName": true,
247 | "isBuildCommand": true,
248 | "problemMatcher": {
249 | "fileLocation": "absolute",
250 | "pattern": {
251 | "regexp": "^{Модуль\\s+(.*)\\s\\/\\s.*:\\s+(\\d+)\\s+\\/\\s+(.*)}$",
252 | "file": 1,
253 | "location": 2,
254 | "message": 3
255 | }
256 | }
257 | }
258 | ]
259 | }
--------------------------------------------------------------------------------
/LICENSE.md:
--------------------------------------------------------------------------------
1 | Apache License
2 | ==============
3 |
4 | _Version 2.0, January 2004_
5 | _<>_
6 |
7 | ### Terms and Conditions for use, reproduction, and distribution
8 |
9 | #### 1. Definitions
10 |
11 | “License” shall mean the terms and conditions for use, reproduction, and
12 | distribution as defined by Sections 1 through 9 of this document.
13 |
14 | “Licensor” shall mean the copyright owner or entity authorized by the copyright
15 | owner that is granting the License.
16 |
17 | “Legal Entity” shall mean the union of the acting entity and all other entities
18 | that control, are controlled by, or are under common control with that entity.
19 | For the purposes of this definition, “control” means **(i)** the power, direct or
20 | indirect, to cause the direction or management of such entity, whether by
21 | contract or otherwise, or **(ii)** ownership of fifty percent (50%) or more of the
22 | outstanding shares, or **(iii)** beneficial ownership of such entity.
23 |
24 | “You” (or “Your”) shall mean an individual or Legal Entity exercising
25 | permissions granted by this License.
26 |
27 | “Source” form shall mean the preferred form for making modifications, including
28 | but not limited to software source code, documentation source, and configuration
29 | files.
30 |
31 | “Object” form shall mean any form resulting from mechanical transformation or
32 | translation of a Source form, including but not limited to compiled object code,
33 | generated documentation, and conversions to other media types.
34 |
35 | “Work” shall mean the work of authorship, whether in Source or Object form, made
36 | available under the License, as indicated by a copyright notice that is included
37 | in or attached to the work (an example is provided in the Appendix below).
38 |
39 | “Derivative Works” shall mean any work, whether in Source or Object form, that
40 | is based on (or derived from) the Work and for which the editorial revisions,
41 | annotations, elaborations, or other modifications represent, as a whole, an
42 | original work of authorship. For the purposes of this License, Derivative Works
43 | shall not include works that remain separable from, or merely link (or bind by
44 | name) to the interfaces of, the Work and Derivative Works thereof.
45 |
46 | “Contribution” shall mean any work of authorship, including the original version
47 | of the Work and any modifications or additions to that Work or Derivative Works
48 | thereof, that is intentionally submitted to Licensor for inclusion in the Work
49 | by the copyright owner or by an individual or Legal Entity authorized to submit
50 | on behalf of the copyright owner. For the purposes of this definition,
51 | “submitted” means any form of electronic, verbal, or written communication sent
52 | to the Licensor or its representatives, including but not limited to
53 | communication on electronic mailing lists, source code control systems, and
54 | issue tracking systems that are managed by, or on behalf of, the Licensor for
55 | the purpose of discussing and improving the Work, but excluding communication
56 | that is conspicuously marked or otherwise designated in writing by the copyright
57 | owner as “Not a Contribution.”
58 |
59 | “Contributor” shall mean Licensor and any individual or Legal Entity on behalf
60 | of whom a Contribution has been received by Licensor and subsequently
61 | incorporated within the Work.
62 |
63 | #### 2. Grant of Copyright License
64 |
65 | Subject to the terms and conditions of this License, each Contributor hereby
66 | grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,
67 | irrevocable copyright license to reproduce, prepare Derivative Works of,
68 | publicly display, publicly perform, sublicense, and distribute the Work and such
69 | Derivative Works in Source or Object form.
70 |
71 | #### 3. Grant of Patent License
72 |
73 | Subject to the terms and conditions of this License, each Contributor hereby
74 | grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,
75 | irrevocable (except as stated in this section) patent license to make, have
76 | made, use, offer to sell, sell, import, and otherwise transfer the Work, where
77 | such license applies only to those patent claims licensable by such Contributor
78 | that are necessarily infringed by their Contribution(s) alone or by combination
79 | of their Contribution(s) with the Work to which such Contribution(s) was
80 | submitted. If You institute patent litigation against any entity (including a
81 | cross-claim or counterclaim in a lawsuit) alleging that the Work or a
82 | Contribution incorporated within the Work constitutes direct or contributory
83 | patent infringement, then any patent licenses granted to You under this License
84 | for that Work shall terminate as of the date such litigation is filed.
85 |
86 | #### 4. Redistribution
87 |
88 | You may reproduce and distribute copies of the Work or Derivative Works thereof
89 | in any medium, with or without modifications, and in Source or Object form,
90 | provided that You meet the following conditions:
91 |
92 | * **(a)** You must give any other recipients of the Work or Derivative Works a copy of
93 | this License; and
94 | * **(b)** You must cause any modified files to carry prominent notices stating that You
95 | changed the files; and
96 | * **(c)** You must retain, in the Source form of any Derivative Works that You distribute,
97 | all copyright, patent, trademark, and attribution notices from the Source form
98 | of the Work, excluding those notices that do not pertain to any part of the
99 | Derivative Works; and
100 | * **(d)** If the Work includes a “NOTICE” text file as part of its distribution, then any
101 | Derivative Works that You distribute must include a readable copy of the
102 | attribution notices contained within such NOTICE file, excluding those notices
103 | that do not pertain to any part of the Derivative Works, in at least one of the
104 | following places: within a NOTICE text file distributed as part of the
105 | Derivative Works; within the Source form or documentation, if provided along
106 | with the Derivative Works; or, within a display generated by the Derivative
107 | Works, if and wherever such third-party notices normally appear. The contents of
108 | the NOTICE file are for informational purposes only and do not modify the
109 | License. You may add Your own attribution notices within Derivative Works that
110 | You distribute, alongside or as an addendum to the NOTICE text from the Work,
111 | provided that such additional attribution notices cannot be construed as
112 | modifying the License.
113 |
114 | You may add Your own copyright statement to Your modifications and may provide
115 | additional or different license terms and conditions for use, reproduction, or
116 | distribution of Your modifications, or for any such Derivative Works as a whole,
117 | provided Your use, reproduction, and distribution of the Work otherwise complies
118 | with the conditions stated in this License.
119 |
120 | #### 5. Submission of Contributions
121 |
122 | Unless You explicitly state otherwise, any Contribution intentionally submitted
123 | for inclusion in the Work by You to the Licensor shall be under the terms and
124 | conditions of this License, without any additional terms or conditions.
125 | Notwithstanding the above, nothing herein shall supersede or modify the terms of
126 | any separate license agreement you may have executed with Licensor regarding
127 | such Contributions.
128 |
129 | #### 6. Trademarks
130 |
131 | This License does not grant permission to use the trade names, trademarks,
132 | service marks, or product names of the Licensor, except as required for
133 | reasonable and customary use in describing the origin of the Work and
134 | reproducing the content of the NOTICE file.
135 |
136 | #### 7. Disclaimer of Warranty
137 |
138 | Unless required by applicable law or agreed to in writing, Licensor provides the
139 | Work (and each Contributor provides its Contributions) on an “AS IS” BASIS,
140 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied,
141 | including, without limitation, any warranties or conditions of TITLE,
142 | NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are
143 | solely responsible for determining the appropriateness of using or
144 | redistributing the Work and assume any risks associated with Your exercise of
145 | permissions under this License.
146 |
147 | #### 8. Limitation of Liability
148 |
149 | In no event and under no legal theory, whether in tort (including negligence),
150 | contract, or otherwise, unless required by applicable law (such as deliberate
151 | and grossly negligent acts) or agreed to in writing, shall any Contributor be
152 | liable to You for damages, including any direct, indirect, special, incidental,
153 | or consequential damages of any character arising as a result of this License or
154 | out of the use or inability to use the Work (including but not limited to
155 | damages for loss of goodwill, work stoppage, computer failure or malfunction, or
156 | any and all other commercial damages or losses), even if such Contributor has
157 | been advised of the possibility of such damages.
158 |
159 | #### 9. Accepting Warranty or Additional Liability
160 |
161 | While redistributing the Work or Derivative Works thereof, You may choose to
162 | offer, and charge a fee for, acceptance of support, warranty, indemnity, or
163 | other liability obligations and/or rights consistent with this License. However,
164 | in accepting such obligations, You may act only on Your own behalf and on Your
165 | sole responsibility, not on behalf of any other Contributor, and only if You
166 | agree to indemnify, defend, and hold each Contributor harmless for any liability
167 | incurred by, or claims asserted against, such Contributor by reason of your
168 | accepting any such warranty or additional liability.
169 |
170 | _END OF TERMS AND CONDITIONS_
171 |
172 | ### APPENDIX: How to apply the Apache License to your work
173 |
174 | To apply the Apache License to your work, attach the following boilerplate
175 | notice, with the fields enclosed by brackets `[]` replaced with your own
176 | identifying information. (Don't include the brackets!) The text should be
177 | enclosed in the appropriate comment syntax for the file format. We also
178 | recommend that a file or class name and description of purpose be included on
179 | the same “printed page” as the copyright notice for easier identification within
180 | third-party archives.
181 |
182 | Copyright [yyyy] [name of copyright owner]
183 |
184 | Licensed under the Apache License, Version 2.0 (the "License");
185 | you may not use this file except in compliance with the License.
186 | You may obtain a copy of the License at
187 |
188 | http://www.apache.org/licenses/LICENSE-2.0
189 |
190 | Unless required by applicable law or agreed to in writing, software
191 | distributed under the License is distributed on an "AS IS" BASIS,
192 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
193 | See the License for the specific language governing permissions and
194 | limitations under the License.
195 |
--------------------------------------------------------------------------------
/src/Команда.os:
--------------------------------------------------------------------------------
1 | //////////////////////////////////////////////////////////////////////////
2 | // Работа с командными файлами
3 |
4 | #Использовать logos
5 | #Использовать asserts
6 |
7 |
8 | Перем Приложение;
9 | Перем ИспользуетсяЕдинаяСтрокаЗапуска;
10 | Перем Параметры;
11 | Перем РабочийКаталог;
12 | Перем ВыводКоманды;
13 | Перем КодировкаВывода;
14 | Перем КодВозврата;
15 | Перем ИспользуемКомандныйПроцессор;
16 | Перем ПроверяемКодВозврата;
17 | Перем МинимальныйОжидаемыйКодВозврата;
18 | Перем МаксимальныйОжидаемыйКодВозврата;
19 | Перем ПериодОпросаВМиллисекундах;
20 | Перем НемедленнныйВывод;
21 | Перем ПодключенныеЛоги;
22 | Перем ОбработчикОжиданияПроцесса;
23 | Перем ДополнительныеПараметрыОбработчика;
24 | Перем ПерехватыватьПотоки;
25 |
26 | Перем ВерсияБольшеИлиРавна21;
27 | Перем ЭтоWindows;
28 | Перем Лог;
29 |
30 | Перем ПеременныеСредыПроцесса;
31 |
32 | // Выполнение произвольной команды
33 | //
34 | // Возвращаемое значение:
35 | // Число - код возврата команды
36 | //
37 | Функция Исполнить() Экспорт
38 |
39 | ПроверитьВозможностьВыполненияКоманды();
40 |
41 | КодВозврата = ЗапуститьИПодождать();
42 |
43 | Лог.Отладка("Код возврата равен %1", КодВозврата);
44 | Возврат КодВозврата;
45 |
46 | КонецФункции
47 |
48 | // Запуск на выполнение процесса
49 | //
50 | // Возвращаемое значение:
51 | // Процесс - объект класса Процесс
52 | //
53 | Функция ЗапуститьПроцесс() Экспорт
54 |
55 | ПроверитьВозможностьВыполненияКоманды();
56 |
57 | Процесс = ЗапуститьПроцессКоманды();
58 |
59 | Лог.Отладка("Запущен процесс с идентификатором <%1>", Процесс.Идентификатор);
60 |
61 | Возврат Процесс;
62 |
63 | КонецФункции
64 |
65 | // Получить имя лога продукта
66 | //
67 | // Возвращаемое значение:
68 | // Строка - имя лога продукта
69 | //
70 | Функция ИмяЛога() Экспорт
71 | Возврат "oscript.lib.commands";
72 | КонецФункции
73 |
74 | // Установить путь команды.
75 | // Если в пути команды есть пробелы, они обрамляются кавычками
76 | // ВАЖНО: метод принимает именно путь к приложению,
77 | // параметры приложения здесь передавать не следует!!
78 | // Для передачи параметров нужно использовать метод "УстановитьСтрокуЗапуска"
79 | //
80 | //
81 | // Параметры:
82 | // ПутьКоманды - Путь команды (Строка)
83 | //
84 | Процедура УстановитьКоманду(Знач ПутьКоманды) Экспорт
85 | Приложение = ПутьКоманды;
86 | ИспользуетсяЕдинаяСтрокаЗапуска = Ложь;
87 | КонецПроцедуры
88 |
89 | // Установить строку запуска команды.
90 | // В этом случае обрамления кавычками не выполняется.
91 | //
92 | // Параметры:
93 | // СтрокаЗапуска - строка запуска команды (Строка)
94 | //
95 | Процедура УстановитьСтрокуЗапуска(Знач СтрокаЗапуска) Экспорт
96 | Приложение = СтрокаЗапуска;
97 | ИспользуетсяЕдинаяСтрокаЗапуска = Истина;
98 | КонецПроцедуры
99 |
100 | // Получить путь команды.
101 | //
102 | // Возвращаемое значение:
103 | // Строка - Путь команды
104 | //
105 | Функция ПолучитьКоманду() Экспорт
106 | Возврат Приложение;
107 | КонецФункции
108 |
109 | // Устанавливает переменные среды для процесса
110 | //
111 | // Параметры:
112 | // ППеременныеСредыПроцесса - Соответствие - где ключ имя переменной, а значение - значение переменной
113 | //
114 | Процедура УстановитьПеременныеСреды(ППеременныеСредыПроцесса) Экспорт
115 | ПеременныеСредыПроцесса = ППеременныеСредыПроцесса;
116 | КонецПроцедуры
117 |
118 | // Устанавливает признак необходимости перехватывать потоки
119 | // по умолчанию потоки всегда перехватываются
120 | //
121 | // Параметры:
122 | // ППерехватыватьПотоки - Булево - признак необходимости перехвата потоков процесса
123 | //
124 | Процедура ПерехватыватьПотоки(ППерехватыватьПотоки) Экспорт
125 | ПерехватыватьПотоки = ППерехватыватьПотоки;
126 | КонецПроцедуры
127 |
128 | // Добавить параметр команды.
129 | //
130 | // Параметры:
131 | // Строка - новый единичный параметр или все параметы в одной строке
132 | //
133 | Процедура ДобавитьПараметр(Знач Параметр) Экспорт
134 | Параметры.Добавить(Параметр);
135 | КонецПроцедуры
136 |
137 | // Добавить параметры команды.
138 | //
139 | // Параметры:
140 | // Массив - массив параметров
141 | //
142 | Процедура ДобавитьПараметры(Знач МассивПараметров) Экспорт
143 | Для каждого Параметр Из МассивПараметров Цикл
144 | Параметры.Добавить(Параметр);
145 | КонецЦикла;
146 | КонецПроцедуры
147 |
148 | // Установить новые параметры команды.
149 | // Может использовать для очистки параметров. Для этого нужно передать пустую строку
150 | //
151 | // Параметры:
152 | // Строка - параметы в одной строке
153 | //
154 | Процедура УстановитьПараметры(Знач СтрокаПараметров) Экспорт
155 | Параметры = Новый Массив;
156 | Параметры.Добавить(СтрокаПараметров);
157 | КонецПроцедуры
158 |
159 | // Получить параметры команды.
160 | //
161 | // Возвращаемое значение:
162 | // Массив - Параметры команды
163 | //
164 | Функция ПолучитьПараметры() Экспорт
165 | Возврат Параметры;
166 | КонецФункции
167 |
168 | // Получить вывод выполненной команды.
169 | //
170 | // Возвращаемое значение:
171 | // Строка - Вывод команды
172 | //
173 | Функция ПолучитьВывод() Экспорт
174 | Возврат ВыводКоманды;
175 | КонецФункции
176 |
177 | // Получить код возврата выполненной команды.
178 | //
179 | // Возвращаемое значение:
180 | // Число - код возврата команды
181 | //
182 | Функция ПолучитьКодВозврата() Экспорт
183 | Возврат КодВозврата;
184 | КонецФункции
185 |
186 | // Управляет мгновенным выводом лога команды
187 | //
188 | // Параметры:
189 | // НемедленныйПоказ - Булевое
190 | // Ложь: показывает вывод только после завершения выполнения команды
191 | // Истина: показ вывода выполняется почти сразу, после появления очередной порции сообщений от команды
192 | //
193 | Процедура ПоказыватьВыводНемедленно(Знач НемедленныйПоказ) Экспорт
194 | НемедленнныйВывод = НемедленныйПоказ;
195 | КонецПроцедуры
196 |
197 | // Устанавливает передачу вывода команды в дополнительный лог
198 | //
199 | // Параметры:
200 | // ИмяЛогаИлиЛог - <Строка, Лог> - имя лога или объект лога
201 | //
202 | Процедура ДобавитьЛогВыводаКоманды(Знач ИмяЛогаИлиЛог) Экспорт
203 |
204 | НовыйЛог = ИмяЛогаИлиЛог;
205 | Если ТипЗнч(ИмяЛогаИлиЛог) = Тип("Строка") Тогда
206 | НовыйЛог = Логирование.ПолучитьЛог(ИмяЛогаИлиЛог);
207 | КонецЕсли;
208 |
209 | ПодключенныеЛоги.Добавить(НовыйЛог);
210 |
211 | КонецПроцедуры
212 |
213 | // Устанавливает обработчик ожидания для процесса
214 | //
215 | // Параметры:
216 | // Обработчик - Произвольный - класс реализующих метод <ОбработкаОжиданияПроцесса>
217 | // ППериодОпросаВМиллисекундах - Число - период вызова обработчика ожидания, мс (по умолчанию 5000)
218 | // ДополнительныеПараметры - Структура - дополнительные параметры передаваемые в обработчик ожидания
219 | //
220 | Процедура УстановитьОбработчикОжидания(Обработчик, Знач ППериодОпросаВМиллисекундах = 5000, ДополнительныеПараметры = Неопределено) Экспорт
221 |
222 | ОбработчикОжиданияПроцесса = Обработчик;
223 | ПериодОпросаВМиллисекундах = ППериодОпросаВМиллисекундах;
224 | ДополнительныеПараметрыОбработчика = ДополнительныеПараметры;
225 | КонецПроцедуры
226 |
227 | // Установить ожидаемый код возврата
228 | // После исполнения команды будет выброшено исключение, если полученный код возврата не совпадает с ожидаемым
229 | //
230 | // Параметры:
231 | // ОжидаемыйКодВозврата - Число
232 | //
233 | Процедура УстановитьПравильныйКодВозврата(Знач ПарамОжидаемыйКодВозврата) Экспорт
234 | УстановитьДиапазонПравильныхКодовВозврата(ПарамОжидаемыйКодВозврата, ПарамОжидаемыйКодВозврата);
235 | КонецПроцедуры
236 |
237 | // Установить диапазон ожидаемых кодов возврата
238 | // После исполнения команды будет выброшено исключение, если полученный код возврата не попадает в указанный диапазон
239 | //
240 | // Параметры:
241 | // МинимальныйОжидаемыйКодВозврата - Число
242 | // МаксимальныйОжидаемыйКодВозврата - Число
243 | //
244 | Процедура УстановитьДиапазонПравильныхКодовВозврата( Знач ПарамМинимальныйОжидаемыйКодВозврата,
245 | Знач ПарамМаксимальныйОжидаемыйКодВозврата) Экспорт
246 |
247 | ПроверяемКодВозврата = Истина;
248 | МинимальныйОжидаемыйКодВозврата = ПарамМинимальныйОжидаемыйКодВозврата;
249 | МаксимальныйОжидаемыйКодВозврата = ПарамМаксимальныйОжидаемыйКодВозврата;
250 |
251 | КонецПроцедуры
252 |
253 | // Установить кодировку вывода для выполнения команды.
254 | //
255 | // Параметры:
256 | // Строка, Неопределено - кодировка вывода
257 | // Если Неопределено, кодировка сбрасывается и используется значение по умолчанию от операционной системы
258 | //
259 | Процедура УстановитьКодировкуВывода(Знач НоваяКодировкаВывода) Экспорт
260 | КодировкаВывода = НоваяКодировкаВывода;
261 | КонецПроцедуры
262 |
263 | // Получить кодировка вывода выполняемой команды.
264 | //
265 | // Возвращаемое значение:
266 | // Строка - кодировка вывода команды
267 | //
268 | Функция ПолучитьКодировкуВывода() Экспорт
269 | Возврат КодировкаВывода;
270 | КонецФункции
271 |
272 | // Установить период опроса завершения.
273 | //
274 | // Параметры:
275 | // ПериодОпросаВМиллисекундах - период опроса, в миллисекундах
276 | //
277 | Процедура УстановитьПериодОпросаЗавершения(Знач ПарамПериодОпросаВМиллисекундах) Экспорт
278 | ПериодОпросаВМиллисекундах = ПарамПериодОпросаВМиллисекундах;
279 | КонецПроцедуры
280 |
281 | // Установить новый рабочий каталог.
282 | //
283 | // Параметры:
284 | // Строка - Путь к новому рабочему каталогу
285 | //
286 | Процедура УстановитьРабочийКаталог(Знач НовыйРабочийКаталог) Экспорт
287 | РабочийКаталог = НовыйРабочийКаталог;
288 | КонецПроцедуры
289 |
290 | // Получить текущий рабочий каталог.
291 | //
292 | // Возвращаемое значение:
293 | // Строка - Путь к рабочему каталогу
294 | //
295 | Функция ПолучитьРабочийКаталог() Экспорт
296 | Возврат РабочийКаталог;
297 | КонецФункции
298 |
299 | // Установить признак исполнения через командный процессор системы.
300 | // По умолчанию он включен.
301 | //
302 | // Параметры:
303 | // ИспользуемКомандныйПроцессор - Булево - Включить/Выключить использование командного процессора системы.
304 | //
305 | Процедура УстановитьИсполнениеЧерезКомандыСистемы(Знач ПарамИспользуемКомандныйПроцессор) Экспорт
306 | ИспользуемКомандныйПроцессор = ПарамИспользуемКомандныйПроцессор;
307 | КонецПроцедуры
308 |
309 | // Оборачивает переданную строку в кавычки, если она еще не обернута.
310 | //
311 | // Параметры:
312 | // Строка - Строка - Входящая строка
313 | //
314 | // Возвращаемое значение:
315 | // Строка - Строка, обернутая в кавычки
316 | //
317 | Функция ОбернутьВКавычки(Знач Строка) Экспорт
318 |
319 | Если Лев(Строка, 1) = """" и Прав(Строка, 1) = """" Тогда
320 | Возврат Строка;
321 | Иначе
322 | Возврат """" + Строка + """";
323 | КонецЕсли;
324 |
325 | КонецФункции
326 |
327 | //////////////////////////////////////////////////////////////////////////
328 | // Служебные процедуры и функции
329 |
330 | // Установить вывод последней выполненной команды.
331 | //
332 | // Параметры:
333 | // Сообщение - Строка - Вывод команды
334 | //
335 | Процедура УстановитьВывод(Знач Сообщение)
336 | ВыводКоманды = Сообщение;
337 | КонецПроцедуры
338 |
339 | // Проверяет возможность выполнить команду.
340 | //
341 | Процедура ПроверитьВозможностьВыполненияКоманды()
342 |
343 | Ожидаем.Что(ПолучитьРабочийКаталог(), "Рабочий каталог не установлен.").Заполнено();
344 |
345 | Лог.Отладка("РабочийКаталог: " + ПолучитьРабочийКаталог());
346 |
347 | КонецПроцедуры
348 |
349 | // Запустить команду в операционной системе с ожиданием ее выполнения
350 | //
351 | // Параметры:
352 | // Параметры - Массив - Массив строковых аргументов, передаваемых в командную
353 | // строку. Добавляются после исполняемого файла.
354 | //
355 | // Возвращаемое значение:
356 | // Число - Код возврата приложения
357 | //
358 | Функция ЗапуститьИПодождать()
359 |
360 | СтрокаЗапуска = СформироватьСтрокуЗапускаПроцесса();
361 |
362 | ПерехватыватьПотоки = Истина;
363 |
364 | Процесс = ЗапуститьПроцессКоманды(ПерехватыватьПотоки);
365 |
366 | ПолучитьВыводПокаПроцессИсполняется(Процесс);
367 |
368 | КодВозврата = Процесс.КодВозврата;
369 | ПроверитьКодВозврата(КодВозврата);
370 |
371 | Возврат КодВозврата;
372 |
373 | КонецФункции
374 |
375 |
376 | // Запустить команду в операционной системе с ожиданием ее выполнения
377 | //
378 | // Параметры:
379 | // Параметры - Массив - Массив строковых аргументов, передаваемых в командную
380 | // строку. Добавляются после исполняемого файла.
381 | //
382 | // Возвращаемое значение:
383 | // Процесс - запущенный процесс
384 | //
385 | Функция ЗапуститьПроцессКоманды(ПерехватыватьПотоки = Ложь)
386 |
387 | СтрокаЗапуска = СформироватьСтрокуЗапускаПроцесса();
388 |
389 | Попытка
390 |
391 | Если КодировкаВывода = Неопределено Тогда
392 | Процесс = СоздатьПроцесс(СтрокаЗапуска, РабочийКаталог, ПерехватыватьПотоки, ПерехватыватьПотоки, , ПеременныеСредыПроцесса);
393 | Иначе
394 | Процесс = СоздатьПроцесс(СтрокаЗапуска, РабочийКаталог, ПерехватыватьПотоки, ПерехватыватьПотоки, КодировкаВывода, ПеременныеСредыПроцесса);
395 | КонецЕсли;
396 |
397 |
398 | Исключение
399 |
400 | Инфо = ИнформацияОбОшибке();
401 |
402 | ВызватьИсключение Инфо.ПодробноеОписаниеОшибки();
403 |
404 | КонецПопытки;
405 |
406 | Процесс.Запустить();
407 |
408 | Возврат Процесс;
409 |
410 | КонецФункции
411 |
412 | Функция СформироватьСтрокуЗапускаПроцесса()
413 | Перем ПутьПриложения;
414 |
415 | ПутьПриложения = Приложение;
416 |
417 | СтрокаЗапуска = "";
418 | СтрокаДляЛога = "";
419 | Для Каждого Параметр Из Параметры Цикл
420 |
421 | СтрокаЗапуска = СтрокаЗапуска + " " + Параметр;
422 |
423 | Если Лев(Параметр, 2) <> "/P" и Лев(Параметр, 25) <> "/ConfigurationRepositoryP" Тогда
424 | СтрокаДляЛога = СтрокаДляЛога + " " + Параметр;
425 | КонецЕсли;
426 |
427 | КонецЦикла;
428 |
429 | Если НЕ ИспользуетсяЕдинаяСтрокаЗапуска И Найти(ПутьПриложения, " ") > 0 Тогда
430 | ПутьПриложения = ОбернутьВКавычки(ПутьПриложения);
431 | КонецЕсли;
432 | Лог.Отладка("Строка запуска <%1>", ПутьПриложения + СтрокаДляЛога);
433 |
434 | СтрокаЗапуска = ПутьПриложения + СтрокаЗапуска;
435 |
436 | Если ИспользуемКомандныйПроцессор Тогда
437 | Если ЭтоWindows Тогда
438 | ШаблонЗапуска = "cmd /c ""%1""";
439 | Иначе
440 | ШаблонЗапуска = "sh -c '%1'";
441 | КонецЕсли;
442 |
443 | СтрокаЗапуска = СтрШаблон(ШаблонЗапуска, СтрокаЗапуска);
444 | КонецЕсли;
445 | Лог.Отладка("Полная строка запуска <%1>", СтрокаЗапуска);
446 |
447 | Возврат СтрокаЗапуска;
448 | КонецФункции // СформироватьСтрокуЗапускаПроцесса()
449 |
450 | Процедура ОбработкаОжиданияПроцесса(Процесс, ЗаписьXML)
451 |
452 | ПрерываниеПроцесса = Ложь;
453 | СтандартнаяОбработка = Истина;
454 | УстановленОбработчикОжиданияПроцесса = НЕ ОбработчикОжиданияПроцесса = Неопределено;
455 |
456 | Если ДополнительныеПараметрыОбработчика = Неопределено Тогда
457 | ДополнительныеПараметры = Новый Структура();
458 | Иначе
459 | ДополнительныеПараметры = ДополнительныеПараметрыОбработчика;
460 | КонецЕсли;
461 |
462 | Если УстановленОбработчикОжиданияПроцесса Тогда
463 |
464 | Обработчик = ОбработчикОжиданияПроцесса;
465 |
466 | Лог.Отладка("Вызов обработчика ожидания");
467 | Попытка
468 | Обработчик.ОбработкаОжиданияПроцесса(Процесс,
469 | ПрерываниеПроцесса,
470 | ПериодОпросаВМиллисекундах,
471 | ДополнительныеПараметры,
472 | СтандартнаяОбработка);
473 | Исключение
474 | Лог.Отладка(ОписаниеОшибки());
475 | ВызватьИсключение КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
476 | КонецПопытки;
477 |
478 | КонецЕсли;
479 |
480 | Если СтандартнаяОбработка Тогда
481 |
482 | Если ПерехватыватьПотоки
483 | И Процесс.ПотокВывода.ЕстьДанные
484 | ИЛИ Процесс.ПотокОшибок.ЕстьДанные Тогда
485 |
486 | ОбработатьОчереднуюСтрокуВывода(Процесс.ПотокВывода, ЗаписьXML, "В цикле");
487 | ОбработатьОчереднуюСтрокуВывода(Процесс.ПотокОшибок, ЗаписьXML, "В цикле", Истина);
488 |
489 | КонецЕсли;
490 |
491 | КонецЕсли;
492 |
493 | Если ПрерываниеПроцесса Тогда
494 |
495 | Процесс.Завершить();
496 |
497 | КонецЕсли;
498 |
499 | КонецПроцедуры
500 |
501 | Процедура ПолучитьВыводПокаПроцессИсполняется(Процесс)
502 |
503 | ЗаписьXML = Новый ЗаписьXML();
504 | ЗаписьXML.УстановитьСтроку();
505 |
506 | Если ПериодОпросаВМиллисекундах <> 0 Тогда
507 | Приостановить(ПериодОпросаВМиллисекундах);
508 | ОбработкаОжиданияПроцесса(Процесс, ЗаписьXML)
509 | КонецЕсли;
510 |
511 | Пока НЕ Процесс.Завершен Цикл
512 |
513 | Если ПериодОпросаВМиллисекундах <> 0 Тогда
514 | Приостановить(ПериодОпросаВМиллисекундах);
515 | КонецЕсли;
516 |
517 | ОбработкаОжиданияПроцесса(Процесс, ЗаписьXML)
518 |
519 | КонецЦикла;
520 |
521 | // Дочитывает данные после завершения ?? Хотя процесс не может завершиться пока есть данные в потоке чтения
522 | Если ПерехватыватьПотоки
523 | И Процесс.ПотокВывода.ЕстьДанные
524 | ИЛИ Процесс.ПотокОшибок.ЕстьДанные Тогда
525 |
526 | ОбработатьОчереднуюСтрокуВывода(Процесс.ПотокВывода, ЗаписьXML, "В цикле");
527 | ОбработатьОчереднуюСтрокуВывода(Процесс.ПотокОшибок, ЗаписьXML, "В цикле", Истина);
528 |
529 | КонецЕсли;
530 |
531 | РезультатРаботыПроцесса = ЗаписьXML.Закрыть();
532 | // Если Не НемедленнныйВывод Тогда
533 | // Лог.Отладка("РезультатРаботыПроцесса %2-----%2%1%2------%2", РезультатРаботыПроцесса, Символы.ПС);
534 | // КонецЕсли;
535 |
536 | Лог.Отладка("Длина вывода %1, количество строк %2", СтрДлина(РезультатРаботыПроцесса),
537 | СтрЧислоСтрок(РезультатРаботыПроцесса));
538 |
539 | УстановитьВывод(РезультатРаботыПроцесса);
540 |
541 | КонецПроцедуры
542 |
543 | Функция ОбработатьОчереднуюСтрокуВывода(ПотокПроцесса, ЗаписьXML, Знач ПрефиксДляОтладки, Знач ЭтоВыводОшибки = Ложь)
544 | Рез = "";
545 | Если ПотокПроцесса.ЕстьДанные Тогда
546 | Рез = ПотокПроцесса.Прочитать();
547 | КонецЕсли;
548 |
549 | Если Рез <> "" Тогда
550 | Если ЗначениеЗаполнено(ПодключенныеЛоги) Тогда
551 | Для каждого ПодключенныйЛог Из ПодключенныеЛоги Цикл
552 | Если ЭтоВыводОшибки Тогда
553 | ПодключенныйЛог.Ошибка(Рез);
554 | Иначе
555 | ПодключенныйЛог.Информация(Рез);
556 | КонецЕсли;
557 | КонецЦикла;
558 | Иначе
559 | ЗаписьXML.ЗаписатьБезОбработки(Рез + Символы.ПС);
560 |
561 | Если НемедленнныйВывод Тогда
562 | Сообщить(Рез);
563 | КонецЕсли;
564 | КонецЕсли;
565 |
566 | КонецЕсли;
567 |
568 | Возврат Рез;
569 | КонецФункции
570 |
571 | Процедура ПроверитьКодВозврата(Знач КодВозврата)
572 | Если ПроверяемКодВозврата Тогда
573 | Если КодВозврата < МинимальныйОжидаемыйКодВозврата или КодВозврата > МаксимальныйОжидаемыйКодВозврата Тогда
574 | Если МинимальныйОжидаемыйКодВозврата <> МаксимальныйОжидаемыйКодВозврата Тогда
575 | ТекстОшибки = СтрШаблон("Ожидали, что код возврата <%1> команды <%2> совпадет с ожидаемым диапазоном <%3>-<%4>, а это не так!
576 | |Лог команды:
577 | |%5",
578 | КодВозврата, Приложение, МинимальныйОжидаемыйКодВозврата, МаксимальныйОжидаемыйКодВозврата,
579 | ПолучитьВывод());
580 | Иначе
581 | ТекстОшибки = СтрШаблон("Ожидали, что код возврата <%1> команды <%2> совпадет с ожидаемым <%3>, а это не так!
582 | |Лог команды:
583 | |%4",
584 | КодВозврата, Приложение, МинимальныйОжидаемыйКодВозврата, ПолучитьВывод());
585 | КонецЕсли;
586 | Ожидаем.Что(КодВозврата, СтрШаблон("%1, вывод %2", ТекстОшибки, ВыводКоманды)).
587 | БольшеИлиРавно(МинимальныйОжидаемыйКодВозврата).
588 | МеньшеИлиРавно(МаксимальныйОжидаемыйКодВозврата);
589 | КонецЕсли;
590 | КонецЕсли;
591 | КонецПроцедуры
592 |
593 | // Инициализация работы библиотеки.
594 | // Задает минимальные настройки.
595 | //
596 | Процедура Инициализация()
597 |
598 | Лог = Логирование.ПолучитьЛог(ИмяЛога());
599 |
600 | СистемнаяИнформация = Новый СистемнаяИнформация;
601 | ЭтоWindows = Найти(НРег(СистемнаяИнформация.ВерсияОС), "windows") > 0;
602 |
603 | РабочийКаталог = ".";
604 | ВыводКоманды = "";
605 | КодировкаВывода = Неопределено;//КодировкаТекста.UTF8;
606 | Параметры = Новый Массив;
607 |
608 | ИспользуетсяЕдинаяСтрокаЗапуска = Ложь;
609 | ИспользуемКомандныйПроцессор = Истина;
610 |
611 | ПроверяемКодВозврата = Ложь;
612 | ОжидаемыйКодВозврата = 0;
613 | ПерехватыватьПотоки = Истина;
614 |
615 | ПериодОпросаВМиллисекундах = 100;
616 | НемедленнныйВывод = Ложь;
617 |
618 | ПеременныеСредыПроцесса = ПеременныеСреды();
619 |
620 | ПодключенныеЛоги = Новый Массив;
621 | ОбработчикОжиданияПроцесса = Неопределено;
622 |
623 | КонецПроцедуры
624 |
625 | Инициализация();
626 |
627 | // Лог.УстановитьУровень(УровниЛога.Отладка);
628 |
--------------------------------------------------------------------------------