Войти

Показать полную графическую версию : [решено] Скрипт для продолжения установки после отработки процесса


Pozia
14-05-2009, 23:32
Делаю установку 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
На 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
Yashied, AutoIt не срабатывает, ну и да ладно. Второй вариант мне более понравился. Вопросик Маленький только:
Wscript.Sleep 5000 - это сколько секунд задержка и зачем в начале эта задержка? Для подстраховки чтобы успеть так сказать словить процесс нужный?

SyDr
15-05-2009, 18:26
Так не пиши в батнике 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
Yashied, AutoIt не срабатывает, ну и да ладно. Второй вариант мне более понравился. Вопросик Маленький только:
Wscript.Sleep 5000 - это сколько секунд задержка и зачем в начале эта задержка? Для подстраховки чтобы успеть так сказать словить процесс нужный? »
Wscript.Sleep 5000 - задержка 5 сек (как ты сказал на всякий случай). Wscript.Sleep 1000 - задержка в цикле (1 сек). Нет смысла проверять слишком часто наличие процесса и загружать этим процессор. Одной секунды вполне достаточно.

Так не пиши в батнике 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
start именно для того и предназначен, чтобы батник сразу продолжил работу »
вы ничего не путаете случайно? как я знаю start для запуска программы а /wait для ожидания завершения установки. Мне кажется без start все будет также




© OSzone.net 2001-2012