![]() |
![]() |
![]() |
|
Циклится запуск bat при запуске из 1С | ☑ | ||
---|---|---|---|---|
0
int88
22.08.16
✎
11:14
|
Из 1С запускается батник методом ЗапуститьПриложение() или КомандаСистемы() и начинается бесконечное открытие окон CMD. При запуске вручную все нормально. Смысл - программно зарегистрировать библиотеку ROM.dll в ОС под правами администратора.
Сам батник содержит следующий код: echo off :: BatchGotAdmin :------------------------------------- REM --> Check for permissions >nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system" REM --> If error flag set, we do not have admin. if '%errorlevel%' NEQ '0' ( echo Requesting administrative privileges... goto UACPrompt ) else ( goto gotAdmin ) :UACPrompt echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs" echo UAC.ShellExecute "%~s0", "", "", "runas", 1 >> "%temp%\getadmin.vbs" "%temp%\getadmin.vbs" exit /B :gotAdmin if exist "%temp%\getadmin.vbs" ( del "%temp%\getadmin.vbs" ) pushd "%CD%" CD /D "%~dp0" :-------------------------------------- regsvr32 %TEMP%\ROM.dll |
|||
1
Fish
гуру
22.08.16
✎
11:16
|
(0) А код 1С?
|
|||
2
int88
22.08.16
✎
11:18
|
(1) там все хорошо, правда :)
|
|||
3
kosts
22.08.16
✎
11:24
|
(0) А имя файла батника какое?
|
|||
4
int88
22.08.16
✎
11:24
|
(1) если не трудно, попробуйте воспроизвести.
Зарегистрируйте какую-нибудь dll (например comcntr.dll) из под 1С батником, который я привел выше. |
|||
5
int88
22.08.16
✎
11:26
|
(3) RegROM.bat. Про нюанс с именем знаком.
|
|||
6
Рэйв
22.08.16
✎
11:28
|
все беды всегда от goto
:-) |
|||
7
Fish
гуру
22.08.16
✎
11:29
|
(5) Если при запуске вручную всё нормально, то косяк не в батнике, а в коде 1С.
|
|||
8
kosts
22.08.16
✎
11:32
|
Попробуй глянь, что в файл getadmin.vbs выводится
|
|||
9
int88
22.08.16
✎
11:45
|
(7) Функция запуска батника вызывается не в цикле. Текст батника хранится в общем макете.
&НаКлиенте Процедура ЗаписатьФайл() Экспорт Каталог = КаталогВременныхФайлов(); ПолноеИмяФайлаКомпоненты = Каталог + "ROM.dll"; ПолноеИмяМодуляРегистрацииКомпоненты = Каталог + "RegROM.bat"; ДвоичныеДанныеКомпоненты = ТелефонияСервер.ПолучитьДДКомпоненты(); ТекстМодуляРегистрацииКомпоненты = ТелефонияСервер.ПолучитьТекстМодуляРегистрации().ПолучитьТекст(); Попытка ДвоичныеДанныеКомпоненты.Записать(ПолноеИмяФайлаКомпоненты); ТекстДок = Новый ТекстовыйДокумент(); ТекстДок.УстановитьТекст(ТекстМодуляРегистрацииКомпоненты); ТекстДок.Записать(ПолноеИмяМодуляРегистрацииКомпоненты, КодировкаТекста.OEM); ЗапуститьПриложение(ПолноеИмяМодуляРегистрацииКомпоненты); Исключение КонецПопытки; КонецПроцедуры (8) Set UAC = CreateObject("Shell.Application") UAC.ShellExecute "C:\Users\B756~1\AppData\Local\Temp\REGROM.BAT", "", "", "runas", 1 |
|||
10
int88
22.08.16
✎
11:45
|
(8) Set UAC = CreateObject("Shell.Application")
UAC.ShellExecute "C:\Users\B756~1\AppData\Local\Temp\REGROM.BAT", "", "", "runas", 1 |
|||
11
kosts
22.08.16
✎
11:48
|
(10) Ну вот и цикл бесконечный REGROM.BAT вызывает REGROM.BAT.
Условие выхода из зацикленности не срабатывает |
|||
12
int88
22.08.16
✎
11:59
|
(11) Мне кажется что после выполнения getadmin.vbs должно меняться значение errorlevel чтобы сработало условие и выполнение перешло на метку gotAdmin. В ручном режиме оно меняется (сначала =5, потом =0), а при запуске из 1С оно сначала =5, а потом бесконечно =2.
|
|||
13
kosts
22.08.16
✎
12:04
|
(12) Это 2 не спроста.
|
|||
14
kosts
22.08.16
✎
12:10
|
(0) А ты вручную батник запускаешь каким образом? В какой папке находишься?
Как способ попробовать, может поможет, а может и нет: Разыщи синтаксис что бы запустить команду в батнике таким образом, что бы выполнение батника ждало окончания выполнения команды и подставь в >nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system" |
|||
15
int88
22.08.16
✎
15:45
|
(14) батник запускаю руками, на раб.столе лежит, и из временной папки %TEMP% запускал, все отрабатывает.
errorlevel = 2 означает что система не может найти указанный батник для запуска от имени пользователя, но он там есть (http://www.febooti.com/products/automation-workshop/online-help/events/run-dos-cmd-command/exit-codes/). Не понял, сделать ожидание окончания выполнения команды? start /wait "%temp%\getadmin.vbs"? |
|||
16
int88
02.09.16
✎
09:37
|
С этим батником отработало.
@Echo Off Setlocal :: First check if we are running As Admin/Elevated FSUTIL dirty query %SystemDrive% >nul if %errorlevel% EQU 0 goto START ::Create and run a temporary VBScript to elevate this batch file Set _batchFile=%~s0 :: double up any quotes Set _batchFile=""%_batchFile:"=%"" Echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\~ElevateMe.vbs" Echo UAC.ShellExecute "cmd", "/c ""%_batchFile%"" /s", "", "runas", 2 >> "%temp%\~ElevateMe.vbs" cscript "%temp%\~ElevateMe.vbs" Exit /B :START :: set the current directory to the batch file location if exist "%temp%\~ElevateMe.vbs" (del "%temp%\~ElevateMe.vbs") cd /d %~dp0 :: Place the code which requires Admin/elevation below start /wait regsvr32 /s %TEMP%\ROM.dll |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |