PDA

Показать полную графическую версию : [Архив - Часть 1.1] AutoIt скрипты


Страниц : 1 2 3 [4] 5 6 7 8 9 10 11 12 13 14 15 16 17

ched3n
15-07-2005, 11:55
могет совместно над чем нить поработаем
хотя .... о чем это я

Madcap
15-07-2005, 14:25
to all

Такая командочка:
if WinWaitActive ( "Окно1", "") or ( "Окно2", "") then
...
Неработает оператор or. Если появляется "Окно1" - все ОК скрипт продолжает выполняться.
Если появляется "Окно2" - то скрипт висит.
Что я делаю неправильно?

Sanja Alone
16-07-2005, 04:03
Madcap
Что я делаю неправильно?
Почти все :) Ты пытаешься связать логическим условием функцию и текст в скобках. А нужно делать так:
if WinWaitActive ( "Окно1", "") or WinWaitActive ( "Окно2", "") thenP.S. Все директивы AutoIt - это функции, а в скобки заключаются передаваемые им параметры.

Madcap
18-07-2005, 10:47
Sanja Alone
Все равно не работает :( тоже самое что и раньше - второе окно не хочет искать.
Вот у меня маленький скриптик который, по идее, должен определить какое из двух видов окошек открылось

if WinWaitActive ( "Калькулятор", "") or WinWaitActive ( "Безымянный - Блокнот", "") then
if WinExists ( "Калькулятор", "") then
MsgBox ( 0, "1", "Калькулятор")
else
MsgBox ( 0, "1", "блокнот")
endif
endif
но он не хочет работать. Может у меня руки кривые? Ткни пжлста пальцем где я еще обшибся.

Sanja Alone
19-07-2005, 03:56
Madcap
Гм, а тут ничего и не может работать - у функций ожидания окон таймауты равны бесконечности :)
Рабочий вариант должен использовать другие функции (мгновенной проверки):
While 1=1
if WinExists ( "Калькулятор" ) and WinExists ( "Безымянный - Блокнот" ) then
MsgBox ( 0, "1", "Оба окна существуют" )
ElseIf WinExists ( "Калькулятор" ) and Not WinExists ( "Безымянный - Блокнот" ) then
MsgBox ( 0, "1", "Калькулятор" )
ElseIf Not WinExists ( "Калькулятор" ) and WinExists ( "Безымянный - Блокнот" ) then
MsgBox ( 0, "1", "Блокнот" )
Else
;если убрать это сообщение, то скрипт будет вести себя тихо при отсутствии окон
MsgBox ( 0, "1", "Нет ни одного окна" )
endif
WEndИли тоже самое, но другим способом:
While 1=1
Select
Case WinExists ( "Калькулятор" ) and WinExists ( "Безымянный - Блокнот" )
MsgBox ( 0, "1", "Оба окна существуют")
Case WinExists ( "Калькулятор" ) and Not WinExists ( "Безымянный - Блокнот" )
MsgBox ( 0, "1", "Калькулятор")
Case WinExists ( "Безымянный - Блокнот" ) and Not WinExists ( "Калькулятор" )
MsgBox ( 0, "1", "Блокнот")
Case Else
;если убрать это сообщение, то скрипт будет вести себя тихо при отсутствии окон
MsgBox ( 0, "1", "Нет ни одного окна")
EndSelect
WEndВ обоих примерах важен порядок условий, т.к. каждый последующий ElseIf или Case выполняется только когда все предыдущие ложные.

Madcap
19-07-2005, 08:47
Sanja Alone
Честно говоря я думал что оператор or позволяет сделать проверку и с бесконечными таймаутами.
Огромное спасибо.

ЗЫ: Все таки это были кривые руки :)

bogomolv
19-07-2005, 12:10
Рад приветствовать единомышленников!

Уже более двух лет автоматизирую AutoIt'ом все, что можно и не можно.
Начинал, естественно, с "автокликанья" по окошкам программ-установщиков. Но сейчас мне обидно за любимый AutoIt, когда его используют исключительно в этих целях.
Мои скрипты отвечают за весь процесс установки системы, а также выполняют ряд полезных функций в текущей работе. Главное, что дал AutoIt, это более мощные и разнообразные инструменты, по сравнению с обычными батниками, и логику, по сравнению с обычными inf- и reg-файлами.

Поделюсь несколькими фирменными приемчиками.

Проверка на стадии cmdlines наличия железки и установка дров для нее:
Opt('ExpandVarStrings', 1); default = 0
.....
$iDir= '@ScriptDir@\Up\'
$iDirDr= '@ScriptDir@\I386\$$oem$$\$$1\drivers\'
If DriveGetFileSystem(StringLeft(@ScriptDir,3))='CDFS' Then $iDirDr='@ScriptDir@\$$1\drivers\'
.....
$hwid='PCI\VEN_1002' ;ati
If hwidtest($hwid) Then
$Dr='$iDirDr$1_ati\'
RunWait('$Dr$driver\Setup.exe -s -f1"$Dr$driver\setup.iss"')
RunWait('$Dr$cpanel\Setup.exe -s -f1"$Dr$cpanel\setup.iss"')
RegDelete('HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run','ATIPTA')
RegWrite('HKLM\SOFTWARE\ATI Technologies\Desktop','EnableIcon','REG_SZ','0')
$f='$iDirDr$4_s910t\nast_color.au3'
If FileExists($f) Then StartupDrivers("RunWait('AutoIt3.exe $f$')")
EndIf
.....
Exit
.....
Func hwidtest($hwid) ;проверка наличия железки по ID
return NOT RunWait('@ComSpec@ /C devcon.exe hwids "$hwid$" | find "$hwid$"','',0)
EndFunc

Доустановка после первой загрузки Windows дров, которые "не любят" стадию cmdlines:
.....
$hwid='PCI\VEN_8086' ;INTEL
If hwidtest($hwid) Then
$hwid='PCI\VEN_8086&DEV_24DF' ;INTELSATA
If hwidtest($hwid) Then
StartupDrivers("RunWait('$iDirDr$0_intel_sata\iaar47_multi.exe -A -S','',0)")
StartupDrivers("DirRemove('@ProgramsCommonDir@\Intel(R) Application Accelerator',1)")
Manager','$aMenuPSS$',1)")
Else
RunWait('$iDirDr$0_intel\iaa23_enu.exe -A -S','', 0)
DirRemove('@ProgramsCommonDir@\Intel Application Accelerator',1)
EndIf
EndIf
.....
Exit
.....
Func StartupDrivers($l)
$file = FileOpen('C:\startupdrivers.au3', 1)
FileWriteLine($file, $l)
FileClose($file)
EndFunc

Создание Подключений и соответствующих Учетных записи OutLook через IPS-файл на основе данных пользователя (файл internet.ini)
.....
$ini= 'ПУТЬ\internet.ini'
$ins= '%temp%\ispcnfg.ins'
$con= IniReadSectionNames($ini)
For $i=1 to $con[0]
IspCnfg_ins()
Run(@ComSpec&' /C Start %temp%\ispcnfg.ins','',0)
WinWaitActive('Мастер подключения к Интернету')
Send('{ENTER}')
WinWaitActive('Мастер подключения к Интернету','Завершена подготовка')
Send('{ENTER}')
Next
.....
Exit
.....
Func IspCnfg_ins() ;создание ispcnfg.ins, создающего соединение
$f = FileOpen($ins, 2)
FileWriteLine($f, '[Entry]')
FileWriteLine($f, 'Entry_Name='& $con[$i])
FileWriteLine($f, '')
FileWriteLine($f, '[Phone]')
FileWriteLine($f, 'Dial_As_Is=yes')
FileWriteLine($f, 'Phone_Number='& IniRead($ini, $con[$i],'Phone_Number',''))
FileWriteLine($f, 'Area_Code=8452')
FileWriteLine($f, 'Country_Code=7')
FileWriteLine($f, 'Country_ID=7')
FileWriteLine($f, '')
FileWriteLine($f, '[Device]')
FileWriteLine($f, 'Type=modem')
FileWriteLine($f, '')
FileWriteLine($f, '[Server]')
FileWriteLine($f, 'Type=PPP')
FileWriteLine($f, 'SW_Compress=yes')
FileWriteLine($f, 'Network_Logon=no')
FileWriteLine($f, 'Negotiate_TCP/IP=yes')
FileWriteLine($f, 'Negotiate_NetBEUI=No')
FileWriteLine($f, 'Negotiate_IPX/SPX=No')
FileWriteLine($f, '')
FileWriteLine($f, '[TCP/IP]')
FileWriteLine($f, 'Specify_IP_Address=no')
FileWriteLine($f, 'Specify_Server_Address=yes')
FileWriteLine($f, 'IP_Header_Compress=yes')
FileWriteLine($f, 'Gateway_On_Remote=yes')
FileWriteLine($f, 'DNS_Address='& IniRead($ini, $con[$i],'DNS_Address',''))
FileWriteLine($f, 'DNS_Alt_Address='& IniRead($ini, $con[$i],'DNS_Alt_Address',''))
FileWriteLine($f, '')
FileWriteLine($f, '[User]')
FileWriteLine($f, 'Name='& IniRead($ini, $con[$i],'Name',''))
FileWriteLine($f, 'Password='& IniRead($ini, $con[$i],'Password',''))
FileWriteLine($f, 'Display_Password=no')
FileWriteLine($f, '')
FileWriteLine($f, '[ConnectionSettings]')
FileWriteLine($f, 'ApplyInsToConnection='&$con[$i])
FileWriteLine($f, '')
If IniRead($ini, $con[$i],'Email_Name','')<>'' Then
FileWriteLine($f, '[Internet_Mail]')
FileWriteLine($f, 'SMTP_Server='& IniRead($ini, $con[$i],'SMTP_Server',''))
FileWriteLine($f, 'POP_Server='& IniRead($ini, $con[$i],'POP_Server',''))
FileWriteLine($f, 'Domain=') ;sample.net
FileWriteLine($f, 'Install_Mail_16=0')
FileWriteLine($f, 'Email_Name='& IniRead($ini, $con[$i],'Email_Name',''))
FileWriteLine($f, 'Email_Address='& IniRead($ini, $con[$i],'Email_Address',''))
FileWriteLine($f, 'POP_Logon_Name='& IniRead($ini, $con[$i],'POP_Logon_Name',''))
FileWriteLine($f, 'POP_Logon_Password='&IniRead($ini, $con[$i],'POP_Logon_Password',''))
FileWriteLine($f, '')
EndIF
FileClose($f)
EndFunc
Где файл internet.ini имеет следующий вид
[ИМЯ_СОЕДИНЕНИЯ1]
Phone_Number=
Phone_Number2=
Name=
Password=
DNS_Address=
DNS_Alt_Address=
SMTP_Server=
POP_Server=
Email_Name=
Email_Address=
POP_Logon_Name=
POP_Logon_Password=
[ИМЯ_СОЕДИНЕНИЯ2]
.....


Для перевода reg-файлов в коды AutoIt написал простенький макрос для Word:
Sub ОбработкаREG()

With Selection
If .Start = .End Then ActiveDocument.Select
Set myRange = .Range

'удаление лишнего
Замена "( ){1;}", "\1", True
Замена "^p ", "^p", False
Замена "\^p", "", False
Замена "\\", "\", False
Замена "HKEY_CURRENT_USER", "HKCU", False
Замена "HKEY_LOCAL_MACHINE", "HKLM", False

'обработка строк
For Each aPara In myRange.Paragraphs
aPara.Range.Select: .End = .End - 1
If Left(.Text, 1) = ";" Then
ElseIf Left(.Text, 1) = "[" Then
hkey = Mid(.Text, 2, InStr(.Text, "]") - 2)
.End = .End + 1
.Text = ""
ElseIf InStr(.Text, "=") Then
kkey = Mid(.Text, 2, InStr(2, .Text, Chr(34)) - 2)
If InStr(.Text, "dword") Then
tkey = "REG_DWORD"
zkey = Mid(.Text, InStr(.Text, "=") + 7)
zkey = Trim(Str(Val("&h" + zkey)))
ElseIf InStr(.Text, "hex") Then
tkey = "REG_BINARY"
zkey = Mid(.Text, InStr(.Text, "=") + 5)
zkey = Replace(zkey, ",", "")
zkey = UCase(zkey)
Else
tkey = "REG_SZ"
zkey = Mid(.Text, InStr(.Text, "=") + 2)
zkey = Replace(zkey, Chr(34), "")
End If
.Text = "RegWrite('" + hkey + "','" + kkey + "','" + tkey + "','" + zkey + "')"
End If
Next

myRange.Select
End With
End Sub

Sub Замена(a, b, s)
Set SRange = Selection.Range
With Selection.Find
.ClearFormatting
.Replacement.ClearFormatting
.Execute FindText:=a, ReplaceWith:=b, Replace:=wdReplaceAll, Wrap:=wdFindStop, MatchWildcards:=s
End With
SRange.Select
End Sub

Буду рад, если что-нибудь кому-нибудь пригодится...

boss911
19-07-2005, 19:57
Всем привет! У меня вопрос, так как нехотел создавать еще одну тему! У меня есть скрипт "Lan XP SP2.vbs". Что он делает: запускает "Мастер настройки сети" и настраивает локальную сеть, но после настройки лок. сети открывает автоматом общий доступ к папке "Общие документы" (SharedDocs)
Set WshShell = WScript.CreateObject("WScript.Shell")
On Error Resume Next
WshShell.Run ("%SystemRoot%\system32\rundll32.exe hnetwiz.dll,HomeNetWizardRunDll")
WScript.Sleep 1000
WshShell.SendKeys "{ENTER 2}"
WScript.Sleep 100
WshShell.SendKeys "{DOWN}"
WScript.Sleep 100
WshShell.SendKeys "{ENTER}"
WScript.Sleep 100
WshShell.SendKeys "{DOWN 2}"
WScript.Sleep 100
WshShell.SendKeys "{ENTER}"
WScript.Sleep 100
WshShell.SendKeys "Sergey"
WScript.Sleep 20
WshShell.SendKeys "{ENTER}"
WScript.Sleep 100
WshShell.SendKeys "MSHOME"
WScript.Sleep 20
WshShell.SendKeys "{ENTER}"
WScript.Sleep 100
WshShell.SendKeys "{UP}"
WScript.Sleep 100
WshShell.SendKeys "{ENTER 2}"
WScript.Sleep 12000
WshShell.SendKeys "{DOWN 3}"
WScript.Sleep 100
WshShell.SendKeys "{ENTER 2}"
WScript.Sleep 100
Так вот можно ли в этот скрипт прописать такую вещь с командной строки, котороя закрывает общий доступ к ней - "net share SharedDocs %userprofile%\Документы /delete". Как должна эта команда выглядеть в моем скрипте? И можно ли этот скрипт выполнить с cmdlines.txt, сработает ли он на 13-12 минуте до окончания установки Windows XP SP2? Спасибо!!!
[COMMANDS]
useraccounts.cmd
"Lan XP SP2.vbs"

DenchikK
21-07-2005, 12:42
Не выходит установить Agnitum Outpost 2.7 через AutoIt: не закрывается последнее окно, где спрашивается
про перезагрузку компа. На это окно вообще ничего не действует. Подскажите пожалуйста, как же с этим можно справиться.
Вот мой скрипт:



Run('setup.exe')

WinWaitActive ('Select Language')
Send('{TAB 3}{DOWN 5}')
ControlClick ('Select Language','','Button2')

WinWaitActive ('Приветствуем')
ControlClick ('Приветствуем','','Button1')

WinWaitActive ('Лицензионное соглашение')
ControlClick ('Лицензионное соглашение','','Button3')
ControlClick ('Лицензионное соглашение','','Button1')

WinWaitActive ('Read Me файл')
ControlClick ('Read Me файл','','Button1')

WinWaitActive ('Выберите папку для установки')
ControlClick ('Выберите папку для установки','','Button1')

WinWaitActive ('Начало копирования файлов')
ControlClick ('Начало копирования файлов','','Button1')

WinWaitActive ('Создать новую конфигурацию')
ControlClick ('Создать новую конфигурацию','','Button6')

WinWaitActive ('Мастер конфигурации')
ControlClick ('Мастер конфигурации','','Button6')

WinWaitActive ('Ручная настройка')
ControlClick ('Ручная настройка','','Button8')

WinWaitActive ('Установка','Необходимо перезагрузить компьютер для завершения установки.')
ControlClick ('Установка','Необходимо перезагрузить компьютер для завершения установки.','Button3')

Exit

bogomolv
21-07-2005, 18:54
DenchikK

Попробуй "WinKill" или "ProcessClose".

Sanja Alone
22-07-2005, 02:24
DenchikK
Рабочий скрипт для установки Agnitum Outpost 2.7
AutoItSetOption("TrayIconHide", 1)
BlockInput ( 1 )
AutoItSetOption ( "SendKeyDelay", 15 )
Run ( 'OutpostProInstall.exe' )
WinWaitActive ( 'Select Language' )
ControlCommand ( 'Select Language', '', 'ListBox2', 'SelectString', 'Russian' )
If @error=1 Then
ControlCommand ( 'Select Language', '', 'ListBox1', 'SelectString', 'Russian' )
EndIf
Send ( '{ENTER}' )
WinWaitActive ( 'Приветствуем' )
Send ( '{ENTER}' )
WinWaitActive ( 'Лицензионное соглашение' )
ControlClick ( 'Лицензионное соглашение', '', 'Button3' )
Send ( '{ENTER}' )
WinWaitActive ( 'Read Me файл' )
Send ( '{ENTER}' )
WinWaitActive ( 'Выберите папку для установки' )
Send ( '{ENTER}' )
WinWaitActive ( 'Начало копирования файлов' )
;Создать программную группу для текущего пользователя
Send ( '{ENTER}' )
;выбрать вариант "Создать программную группу для всех пользователей"
;ControlClick ( 'Начало копирования файлов', '', 'Button5' )
WinWaitActive ( 'Создать новую конфигурацию' )
;Автоматическая настройка
Send ( '{ENTER}' )
;или Ручная настройка
;ControlClick ( 'Создать новую конфигурацию', '', 'Button2' )
WinWait ( 'Мастер конфигурации' )
AutoItSetOption("MouseCoordMode", 2)
;без этой паузы не хочет работать дальше (реально нужно 20-30 сек., но для тестов на VMWare пришлось поставить больше)
Sleep ( 60000 )
WinActivate ( 'Мастер конфигурации' )
;Далее
MouseClick( "left", 400, 330, 1, 0 )
WinWaitActive ( 'Ручная настройка' )
Send ( '{ENTER}' )
WinWaitActive ( 'Установка' )
Send ( '{ESC}' )
Sleep ( 50 )
;лекарство и настройки
RunWait ( 'opst_ui.exe' )
RunWait ( 'settings.exe' )
Sleep ( 50 )
;перенос ярлыков
DirCopy ( @ProgramsDir & '\Agnitum\Outpost Firewall', @ProgramsCommonDir & '\Сеть\Agnitum Outpost Firewall', 1 )
DirRemove ( @ProgramsDir & '\Agnitum', 1 )
;если имеете рабочий ключ, то введите его сюда
;RegWrite("HKEY_LOCAL_MACHINE\SOFTWARE\Agnitum\Outpost Firewall","Key","REG_SZ","XXX...XX")
;отключить Автообновление
RegWrite("HKEY_LOCAL_MACHINE\SOFTWARE\Agnitum\Outpost Firewall\General","AutoUpdate","REG_DWORD","00000000")
;убрать Аутпост из автозапуска (кому нужно)
;RegDelete("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run", "Outpost Firewall")
BlockInput ( 0 )

DenchikK
27-07-2005, 20:49
bogomolv
Sanja Alone
Спасибо огромное! Я, кстати, разобрался, отчего у меня не работал скрипт - в окне Создать Конфигурацию я нажимал - автоматическая, и при установке AutoIT'ом почему-то сразу пропускался мастер и сразу выдавалось последнее окно. С этим то я разобрался.
Родился новый вопрос, может быть подскажете: для автоматизации работы нужно запустить несколько приложений и брать оттуда некоторые данные. добавлять в другие и.т.д. Проблема в том, что прочитав справку и форум по AI, я так и не нашёл, возможно ли точно переходить в конкретнозаданное запущенное окно. А то метод Alt+Tab не всегда срабатывает.
Заранее спасибо.

Sanja Alone
28-07-2005, 01:12
DenchikK
я так и не нашёл, возможно ли точно переходить в конкретнозаданное запущенное окно
Activates (gives focus to) a window - WinActivate ( "title" [, "text"] )

bogomolv
28-07-2005, 08:08
DenchikK
Sanja Alone

Без "WinActivate()", конечно, не обойтись.
Но можно оперировать вводом-выводом, и не активируя соответствующие окна:
$GetSN=ControlGetText('keygen', 'RU', 'Edit1')
ControlSetText('ABBYY', 'Введите серийный номер', 'Edit1', $GetSN)

vserd
28-07-2005, 15:40
bogomolv
ABBYY
Ну ты и монстр!!!! :)))) Давно думал как можно автоматизировать это безобразие, а ты как фокусник слона из кармана вытянул.
СПАСИБО!!!

UncleGluk
28-07-2005, 18:00
Все супер! И AutoIt просто не заменимая вещь! Как я до него жил - ума не приложу.. :) Так же не могу понять как собственно мне получить код возврата кнопки "ОК" или "Cancel" при использовании функции MsgBox???
Допустим, что-то типа:

MsgBox (1, "", "Запускать? ")

и необходимо обработать нажатие кнопки, и дальше отправить по условию, как это можно сделать, кто нибудь подскажет?
Спасибо!

bogomolv
28-07-2005, 22:48
vserd

Рабочий скрипт немного сложнее:
While Not WinExists('Мастер Активации')
ControlClick('keygen', 'RU', 'Button4')
$GetSN=ControlGetText('keygen', 'RU', 'Edit1')
ControlSetText('ABBYY', 'Введите серийный номер', 'Edit1', $GetSN)
ControlClick('ABBYY', 'Введите серийный номер', 'Button1')
WinWait('Мастер Активации','',5)
WinClose('ABBYY', 'Проверьте правильность')
Wend


UncleGluk

Если кто-то:) открыл бы AutoIt.chm, то без труда там нашел:
If MsgBox (1, "", "Запускать? ")<>1 Then Exit

Sanja Alone
29-07-2005, 02:15
bogomolv
можно оперировать вводом-выводом, и не активируя соответствующие окна
Спрашивали не об этом - я отвечал на прямой вопрос.
А о том, что ты говоришь - я знаю, но без активации оно не всегда должным образом работает :(
Да, ты мне напомнил - я пару месяцев назад для знакомого делал автоустановку ABBYY FineReader 7.
Выкладываю для народа:
AutoItSetOption("TrayIconHide", 1)
BlockInput ( 1 )
Global $InstPath, $Serial, $InstID, $FFCode, $ActCode, $ACStr
AutoItSetOption ( "SendKeyDelay", 20 )
;запуск кейгена
Run ( 'keygen.exe' )
WinWaitActive ( 'Abbyy FineReader Professional v7.0 keygen' )
;страна - UA (для RU - удалить один ControlClick)
ControlClick ( 'Abbyy FineReader Professional v7.0 keygen', '', 'Button3' )
ControlClick ( 'Abbyy FineReader Professional v7.0 keygen', '', 'Button3' )
ControlClick ( 'Abbyy FineReader Professional v7.0 keygen', '', 'Button3' )
ControlClick ( 'Abbyy FineReader Professional v7.0 keygen', '', 'Button3' )
Sleep ( 600 )
$Serial = ControlGetText ( 'Abbyy FineReader Professional v7.0 keygen', '', 'Edit1' )
Sleep ( 70 )
;установка программы
Run ( 'setup.exe /L1049' )
WinWait ( 'ABBYY FineReader 7.0 Professional Edition - ', 'Лицензионный договор' )
WinActivate ( 'ABBYY FineReader 7.0 Professional Edition - ', 'Лицензионный договор' )
ControlCommand ( 'ABBYY FineReader 7.0 Professional Edition - ', 'Лицензионный договор', 'Я &принимаю условия лицензионного договора', "Check", "" )
Send ( '{ENTER}' )
WinWait ( 'ABBYY FineReader 7.0 Professional Edition - ', 'Режим установки' )
WinActivate ( 'ABBYY FineReader 7.0 Professional Edition - ', 'Режим установки' )
$InstPath = ControlGetText ( 'ABBYY FineReader 7.0 Professional Edition - ', 'Режим установки', 'RichEdit20W1' )
;по ум., путь = C:\Program Files\ABBYY FineReader 7.0 Professional Edition\
Выборочная установка. Выбрана только для подключения еще и англ. языка интерфейса - мужик хотел совсем "полную" установку.
Кому нужно, на этом этапе можно отключить FormFiller (после получения фокуса элементом SysTreeView321 нажать {DOWN 5}, !{DOWN}, {UP} и {ENTER} ).
Для обычной установки сразу жать Button1 и идти к STD
ControlClick ( 'ABBYY FineReader 7.0 Professional Edition - ', 'Режим установки', 'Button5' )
;Далее
ControlClick ( 'ABBYY FineReader 7.0 Professional Edition - ', 'Режим установки', 'Button1' )
WinWait ( 'ABBYY FineReader 7.0 Professional Edition - ', 'Выборочная установка' )
WinActivate ( 'ABBYY FineReader 7.0 Professional Edition - ', 'Выборочная установка' )
ControlFocus ( 'ABBYY FineReader 7.0 Professional Edition - ', 'Выборочная установка', 'SysTreeView321' )
Send ( '{DOWN}' )
Send ( '{RIGHT}' )
Send ( '{DOWN}' )
Send ( '!{DOWN}' )
Send ( '{DOWN}' )
Send ( '{ENTER}' )
Sleep ( 70 )
;Далее
Send ( '{ENTER}' )
;STD
WinWaitActive ( 'ABBYY FineReader 7.0 Professional Edition - ', 'Подключение к каналу новостей ABBYY' )
ControlCommand ( 'ABBYY FineReader 7.0 Professional Edition - ', 'Подключение к каналу новостей ABBYY', 'H&ет', "Check", "" )
Sleep ( 50 )
Send ( '{ENTER}' )
WinWaitActive ( 'ABBYY FineReader 7.0 Professional Edition - ', 'Установка программы' )
Send ( '{ENTER}' )
WinWaitActive ( 'ABBYY FineReader 7.0 Professional Edition - ', 'Установка ABBYY FineReader 7.0 завершена' )
Send ( '{ENTER}' )
Sleep ( 50 )
;регистрация программы
Run ( $InstPath & 'FineReader.exe' )
WinWaitActive ( 'ABBYY FineReader 7.0 Professional Edition Try&Buy', 'Вы работаете с испытательной версией программы' )
ControlCommand ( 'ABBYY FineReader 7.0 Professional Edition Try&Buy', 'Вы работаете с испытательной версией программы', '&Ввести серийный номер', "Check", "" )
Send ( '{ENTER}' )
WinWaitActive ( 'ABBYY FineReader 7.0 Professional Edition Try&Buy', '&Введите серийный номер' )
ControlSetText ( 'ABBYY FineReader 7.0 Professional Edition Try&Buy', '&Введите серийный номер', 'Edit1', $Serial )
Send ( '{ENTER}' )
WinWaitActive ( 'Мастер Активации ABBYY FineReader 7.0 Professional Edition', 'Мастер активации последовательно проведет Вас по всему процессу' )
ControlCommand ( 'Мастер Активации ABBYY FineReader 7.0 Professional Edition', 'Мастер активации последовательно проведет Вас по всему процессу','по &факсу или телефону', "Check", "" )
Send ( '{ENTER}' )
WinWaitActive ( 'Мастер активации ABBYY FineReader 7.0 Professional Edition', 'Активация по факсу или телефону' )
;для России Ukraine замените на Russia
ControlCommand ( 'Мастер активации ABBYY FineReader 7.0 Professional Edition', 'Активация по факсу или телефону', 'ComboBox1', "SelectString", 'Ukraine' )
$InstID = ControlGetText ( 'Мастер активации ABBYY FineReader 7.0 Professional Edition', 'Активация по факсу или телефону', 'Edit2' )
;переход в окно кейгена
WinActivate ( 'Abbyy FineReader Professional v7.0 keygen' )
Sleep ( 30 )
ControlSetText ( 'Abbyy FineReader Professional v7.0 keygen', '', 'Edit3', $InstID )
Sleep ( 70 )
;Generate
ControlClick ( 'Abbyy FineReader Professional v7.0 keygen', '', 'Button8' )
Sleep ( 50 )
$FFCode = ControlGetText ( 'Abbyy FineReader Professional v7.0 keygen', '', 'Edit2' )
$ActCode = ControlGetText ( 'Abbyy FineReader Professional v7.0 keygen', '', 'Edit4' )
Sleep ( 50 )
WinClose ( 'Abbyy FineReader Professional v7.0 keygen' )
WinWaitClose ( 'Abbyy FineReader Professional v7.0 keygen' )
Sleep ( 20 )
WinActivate ( 'Мастер активации ABBYY FineReader 7.0 Professional Edition', 'Активация по факсу или телефону' )
;из кейгена код получен одной строкой вида x-x-x..., а вводить нужно по частям в разные поля - разделяем.
$ACStr = StringSplit ( $ActCode, "-" )
Sleep ( 350 )
ControlSetText ( 'Мастер активации ABBYY FineReader 7.0 Professional Edition', 'Активация по факсу или телефону', 'Edit4', $ACStr[1] )
ControlSetText ( 'Мастер активации ABBYY FineReader 7.0 Professional Edition', 'Активация по факсу или телефону', 'Edit5', $ACStr[2] )
ControlSetText ( 'Мастер активации ABBYY FineReader 7.0 Professional Edition', 'Активация по факсу или телефону', 'Edit6', $ACStr[3] )
ControlSetText ( 'Мастер активации ABBYY FineReader 7.0 Professional Edition', 'Активация по факсу или телефону', 'Edit7', $ACStr[4] )
ControlSetText ( 'Мастер активации ABBYY FineReader 7.0 Professional Edition', 'Активация по факсу или телефону', 'Edit8', $ACStr[5] )
ControlSetText ( 'Мастер активации ABBYY FineReader 7.0 Professional Edition', 'Активация по факсу или телефону', 'Edit9', $ACStr[6] )
ControlSetText ( 'Мастер активации ABBYY FineReader 7.0 Professional Edition', 'Активация по факсу или телефону', 'Edit10', $ACStr[7] )
Sleep ( 30 )
Send ( '{ENTER}' )
WinWaitActive ( 'Мастер активации ABBYY FineReader 7.0 Professional Edition', 'Активация успешно завершена' )
Send ( '{ENTER}' )
Sleep ( 500 )
;это окно иногда появляется, а иногда нет.
(Тестил и на VMWare и на 2 реальных ПК - закономерности найти не пытался, а просто впаял эту проверку. Работает... и ладушки.)
If WinExists ( 'Регистрация FineReader 7.0 Professional Edition', 'Пожалуйста' ) Then
WinActivate ( 'Регистрация FineReader 7.0 Professional Edition', 'Пожалуйста' )
Send ( '{SPACE}' )
ControlClick ( 'Регистрация FineReader 7.0 Professional Edition', 'Пожалуйста', 'Button4' )
WinWaitActive ( 'Регистрация', 'Внимание!' )
Send ( '{ENTER}' )
EndIf
WinWait ( 'Добро пожаловать!' )
WinActivate ( 'Добро пожаловать!' )
;&Закрыть
ControlClick ( 'Добро пожаловать!', '', 'Button5' )
;активировать и закрыть основное окно программы
WinActivate ( 'Пакет без имени - ABBYY FineReader 7.0 Professional Edition' )
WinClose ( 'Пакет без имени - ABBYY FineReader 7.0 Professional Edition' )
WinWaitClose ( 'Пакет без имени - ABBYY FineReader 7.0 Professional Edition' )
Sleep ( 50 )
;активация FormFiller-а
Run ( $InstPath & 'FormFiller.exe' )
WinWaitActive ( 'Активация' )
ControlSetText ( 'Активация', '', 'Edit1', $FFCode )
Sleep ( 70 )
;&Активация
ControlClick ( 'Активация', '', 'Button1' )
WinWait ( 'Форма - ABBYY FormFiller' )
WinActivate ( 'Форма - ABBYY FormFiller' )
WinClose ( 'Форма - ABBYY FormFiller' )
WinWaitClose ( 'Форма - ABBYY FormFiller' )
Sleep ( 20 )
;перенос ярлыков
DirCopy ( @ProgramsCommonDir & '\ABBYY FineReader 7.0', @ProgramsCommonDir & '\Офис\ABBYY FineReader 7.0', 1 )
DirRemove ( @ProgramsCommonDir & '\ABBYY FineReader 7.0', 1 )
;Поддержка украинского языка для FineReader 7.0
;(пакет перепакован в winrar-sfx архив для тихой установки)
;команды SFX-сценария (для winrar-архива):
; Setup=setup.exe /L1049
; TempMode
; Silent=1
; Overwrite=1
RunWait ( 'ukr.exe' )
$FFCode = 0
$InstPath = 0
$Serial = 0
$InstID = 0
$ActCode = 0
$ACStr = 0
BlockInput ( 0 )P.S. Возможно, здесь не все оптимально, но работает без проблем.
Сама прога бралась отсюда (http://fr7.abbyy.com/fr70pro/FR7039612.exe) (43 749 965 байт)
Укр. язык (http://fr7.abbyy.com/fr70addlang/exe/Ukrain.exe) (1 639 936 байт) - может кому и нужен :)

bogomolv
29-07-2005, 09:57
Sanja Alone

С интересом познакомился с использованием функции StringSplit(). Даже не знал о ее существовании.

По оптимизации кода:
а) пару десятков строк можно сэкономить, используя вместо Run('setup.exe /L1049') команду RunWait('setup.exe /L1049 /v/qb');
б) в одном случае из 10 введенный серийник оказывается неверным. Поэтому "зацикливаю" его ввод (см. пример);
в) для настройки установленного FineRеader можно включить в скрипт RunWait('regedit /s FineRеader.reg') и FileCopy($iDir&'Untitled.fbt', $pDir, 1).

Общие вопросы:
б) зачем обнулять переменные на выходе из скрипта?
в) категорически не согласен с использованием BlockInput(). Отлаженный скрипт может быть неожиданно прерван на чужой машине выскочившим окошком какого-либо сообщения Windows об отсутствующих дровах и т.п. Что делать в этом случае? То же самое относится и к Opt('TrayIconHide',1). Наоборот всегда включаю Opt('TrayIconDebug',1), чтобы можно было понять, чего ждет "зависший" скрипт.

UncleGluk
29-07-2005, 12:49
bogomolv

Ой! :blush: да я не думал что все так просто! Начал чего то выдумывать и совсем потерялся, уйдя от правильной мыслишки!

Спасибо!




© OSzone.net 2001-2012