Войти

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


Страниц : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 [22] 23 24 25 26

Creat0R
25-10-2006, 01:49
Sanja Alone
Оч. просто это сделать при пом. cmd-файла:
Спасибо, до сих пор, я именно при помощий ком. строки (которую “писал” Аутоит) и реализовал свою цель :) , правда более примитивней чем твой пример - Но хотел узнать как средствами одного лишь аутоита это сделать, т.к требуется увеличение скорости, и уменьшения загрузкий процессора и памяти.

Здесь все муторней
Ну почему, разве такой командой это не решить просто:

cd "путь\к папке"
dir /b /s /o:-d *.* > test.tmp
А затем, аутоитом проверять первую строку временного файла:

$NewFile = FileReadLIne("Test.tmp", 1)

amel27
вот что получилось
Получилось идеально!!! Огромное спасибо! http://smilies.sofrayt.com/fsc/gentleman.gif


Angelus

где в этом скрипте ошибка?

В начало скрипта, поставь такую строчку:

Opt("TrayIconDebug", 1)

Если в скрипте есть строка скрывающая иконку скрипта в трее (#NoTrayIcon), то её нужно временно закоментировать (дописать в начале строки символ ; ).
И когда запустишь скрипт, то наведи мышку на иконку скрипта в трее, и посмотри на какой строке “зависает” скрипт.

Как я это вижу, скрипт зависает на одной из строк, содержащей WinWait или WinWaitActive - желательно ставить время, по истичению которого, скрипт больше не будет “ждать” появления окна или его активности...

WinWaitActive("Заголовок", "Текст", 120) ;Где 120, это секунды, по истичению которых, скрипт “продолжит” дальше, вне зависимости от того, появилось\активировалось ли окно или нет.

Sanja Alone
25-10-2006, 03:56
Creat0R
Ну почему, разве такой командой это не решить просто:Нет. Я же говорю, что эта команда производит сортировку в пределах каждого подкаталога, т.е., первой строкой будет самый новый файл рабочего каталога, а не всего дерева его подкаталогов. А это оч. сильно усложнит решение задачи при пом. cmd-файла.


Angelus
А этот (http://sanjaalone.h15.ru/files/autoit-winamp.zip) скрипт не подходит?
Отлов ошибок в скриптах описан в FAQ (http://oszone.net/display.php?id=3663).
Код нужно заключать в тэг code (http://forum.oszone.net/misc.php?do=bbcode#code). Прошу не игнорировать ПРАВИЛА ФОРУМА (http://forum.oszone.net/announcement.php?f=61&announcementid=43).

Lodoss
29-10-2006, 19:11
Есть неплохая идея: написать оболочку (GUI) для авторизации запуска скрипта от имени админа.

начал писать и наткнулся на проблемку - незнаю как реализовать проверку строки RunAsSet на наличие прав администратора
вот код:


#include <GUIConstants.au3>
GUICreate("Авторизация", 198, 125)
;фон окна
GUISetBkColor (0x00E0FFFF)
;лейблы
GUICtrlCreateLabel("Имя администратора", 25, 5)
GUICtrlCreateLabel("Пароль администратора", 25, 50)
;запуск и отмена скрипта
$ok = GUICtrlCreateButton("Ok", 25, 98, 70,20)
$cancel = GuiCtrlCreateButton ("Cancel",105,98,70,20)
;ввод имени
$us = @UserName
$in1 =GUICtrlCreateCombo ($us, 25, 25, 150, 20)
GUICtrlSetData($in1, "admin|qwerty|Администратор|Винни-Пух")
GUICtrlSetTip(-1,"введите имя любой учётной записи" & @CRLF & "имеюшей права Администратора")
;ввод пароля
$in2 = GUICtrlCreateInput ("solo11", 25, 70, 150, 20, 0x20)
GUICtrlSetTip(-1,"введите пароль")

GUISetState(@SW_SHOW)

While 2
$msg = GUIGetMsg()
;считываем введённые данные
$out1 = GUICtrlRead($in1)
$out2 = GUICtrlRead($in2)

Global $user = $out1, $pass = $out2

Select
Case $msg = $ok
;инициализация запуска от имени админа
RunAsSet($user, "", $pass)

;проверка верны ли введённые записи на право обладания правами админа
;вот здесь незнаю как реализовать проверку. написал но думается неправильно
;---------------------------------------
if IsAdmin() = -1 Then
MsgBox(16, "Ошибка", "Данная учётная запись не обладает правами Администратора")
EndIf
;---------------------------------------

;запуск программы
Run("setup.exe")
;закрытие окна
Case $msg = $cancel
ExitLoop
Case $msg = $GUI_EVENT_CLOSE
ExitLoop
EndSelect
WEnd
;-------------------------------------

в дополнение хотелось бы сделать так чтобы при неправильном вводе имени или пароля GUI не закрывалось а предлагало заново ввести имя и пароль. Ещё , если пользователь обладает правами администратора GUI вобще не появлялось а начинало запуск скрипта с команды Run либо выводило окно без пароля.
Помогайте решать ! :) думаю вещь полезная и пригодиться многим.

Sanja Alone
30-10-2006, 08:24
Lodoss
Помогайте решатьЭто хотел?
#include <GUIConstants.au3>
Opt("RunErrorsFatal",0)
;что запускать
$what_to_run="setup.exe"

If IsAdmin() Then
;запуск программы
Run($what_to_run)
Else
;если не админ, то "рисуем" GUI
_GUI()
EndIf

Func _GUI()
GUICreate("Авторизация", 198, 125)
;фон окна
GUISetBkColor (0x00E0FFFF)
;лейблы
GUICtrlCreateLabel("Имя администратора", 25, 5)
GUICtrlCreateLabel("Пароль администратора", 25, 50)
;запуск и отмена скрипта
$ok = GUICtrlCreateButton("Ok", 25, 98, 70,20)
$cancel = GuiCtrlCreateButton ("Cancel",105,98,70,20)
;ввод имени
$us = @UserName
$in1 =GUICtrlCreateCombo ($us, 25, 25, 150, 20)
GUICtrlSetData($in1, "admin|qwerty|Администратор|Винни-Пух")
GUICtrlSetTip(-1,"введите имя любой учётной записи" & @CRLF & "имеюшей права Администратора")
;ввод пароля
$in2 = GUICtrlCreateInput ("solo11", 25, 70, 150, 20, 0x20)
GUICtrlSetTip(-1,"введите пароль")

GUISetState(@SW_SHOW)

While 1
$msg = GUIGetMsg()
;считываем введённые данные
$out1 = GUICtrlRead($in1)
$out2 = GUICtrlRead($in2)

Global $user = $out1, $pass = $out2

Select
Case $msg = $ok
;инициализация запуска от имени админа
RunAsSet($user, "", $pass)

;проверка верны ли введённые записи на право обладания правами админа
;---------------------------------------
if IsAdmin() Then
;запуск программы
Run($what_to_run)
If @error Then
MsgBox(16, "Ошибка", "Введен неправильный пароль или отсутствует файл "&$what_to_run&@LF&@LF&"Попробуйте еще раз.",5)
EndIf
Else
MsgBox(16, "Ошибка", "Данная учётная запись не обладает правами Администратора",5)
EndIf
;---------------------------------------

;закрытие окна
Case $msg = $cancel
ExitLoop
Case $msg = $GUI_EVENT_CLOSE
ExitLoop
EndSelect
WEnd
;-------------------------------------
EndFunc

Jilted
30-10-2006, 11:45
Наваял тут скрипт для FastStone Image Viewer 2.8 с последующей русификацией.
Может, кому пригодится.
RunWait (@ScriptDir&'\'&'fs.exe /S') ; Тихая установка самой программы
Run (@ScriptDir&'\'&'Rus.exe') ; Установка русификатора
WinWait("Установка русификатора","Вас приветствует мастер")
WinActivate("Установка русификатора","Вас приветствует мастер")
WinWaitActive("Установка русификатора","Вас приветствует мастер")
Send("{ENTER}")
Send("{ENTER}")
WinWait("Установка русификатора","Внимательно ознакомьтесь")
WinActivate("Установка русификатора","Внимательно ознакомьтесь")
WinWaitActive("Установка русификатора","Внимательно ознакомьтесь")
Send("{UP}{UP}{ENTER}")
WinWait("Установка русификатора","Русификатор FastStone Image Viewer 2.8 будет установлен в следующую папку")
WinActivate("Установка русификатора","Русификатор FastStone Image Viewer 2.8 будет установлен в следующую папку")
WinWaitActive("Установка русификатора","Русификатор FastStone Image Viewer 2.8 будет установлен в следующую папку")
Send("{ENTER}")
WinWait("Установка русификатора","Русификатор FastStone Image Viewer 2.8 будет установлен в папку")
WinActivate("Установка русификатора","Русификатор FastStone Image Viewer 2.8 будет установлен в папку")
WinWaitActive("Установка русификатора","Русификатор FastStone Image Viewer 2.8 будет установлен в папку")
Send("{ENTER}")
WinWait("Установка русификатора","Русификатор FastStone Image Viewer 2.8 успешно установлен")
WinActivate("Установка русификатора","Русификатор FastStone Image Viewer 2.8 успешно установлен")
WinWaitActive("Установка русификатора","Русификатор FastStone Image Viewer 2.8 успешно установлен")
Send("{UP}{SPACE}{UP}{ENTER}")

Программа (http://www.faststone.org/DN/FSViewerSetup28.exe) + Русификатор (http://www.4ru.info/rus/alexagf-FastStone28r.zip)

Lodoss
31-10-2006, 17:48
2Sanja Alone

Да это, но наполовину.
проверил:
Если пользователь админ - оболочка не запускается как и хотелось , если GUI запускается проверка учётки на привелегии админа

Case $msg = $ok
RunAsSet($user, "", $pass)
if IsAdmin() Then
Run($what_to_run)
If @error Then
MsgBox(16, "Ошибка", "Введен неправильный пароль или отсутствует файл "&$what_to_run&@LF&@LF&"Попробуйте еще раз.",5)
EndIf
Else
MsgBox(16, "Ошибка", "Данная учётная запись не обладает правами Администратора",5)
EndIf

несрабатывает !!!, т е выдаёт сообщение "Данная учётная запись не обладает правами Администратора" в любом случае, даже если я под пользователем с ограничеными правами правильно ввёл учётные данные администратора. :/

и ещё вопрос можно ли в комбо списке сделать отображение учёток обладающих этими правами администратора :). в макро переменных нашёл только @UserName а можно ли получить список всех учёток зарегестрированых на компе и обладающих администраторскими привелегиями?.

TERMINAL
01-11-2006, 12:47
Как сделать закрытие окна (Alt+F4), например окно хелпа?!

Creat0R
01-11-2006, 18:03
TERMINAL
Как сделать закрытие окна
Можно так:

WinClose("Заголовок окна", "Текст окна")

Или так:

WinActivate("Заголовок окна", "Текст окна")
WinWaitActive("Заголовок окна", "Текст окна", 10)
Send("!{F4}")

Creat0R
02-11-2006, 08:08
Хотелось бы решить такую задачу...
Имеется файл, а в нём много разного текста, и нужно перечитать весь текст, и проверить, не содержатся ли в нём дубликаты определённой переменной.
Т.е, допустим файл содержит такой текст:

Первая строчка
Вторая строчка
Просто текст
Ещё текст...
Просто текст

И заранее известно, что именно нужно искать, и это помещенно в переменную - $Var = "Просто текст"...

Нужно в этом файле вычеслить, повторяется ли этот самый текст (тот который в переменной), если есть совпадения, то желательно вернуть номер строчки где есть совпадение, и строку содержащюю найденый дубликат (в Array[1].. [2] и т.п).

Возможно уже есть такая опция в AutoIt, но я что-то затрудняюсь найти в справке подобную функцию :(

TERMINAL
02-11-2006, 10:40
Creat0R
Спасибо тебе-(Send("!{F4}")) конкретно помогло.

Вопрос ещё один. У меня в программе ACDSee 8 вводится ключ в поле регистрации,но на совремменых компах он успевает вводится, а на слабых компах скрипт успевает ввести только 4 первых символа (паузы почемуто непомогают). Как сделать чтобы скрипт дождался полного ввода серийника.

Global $serial='12345-67890-12345-67890'
Run ( @ScriptDir & '\' & 'Setup.exe' )
WinWait("ACDSee 8 - InstallShield Wizard","ACDSee 8 can run with previous")
WinActivate("ACDSee 8 - InstallShield Wizard","ACDSee 8 can run with previous")
ControlClick("ACDSee 8 - InstallShield Wizard","ACDSee 8 can run with previous","Button1")
WinWait("ACDSee 8 - InstallShield Wizard","I &accept the terms in the lic")
WinActivate("ACDSee 8 - InstallShield Wizard","I &accept the terms in the lic")
ControlClick("ACDSee 8 - InstallShield Wizard","I &accept the terms in the lic","Button3")
ControlClick("ACDSee 8 - InstallShield Wizard","I &accept the terms in the lic","Button5")
WinWait("ACDSee 8 - InstallShield Wizard","&Organization:")
WinActivate("ACDSee 8 - InstallShield Wizard","&Organization:")
ControlClick("ACDSee 8 - InstallShield Wizard","&Organization:","RichEdit20W3")
ControlSetText ( 'ACDSee 8 - InstallShield Wizard', 'Customer Information', 'Edit3', $serial)
;Send($serial)
Sleep(5000)
ControlClick("ACDSee 8 - InstallShield Wizard","&Organization:","Button8")
WinWait("ACDSee 8 - InstallShield Wizard","&Complete")
WinActivate("ACDSee 8 - InstallShield Wizard","&Complete")
И вот ещё-хотелось бы узнать, как сделать, например, окно под названием ММ, чтобы при установке программы, когда вылазит окно ММ закрыть его и повторить установку заново, а если не вылезет тогда продолжать установку?!

VelDmi
02-11-2006, 14:55
Из скрипта запускается консольный nerocmd.exe. Можно ли как то получить данные, показываемые в консоли для отображения их в GUI автоита?

Creat0R
02-11-2006, 17:25
TERMINAL
Как сделать чтобы скрипт дождался полного ввода серийника
Попробуй вместо ControlSetText прописать так:

ControlCommand("ACDSee 8 - InstallShield Wizard", "Customer Information", "Edit3", "EditPaste", $serial)

И ещё, заголовок окна, чувствителен к регистру, поставь в начало скрипта, такую строчку - Opt("WinTitleMatchMode", 4)

когда вылазит окно ММ закрыть его и повторить установку заново
Нужно всё поместить в цикл, и в конце проверять существование окна...


Opt("WinTitleMatchMode", 4)

While 1
Global $serial='12345-67890-12345-67890'
Run ( @ScriptDir & '\' & 'Setup.exe' )
WinWait("ACDSee 8 - InstallShield Wizard","ACDSee 8 can run with previous")
WinActivate("ACDSee 8 - InstallShield Wizard","ACDSee 8 can run with previous")
ControlClick("ACDSee 8 - InstallShield Wizard","ACDSee 8 can run with previous","Button1")
WinWait("ACDSee 8 - InstallShield Wizard","I &accept the terms in the lic")
WinActivate("ACDSee 8 - InstallShield Wizard","I &accept the terms in the lic")
ControlClick("ACDSee 8 - InstallShield Wizard","I &accept the terms in the lic","Button3")
ControlClick("ACDSee 8 - InstallShield Wizard","I &accept the terms in the lic","Button5")
WinWait("ACDSee 8 - InstallShield Wizard","&Organization:")
WinActivate("ACDSee 8 - InstallShield Wizard","&Organization:")
ControlClick("ACDSee 8 - InstallShield Wizard","&Organization:","RichEdit20W3")
ControlCommand("ACDSee 8 - InstallShield Wizard", "Customer Information", "Edit3", "EditPaste", $serial)
ControlClick("ACDSee 8 - InstallShield Wizard","&Organization:","Button8")
WinWait("ACDSee 8 - InstallShield Wizard","&Complete")
WinActivate("ACDSee 8 - InstallShield Wizard","&Complete")

WinWait("MM", "", 10) ; ждём 10 секунд окна с заголовком MM
If WinExists("MM", "") Then ContinueLoop
ExitLoop
Wend



VelDmi
Можно ли как то получить данные, показываемые в консоли
Попрубуй так:

$NerocmdTxt = WinGetText("Заголовок консоли", "")

TERMINAL
02-11-2006, 18:10
Creat0R

<Нужно всё поместить в цикл, и в конце проверять существование окна...>

А примерчик простенький можна?

Creat0R
03-11-2006, 02:07
TERMINAL
примерчик простенький можна?
Неужели не видно тот пример который я привёл в своём посте? :blink:

Цикл:

While 1
....
Wend

Это “заставит” скрипт “ходить” от While 1 до Wend, до тех пор, пока что то не заставит выйти из этого цикла...

While 1
ExitLoop ; Выход с цикла
Wend

И соответственно строим условие, при существовании которго, что то произойдёт (выход из цикла, или продолжение цикла)...

While 1
If WinExists("MM", "") Then ContinueLoop ;Если окно существует, то цикл начнётся заного, и скрипт моментально “продолжит” с начала цикла (While 1)
ExitLoop ;Выход из цикла (так как окно небыло найдено)
Wend

amel27
03-11-2006, 05:50
Creat0RИмеется файл, а в нём много разного текста, и нужно перечитать весь текст, и проверить, не содержатся ли в нём дубликаты определённой переменной.
Обычным циклом устроит? Функция выводит сообщения (Select) и возвращает двумерный массив со счетчиком (номер строки и текст) , можно на выбор оставить что-нибудь одно:
#include <File.au3>

$dups = _TextInFile ("c:\test.txt", "Просто текст")

Func _TextInFile ($file, $text)
Local $i, $txtLines, $res [1][2] = [[0,0]]
Local $str='Строки, содержащие "' & $text & '":' & @CRLF & @CRLF
_FileReadToArray ($file, $txtLines)
If Not IsArray ($txtLines) Then
MsgBox (16, 'Ошибка', 'Файл пуст')
EndIf
For $i=1 To $txtLines [0]
If StringInStr ($txtLines [$i], $text) Then
ReDim $res [$res [0][0]+2][2]
$res [0][0] = $res [0][0] +1
$res [$res [0][0]][0] = $i
$res [$res [0][0]][1] = $txtLines [$i]
$str = $str & $i & ':' & @TAB & $txtLines [$i] & @CRLF
EndIf
Next
Select
Case $res [0][0] =0
MsgBox (16, 'Ошибка', 'Вхождений не обнаружено!')
Case $res [0][0] =1
MsgBox (64, 'Сообщение', 'Дублей нет')
Case Else
MsgBox (48, 'Предупреждение', $str)
EndSelect
Return $res
EndFunc

amel27
03-11-2006, 07:30
Lodoss
можно ли получить список всех учёток зарегестрированых на компе и обладающих администраторскими привелегиями?.ну ты горазд задачки задавать... три дня колдовал на DllCall ;) ... самое забавное, что на форуме AutoIt не нашел ни одного рабочего варианта... Зато теперь можно смело замахнуться на всю линейку NetApi32 (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/netmgmt/netmgmt/network_management_functions.asp) :)
;===============================================================================
; Использование: _NetLocalGroupGetMembers ($s_Group, [$s_Computer, [, $i_ShowDomain [, $i_Filter]]])
; Параметры: $s_Group - имя локальной группы;
; $s_Computer - DNS или NetBIOS имя компьютера, пустая строка или пропущенный
; параметр равнозначны локальному компьютеру;
; $i_ShowDomain - "1" включить имя домена, "0" не включать;
; $i_Filter - набор флагов, задающих фильтр отбираемых записей:
; 1 - пользователи,
; 2 - группы,
; 16 - предопределенные (WellKnown) группы,
; 32 - удаленные учетные записи,
; 128 - неизвестный тип.
; Результат: При успешном завершении возвращает 1-мерный массив учетных записей,
; 1-й элемент массива (индекс 0) содержит количество записей.
; При неудаче 1-й элемент содержит "-1" и @error указывает код ошибки
;
;===============================================================================

Func _NetLocalGroupGetMembers ($sGroup, $sServer = "", $iShowDom = 1, $iFilter = 511)
Local $res [1] = [0], $uPTR= DllStructCreate ("ptr")
If $iShowDom Then
$iShowDom=2
Else
$iShowDom=1
EndIf
Local $ret = DllCall ("netapi32.dll", "int", "NetLocalGroupGetMembers", _
"wstr", $sServer, _
"wstr", $sGroup, _
"int", $iShowDom, _
"ptr", DllStructGetPtr ($uPTR), _
"int", -1, _
"int_ptr", 0, _
"int_ptr", 0, _
"int_ptr", 0 )
If $ret[0] Then
SetError ($ret [0])
$res[0] = -1
Else
If $ret[6]>0 Then
Local $i, $string
Local $uBUF = DllStructCreate ("ptr[" & $ret[6]*3 & "]", DllStructGetData ($uPTR,1) )
For $i=3 To $ret[6]*3 Step 3
If BitAnd (BitShift (1, 1 - DllStructGetData ($uBUF, 1, $i-1) ), $iFilter) Then
$ret = DllCall("kernel32.dll", "int", "WideCharToMultiByte", _
"int", 0, _
"int", 0, _
"ptr", DllStructGetData ($uBUF, 1, $i), _
"int", -1, _
"str", "", _
"int", 0, _
"int", 0, _
"int", 0 )
$string = DllStructCreate ("char[" & $ret[0] & "]")
$ret = DllCall("kernel32.dll", "int", "WideCharToMultiByte", _
"int", 0, _
"int", 0, _
"ptr", DllStructGetData ($uBUF, 1, $i), _
"int", $ret[0], _
"ptr", DllStructGetPtr ($string), _
"int", $ret[0], _
"int", 0, _
"int", 0 )
ReDim $res [$res[0]+2]
$res [0] = $res [0]+1
$res [$res[0]] = DllStructGetData ($string,1)
EndIf
Next
EndIf
EndIf
DllCall ("netapi32.dll", "int" ,"NetApiBufferFree", _
"ptr" , DllStructGetData ($uPTR,1) )
Return $res
EndFunc

TERMINAL
03-11-2006, 10:48
Я наверное плохо объяснил...
Суть проблемки с циклами вот в чём-программа имеет сетап и патч. При установки сетапа всё происходит ОК, а при установке патча (если нет видео драйверов) выдаётся ошибка и прекращается установка.Потом опять запускаешь патч до тех пор пока он не начинает сам ставится (это бывает от 1 до 2 раз). Вот я и хочу объяснить скрипту что если ничего не вылезет то можно продолжать установку (а не так как у тебя-ВЫХОД), а если вылезет окно ошибки, то нужно закрыть его и опять устанавливат этот патч пока он не установится.

Creat0R
04-11-2006, 01:52
amel27
Функция выводит сообщения (Select) и возвращает двумерный массив со счетчиком (номер строки и текст)

Немного не так :( - Мне нужно чтобы вернулись в массив все номера строк, которые содержат дубляжи (именно дубляжи, без первой находки искомого слова), и желательно, чтобы в массиве эти номера строк, помещались через разделитель (допустим, через | ). В случае неудачи (или если вовсе не найденно вхождении), т.е если дубликатов нет, ненужно выводить сообщения, а просто в массив с нулём ($Array[0]) поместить содержание искомого слова (ну или вообще просто пустату "" - это нужно для проверки содержит ли массив номера строк, т.е дубляжи).

Просто дело в том, что задача у меня примерно такая:
-Проверить файл на дубликаты определённово слова (а точнее ссылки), если есть таковы, то просто удалить все дубликаты, оставив один-“оригинал” - Как удалять я знаю, имея номера строк, я могу восспользоваться функцией _FileWriteToLine...

#include <File.au3>

$Array = StringSplit("1|4|6|8", "|") ;Вместо цифр будет подставлен тот самый массив с номерами строк

For $i = 1 to $Array[0]
_FileWriteToLine("File.txt", $Array[$i], "", 1)
Next

Но и тут есть проблема, после удаления строки под первым номером присутствующем в массиве, все остальные теряют своё значения, и удаляются уже не те строки (вернее по номеру это правильные строки, а по контексту нет) - Поэтому нужно как то удалять строки все одновременно, или на основе номеров строк, брать их содержание в другой массив, и уже потом удалять (вернее заменять) их основываясь на тексте - Но как это реализовать, я пока смутно себе представляю :(

---------------------------------

TERMINAL

У тебя в примере, нет упоминания о патче, но попробую привести нужны пример на основе воображения :) :

Opt("WinTitleMatchMode", 4)

Global $serial='12345-67890-12345-67890'
Run ( @ScriptDir & '\' & 'Setup.exe' )
WinWait("ACDSee 8 - InstallShield Wizard","ACDSee 8 can run with previous")
WinActivate("ACDSee 8 - InstallShield Wizard","ACDSee 8 can run with previous")
ControlClick("ACDSee 8 - InstallShield Wizard","ACDSee 8 can run with previous","Button1")
WinWait("ACDSee 8 - InstallShield Wizard","I &accept the terms in the lic")
WinActivate("ACDSee 8 - InstallShield Wizard","I &accept the terms in the lic")
ControlClick("ACDSee 8 - InstallShield Wizard","I &accept the terms in the lic","Button3")
ControlClick("ACDSee 8 - InstallShield Wizard","I &accept the terms in the lic","Button5")
WinWait("ACDSee 8 - InstallShield Wizard","&Organization:")
WinActivate("ACDSee 8 - InstallShield Wizard","&Organization:")
ControlClick("ACDSee 8 - InstallShield Wizard","&Organization:","RichEdit20W3")
ControlCommand("ACDSee 8 - InstallShield Wizard", "Customer Information", "Edit3", "EditPaste", $serial)
ControlClick("ACDSee 8 - InstallShield Wizard","&Organization:","Button8")
WinWait("ACDSee 8 - InstallShield Wizard","&Complete")
WinActivate("ACDSee 8 - InstallShield Wizard","&Complete")

While 1
Run( @ScriptDir & '\' & 'Path.exe' )

WinWait("MM", "", 10) ; ждём 10 секунд окна с заголовком MM

;В случае появления окна с заголовком “MM”, Закрываем его, и запускаем патч снова
If WinExists("MM", "") Then
WinClose("MM", "")
ContinueLoop
EndIf
ExitLoop
Wend

XXXler
04-11-2006, 03:08
Нижеприведенная функция убивает все возможные окна от запущенного ей процесса и если какие-либо окна появлялись - перезапускает прогу заново (убиваются окна также дочерних процессов, просто одноименные окна\процессы не затрагиваются)

;~ Пример запускает+закрывает setup.exe:
RunKillWin(@SystemDir&"\setup.exe")

;~ Использование:
;~ RunKillWin("Путь и имя файла"[, таймаут ожидания завершения выполнения exe(сек)][,количество попыток "тихого" выполнения])
;~ Возвращает количесто выполненых попыток

Func RunKillWin($Exe,$MaxTimeOutForProcess=300,$MaxCountToReRun=10)
Local $i,$PID,$Timer,$WinArr,$y,$z=0

For $i=1 To $MaxCountToReRun

;~ Корявая поверка необходимости перезапуска
If $z=1 Then ExitLoop
$z=1

$PID=Run($Exe)
;~ Запуск таймера таймаута выполнения
$Timer=TimerInit()

While ProcessExists($PID)

;~ Сверка таймера
If TimerDiff($Timer)>$MaxTimeOutForProcess*1000 Then
ProcessClose($PID)
If Not(ProcessWaitClose($PID,30)) Then Return -1
$z=0
ContinueLoop 2
EndIf

$WinArr=WinList()
For $y=1 To $WinArr[0][0]
If Not(WinGetProcess($WinArr[$y][1])=$PID) Then ContinueLoop
;~ Собственно действие над окном\доп. проверку его титла можно поменять здесь
WinKill($WinArr[$y][1])
$z=0
Next

WEnd

Next
Return $i-1
EndFunc

Sanja Alone
04-11-2006, 03:55
TERMINAL
Как сделать чтобы скрипт дождался полного ввода серийника
$serial="серийник"
WinWait ("Заголовок", "Текст")
Do
ControlSetText ( "Заголовок", "Текст", "Edit1", $serial )
Until ControlGetText ( "Заголовок", "Текст", "Edit1" )=$serialДумаю, что идея ясна.




© OSzone.net 2001-2012