Имя: Пароль:
1C
1С v8
Циклится запуск 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
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой