Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] Скрипт для продолжения установки после отработки процесса (http://forum.oszone.net/showthread.php?t=140165)

Pozia 14-05-2009 23:32 1118768

Скрипт для продолжения установки после отработки процесса
 
Делаю установку MathCAD 14. Для чего запускаю скрипт CMD:

Код:

IF  EXIST  "%ProgramFiles%\Mathcad\Mathcad 14\mathcad.exe" exit
IF  EXIST  "%systemroot%\PS.txt" goto XP
exit
:XP
start /wait Setup.exe /s /sms /v" /qn SILENTINSTALL=\"TRUE\" PRODUCTTYPE=\"ENT\" ALLUSERS=1 PRODUCT_CODE=11111111111111-1111-1111 LICENSEPATH=license.dat
xcopy license "%ProgramFiles%\Mathcad\Mathcad 14\" /S /H /Y
start /wait REGEDIT /S license.reg
xcopy Rus "%ProgramFiles%\Mathcad\Mathcad 14\" /S /H /Y
exit

Проблема в том, что данный инсталятор запускает дочерний процесс установки, закрыв при этом Setup.exe (ключ /sms не помогает). Из за этого программа не успевает установится до конца а тут уже копируются файлы русификации и получается не то, что хотелось бы. Вот прошу помочь со скриптом, который бы реализовывал команды из моего CMD, при этом после запука команды:

Код:

start /wait Setup.exe /s /sms /v" /qn SILENTINSTALL=\"TRUE\" PRODUCTTYPE=\"ENT\" ALLUSERS=1 PRODUCT_CODE=11111111111111-1111-1111 LICENSEPATH=license.dat
необходимо чтобы остальные команды начали выполнятся после завершения работы процесса IDriver.exe, который появляется в Диспетчере задач вместо процесса Setup.exe. И еще хотелась бы пауза после завершения процесса IDriver.exe в 5-10 секунд (на всякий случай).
И также нужно в скрипте реализовать мои первых два условия проверки наличия установленной проги (если есть то завершение скрипта) и наличие маркерного файла (если его нет то завершение скрипта). Спасибо.

Yashied 15-05-2009 03:31 1118866

На AutoIt это будет выглядеть примерно так:

Код:

#NoTrayIcon

If (FileExists(@ProgramFilesDir & '\Mathcad\Mathcad 14\mathcad.exe')) Or (Not FileExists(@SystemDir & '\PS.txt')) Then
    Exit
EndIf


RunWait('Setup.exe /s /sms /v /qn SILENTINSTALL=TRUE PRODUCTTYPE=ENT ALLUSERS=1 PRODUCT_CODE=11111111111111-1111-1111 LICENSEPATH=license.dat')
Sleep(1000)
ProcessWaitClose('IDriver.exe')
Sleep(5000); На всякий случай
ShellExecuteWait('xcopy', 'license "' & @ProgramFilesDir & '\Mathcad\Mathcad 14\" /S /H /Y')
RunWait('Regedit.exe /S license.reg')
MsgBox(0, 'MathCAD 14', 'Установка завершена.')

Естественно я это не проверял, к тому же я мог напутать с параметрами при вызове Setup.exe. Надеюсь, если что, то ты сможешь поправить строку сам. Но на мой взгляд тебе проще вставит в свой CMD-файл проверку на существование этого "зловредного" процесса IDriver.exe. Реализовать это можно, например, с помощью VBS-скрипта.

Код:

IF  EXIST  "%ProgramFiles%\Mathcad\Mathcad 14\mathcad.exe" exit
IF  EXIST  "%systemroot%\PS.txt" goto XP
exit
:XP
start /wait Setup.exe /s /sms /v" /qn SILENTINSTALL=\"TRUE\" PRODUCTTYPE=\"ENT\" ALLUSERS=1 PRODUCT_CODE=11111111111111-1111-1111 LICENSEPATH=license.dat
Sleep.vbs
xcopy license "%ProgramFiles%\Mathcad\Mathcad 14\" /S /H /Y
start /wait REGEDIT /S license.reg
xcopy Rus "%ProgramFiles%\Mathcad\Mathcad 14\" /S /H /Y
exit

где Sleep.vbs представляет собой следующие:

Код:

Set objService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\CIMV2")
Set objRefresher = CreateObject("WbemScripting.SWbemRefresher")
Set colItems = objRefresher.AddEnum(objService, "Win32_Process").objectSet

Do Until False
    Wscript.Sleep 1000
    objRefresher.Refresh
    Flag = True
    For Each objItem in colItems
        If InStr(objItem.ExecutablePath, "IDriver.exe") Then
            Flag = False
        End If
    Next
    If Flag = True Then
        Exit Do
    End If
Loop

Wscript.Sleep 5000


Pozia 15-05-2009 18:15 1119416

Yashied, AutoIt не срабатывает, ну и да ладно. Второй вариант мне более понравился. Вопросик Маленький только:
Wscript.Sleep 5000 - это сколько секунд задержка и зачем в начале эта задержка? Для подстраховки чтобы успеть так сказать словить процесс нужный?

SyDr 15-05-2009 18:26 1119426

Так не пиши в батнике start и будет тебе счастье. start именно для того и предназначен, чтобы батник сразу продолжил работу.
Setup.exe /s /sms /v" /qn SILENTINSTALL=\"TRUE\" PRODUCTTYPE=\"ENT\" ALLUSERS=1 PRODUCT_CODE=11111111111111-1111-1111 LICENSEPATH=license.dat

Yashied 15-05-2009 18:29 1119432

Цитата:

Цитата Pozia
Yashied, AutoIt не срабатывает, ну и да ладно. Второй вариант мне более понравился. Вопросик Маленький только:
Wscript.Sleep 5000 - это сколько секунд задержка и зачем в начале эта задержка? Для подстраховки чтобы успеть так сказать словить процесс нужный? »

Wscript.Sleep 5000 - задержка 5 сек (как ты сказал на всякий случай). Wscript.Sleep 1000 - задержка в цикле (1 сек). Нет смысла проверять слишком часто наличие процесса и загружать этим процессор. Одной секунды вполне достаточно.

Цитата:

Цитата Sylver Dragon
Так не пиши в батнике start и будет тебе счастье. start именно для того и предназначен, чтобы батник сразу продолжил работу.
Setup.exe /s /sms /v" /qn SILENTINSTALL=\"TRUE\" PRODUCTTYPE=\"ENT\" ALLUSERS=1 PRODUCT_CODE=11111111111111-1111-1111 LICENSEPATH=license.dat »

У него написано start /wait. Это тоже самое, что и отсутствие этого. Проблема в том, как я понял, Setup.exe запускает другой процесс, а сам заканчивает свою работу не дожидаясь завершения запущенного процесса.

Pozia 15-05-2009 18:39 1119447

Цитата:

Цитата Sylver Dragon
start именно для того и предназначен, чтобы батник сразу продолжил работу »

вы ничего не путаете случайно? как я знаю start для запуска программы а /wait для ожидания завершения установки. Мне кажется без start все будет также


Время: 18:07.

Время: 18:07.
© OSzone.net 2001-