[Архив - Часть 1.1] AutoIt скрипты

Ответить
 • Просмотры: 12
Аватара пользователя
bogomolv

Re: [Архив - Часть 1.1] AutoIt скрипты

Сообщение bogomolv »

Свежий скрипт





Код:

Код: Выделить всё

Opt('ExpandEnvStrings', 1); default = 0
Opt('ExpandVarStrings', 1); default = 0
Opt('RunErrorsFatal', 0); default = 1
Opt('TrayIconDebug', 1); default = 0
$pDir='@ProgramFilesDir@\ABBYY FineReader 8.0 Professional Edition'
DirCopy ('@ScriptDir@\Russian',$pDir,1)
RunWait ('Regedit /S "@ScriptDir@\FineReader8.reg"')
RunWait ('msiexec /i @ScriptDir@\FineReader8.msi /qb')
FileCopy ('@ScriptDir@\Russian\FineReader.exe',$pDir,1)
FileCopy ('@ScriptDir@\Russian\VerData.prt',$pDir,1)
Exit

В папке \Russian лежат разархивированные файлы "русской морды" от FineReader (Russian UI.exe\Data1.cab: Tutorial1.chm, FineReader1.chm, fineui1.dll, screenshotreader1.dll, FRWordZoom1.dll, Shell1.dll, Enginel.dll, Russian.amd, Russian.amm, MorphoRes1.dll, Scan\ScanMan1.dll, Support\Ainfo.dll ) и пара файлов от установленного FineReader.

FineReader8.reg - копия нужных настроек из ветки HKCU\Software\ABBYY.



Проверял на 677 и 706 версиях.
Аватара пользователя
biork

Re: [Архив - Часть 1.1] AutoIt скрипты

Сообщение biork »

У меня такая проблемка: не обрабатывается секция if - в любом случае (есть первое окно или нет) -

скрипт продолжает работу (или останавливается при наличии первого окна) со строчек после "Else"

В каком месте кривые руки? Где ошибка?





Код:

Код: Выделить всё

if WinExists ("Заголовок окна", "текст1") then
WinWaitActive("Заголовок окна", "текст1")
ControlClick ("Заголовок окна", "текст1", "button1")
...
...
Else
WinWaitActive("Заголовок окна", "текст2")
ControlClick ("Заголовок окна", "текст2", "button1")
...
...
endif
Аватара пользователя
EgOrus

Re: [Архив - Часть 1.1] AutoIt скрипты

Сообщение EgOrus »

biork

У тебя скрипт ждет пока окно не станет активным WinWaitActive("Заголовок окна", "текст2").

Может лучше использовать конструкции типа:

Код:

Код: Выделить всё

IF WinExists ("Заголовок окна", "текст1") then
    WinActivate("Заголовок окна", "текст1")
    ControlClick ("Заголовок окна", "текст1", "button1")
    ...
    ...
ElseIf WinExists ("Заголовок окна", "текст2") then
   WinActivate("Заголовок окна", "текст2")
   ControlClick ("Заголовок окна", "текст2", "button1")
    ...
    ...
EndIf
Аватара пользователя
biork

Re: [Архив - Часть 1.1] AutoIt скрипты

Сообщение biork »

А зачем он ждёт активности второго окна, если появилось и активно первое?

Может я не прав, но по-моему логика скрипта такова, что при наличии первого окна ("Заголовок окна", "текст1")

должны выполняться строки после "then", при отсутствии оного или при появлении другого ("Заголовок окна", "текст2")

должны выполняться строки после "Else".

Если убрать условное выполнение, то каждая ветка скрипта выполняется нормально в своих условиях.



Твой вариант с WinActivate попробовал - не помогает. Причём, в моём варианте при наличии первого окна скрипт

ждёт на строке ожидания второго окошка, а в твоём - заканчивает работу
Аватара пользователя
biork

Re: [Архив - Часть 1.1] AutoIt скрипты

Сообщение biork »

Вот весь скрипт с изменениями, как ты и рекомендовал в своём примере.

Часть, которая не хочет работать выделена курсивом





Код:

Код: Выделить всё

Opt("TrayIconDebug",1)
Run("3dmark03_v360_setup.exe")
WinWaitActive("3DMark03 - InstallShield Wizard", "Welcome to the InstallShield Wizard")
ControlClick("3DMark03 - InstallShield Wizard", "Welcome to the InstallShield Wizard", "Button1")
WinWaitActive("3DMark03 - InstallShield Wizard", "License Agreement")
ControlClick("3DMark03 - InstallShield Wizard", "License Agreement", "Button5")
ControlClick("3DMark03 - InstallShield Wizard", "License Agreement", "Button2")
WinWaitActive("3DMark03 - InstallShield Wizard", "Destination Folder")
ControlClick("3DMark03 - InstallShield Wizard", "Destination Folder", "Button1")
WinWaitActive("3DMark03 - InstallShield Wizard", "Click Install to begin")
ControlClick("3DMark03 - InstallShield Wizard", "Click Install to begin", "Button1")
;здесь может появиться окно ввода серийного номера, если программа ставится впервые
IF WinExists ("3DMark03 - InstallShield Wizard", "Futuremark Registration") then
WinActivate("3DMark03 - InstallShield Wizard", "Futuremark Registration")
ControlSetText("3DMark03 - InstallShield Wizard", "Futuremark Registration", "Edit1", "18P2M-MY24M-39UK6-QAX2N")
Sleep (1000)
ControlClick("3DMark03 - InstallShield Wizard", "Futuremark Registration", "Button2")
WinWaitActive("Congratulations!", "")
ControlClick("Congratulations!", "", "Button1")
WinWaitActive("3DMark03 - InstallShield Wizard", "InstallShield Wizard Complete")
ControlCommand("3DMark03 - InstallShield Wizard", "InstallShield Wizard Complete", "Button1", "UnCheck", "")
ControlCommand("3DMark03 - InstallShield Wizard", "InstallShield Wizard Complete", "Button2", "UnCheck", "")
ControlClick("3DMark03 - InstallShield Wizard", "InstallShield Wizard Complete", "Button4")
ElseIf WinExists ("3DMark03 - InstallShield Wizard", "InstallShield Wizard Complete") then
WinActivate("3DMark03 - InstallShield Wizard", "InstallShield Wizard Complete")
ControlCommand("3DMark03 - InstallShield Wizard", "InstallShield Wizard Complete", "Button1", "UnCheck", "")
ControlCommand("3DMark03 - InstallShield Wizard", "InstallShield Wizard Complete", "Button2", "UnCheck", "")
ControlClick("3DMark03 - InstallShield Wizard", "InstallShield Wizard Complete", "Button4")
EndIf
Exit

Насчёт логики. Дело то в том, что он почему то это первое окно не видит, хотя оно есть, ждёт и свиду вполне активно Изображение. По мне, так условие выполнено, а вот с точки зрения AutoIt - почему то - нет Изображение

И что толку от продолжения работы скрипта, если дальнейшие действия связаны с кликаньями по окнам которые не появятся, пока не уйдёт текущее?



Я понимаю, что проблема выеденного яйца не стоит - можно сделать тихую инсталяшку или ввести серийный номер перед запуском установки с помощью рег-файла и исключить появление этого окна - дело в другом - хочу выяснить можно ли вообще бороться таким образом с "иногда появляющимися" окнами. У меня уже не первый случай когда нужно использовать функцию условного выполнения и всегда с этим проблемы. Что-то я тут не вкуриваю...
Аватара пользователя
EgOrus

Re: [Архив - Часть 1.1] AutoIt скрипты

Сообщение EgOrus »

biork

Чтобы понять почему не работает пришлось поставить 3DMark2001, ставится он почти также как 2003, так вот дело в том что, твое условие If WinExists проверяется на стадии копирования файлов и декомпрессии текстур, естественно такого окна нет, и переходим к следующему условию ElseIf WinExists такого окна тоже нет и завершаем скрипт.

Нужно добавить перед проверкой условий, ожидание завершения процесса копирования, чтобы в момент проверки условий либо то либо то окно успело появиться, сделать можно по разному например вот так:

Код:

Код: Выделить всё

ControlClick("InstallShield Wizard", "Start Copying Files", "Button1")
;здесь может появиться окно ввода серийного номера, если программа ставится впервые
WinWait("Texture Conversion", "Setup Status")
WinWaitClose("Texture Conversion", "Setup Status" , 180)
sleep (1000)
IF WinExists ("InstallShield Wizard", "MadOnion.com Registration") then
WinActivate("InstallShield Wizard", "MadOnion.com Registration")
Аватара пользователя
skylego

Re: [Архив - Часть 1.1] AutoIt скрипты

Сообщение skylego »

Вот скрипт для Windows XP Manader



;Видим скрытый текст

Opt("WinTitleMatchMode",2)

Opt("WinDetectHiddenText",1)

;Уберем все с окна

WinMinimizeAll()

Sleep(1000)



$SF_1 = @ScriptDir & "\xpmanager.exe"



$SF_2 = StringLeft(@ProgramFilesDir,2) & '\PROGRA~1\YANICS~1\WinXPM~1\WinXPM~1.exe'



Run(@ComSpec & " /c " & "start " & $SF_1 , "", @SW_HIDE)



$Title_1 = "WinXP Manager Setup"

$Title_2 = "WinXP Manager"



WinWaitActive($Title_1)

sleep(1000)

SEND("{ENTER}")



WinWaitActive($Title_2,'The installer will guide you through the steps required to install WinXP Manager on your computer.')

sleep(1000)

SEND("{ENTER}")



WinWaitActive($Title_2,'Select Installation Folder')

sleep(1000)

controlclick('','','Button5')

SEND("{ENTER}")



WinWaitActive($Title_2,'Confirm Installation')

sleep(1000)

SEND("{ENTER}")



WinWaitActive($Title_2,'Installation Complete')

sleep(1000)

SEND("{ENTER}")





Run( @ComSpec & " /c " & "start " & $SF_2 , "", @SW_HIDE)

sleep(1000)



WinActivate("WinXP Manager V4.92.3")



;WinWaitActive('WinXP Manager V4.92.3','UnRegistered...')

WinWaitActive('WinXP Manager V4.92.3','Try It')

sleep(1000)

controlclick('WinXP Manager V4.92.3','','WindowsForms10.BUTTON.app31')



WinWaitActive('Purchase and Register WinXP Manager V4.92.3')

sleep(1000)

ControlSetText( "" , "", 'WindowsForms10.EDIT.app35','XXXX')

ControlSetText( "" , "", 'WindowsForms10.EDIT.app34','XXXX')

ControlSetText( "" , "", 'WindowsForms10.EDIT.app33','XXXX')

ControlSetText( "" , "", 'WindowsForms10.EDIT.app32','XXXX')

ControlSetText( "" , "", 'WindowsForms10.EDIT.app31','XXXX')

controlclick('','','WindowsForms10.BUTTON.app32')



WinWaitActive('Finis','Please restart this software')

sleep(1000)

SEND("{ENTER}")



EXIT
Аватара пользователя
biork

Re: [Архив - Часть 1.1] AutoIt скрипты

Сообщение biork »

EgOrus

Ну ты монстр! Изображение

Всё заработало как часики. Оживил несколько заброшенных по подобной причине скриптов. Большущее тебе спасибо!

Вопрос на засыпку: зачем таймаут 3 минуты? А вдруг, диск плохо читается или комп 386-ой... я бы убрал этот параметр - пусть ждёт сколько ему надо.
Аватара пользователя
EgOrus

Re: [Архив - Часть 1.1] AutoIt скрипты

Сообщение EgOrus »

biork

по поводу 3х минут, вопрос спорный, теоретически это на тот как раз случай если диск нечитается вообще, на разных приводах может быть по разному, где-то начинает читать до посинения бывает и по 10-20 минут и все равно потом сбоит, бывает ошибку выдает, в любом случае скрипт встанет (скорей всего появится окно инстоляра об ошибке установки) и нужно будет вмешиваться. А так он на автомате через 3 минуты пойдет дальше. Вместо 3х можно побольше конечно поставить.
Ответить

Вернуться в «AutoIt»