├── .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 | Обсудить [![Join the chat at https://gitter.im/EvilBeaver/oscript-library](https://badges.gitter.im/EvilBeaver/oscript-library.svg)](https://gitter.im/EvilBeaver/oscript-library?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![GitHub release](https://img.shields.io/github/release/artbear/1commands.svg)](https://github.com/artbear/1commands/releases) [![Build Status](http://build.oscript.io/buildStatus/icon?job=oscript-library/1commands/develop)](http://build.oscript.io/job/oscript-library/job/1commands/job/develop/) 4 | [![Build status](https://ci.appveyor.com/api/projects/status/ervidk37h9m0tgs5?svg=true)](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 | --------------------------------------------------------------------------------