Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [Архив - Часть 1.2] AutoIt скрипты

Ответить
Настройки темы
[Архив - Часть 1.2] AutoIt скрипты

Ветеран


Сообщения: 565
Благодарности: 41

Профиль | Сайт | Отправить PM | Цитировать


Изменения
Автор: Vadikan
Дата: 25-01-2008
Внимание!
Тема переведена в архивное состояние





(настоятельно рекомендуется к прочтению/поиску)


Руководство к действию по работе c AutoIt.
Можно ли с помощью AutoIt выбрать каталог? Хочу нацарапать оболочку, которая мне будет конфиги для nnBackup писать, дык выбрать каталог для бэкапа пока только вручную получается... Нельзя ли как-нть вывалить стандартный диалог по выбору файлов-папок, и получить из него результат действий пользователей?

-------
Tega AutoPatcher. Все обновления для XP в одном пакете. http://tega.ru/dirk/links.html


Отправлено: 10:47, 10-02-2006

 

Старожил


Сообщения: 205
Благодарности: 20

Профиль | Отправить PM | Цитировать


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

Отправлено: 14:55, 02-11-2006 | #431



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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


Аватара для Creat0R

Must AutoIt


Сообщения: 3054
Благодарности: 1009

Профиль | Сайт | Отправить PM | Цитировать


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("Заголовок консоли", "")

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community

Это сообщение посчитали полезным следующие участники:

Отправлено: 17:25, 02-11-2006 | #432


Аватара для TERMINAL

Ветеран


Сообщения: 753
Благодарности: 28

Профиль | Отправить PM | Цитировать


Creat0R

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

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

-------
Автоматизация прежде всего....


Отправлено: 18:10, 02-11-2006 | #433


Аватара для Creat0R

Must AutoIt


Сообщения: 3054
Благодарности: 1009

Профиль | Сайт | Отправить PM | Цитировать


TERMINAL
Цитата:
примерчик простенький можна?
Неужели не видно тот пример который я привёл в своём посте?

Цикл:

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

Код: Выделить весь код
While 1
ExitLoop ; Выход с цикла
Wend
И соответственно строим условие, при существовании которго, что то произойдёт (выход из цикла, или продолжение цикла)...

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

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community


Отправлено: 02:07, 03-11-2006 | #434


Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


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
Это сообщение посчитали полезным следующие участники:

Отправлено: 05:50, 03-11-2006 | #435


Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


Lodoss
Цитата:
можно ли получить список всех учёток зарегестрированых на компе и обладающих администраторскими привелегиями?.
ну ты горазд задачки задавать... три дня колдовал на DllCall ... самое забавное, что на форуме AutoIt не нашел ни одного рабочего варианта... Зато теперь можно смело замахнуться на всю линейку NetApi32
Код: Выделить весь код
;===============================================================================
; Использование:     _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

Последний раз редактировалось amel27, 17-11-2006 в 11:04. Причина: правка скрипта


Отправлено: 07:30, 03-11-2006 | #436


Аватара для TERMINAL

Ветеран


Сообщения: 753
Благодарности: 28

Профиль | Отправить PM | Цитировать


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

-------
Автоматизация прежде всего....


Отправлено: 10:48, 03-11-2006 | #437


Аватара для Creat0R

Must AutoIt


Сообщения: 3054
Благодарности: 1009

Профиль | Сайт | Отправить PM | Цитировать


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

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community


Отправлено: 01:52, 04-11-2006 | #438


Аватара для XXXler

Ветеран


Сообщения: 1073
Благодарности: 194

Профиль | Отправить PM | Цитировать


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

Код: Выделить весь код
;~ Пример запускает+закрывает 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

Отправлено: 03:08, 04-11-2006 | #439


Аватара для Sanja Alone

Ищу Человека…


Сообщения: 420
Благодарности: 67

Профиль | Сайт | Отправить PM | Цитировать


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

-------
Sanja Alone's site (ConvRegToAU3, OEsr, RSA, AutoIt скрипты)


Отправлено: 03:55, 04-11-2006 | #440



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [Архив - Часть 1.2] AutoIt скрипты

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Открывая 7z архив пишет не удаётся открыть как архив. Можно ли его восстановить? DreDo Хочу все знать 4 01-12-2009 18:54
[Архив - Часть 3] AutoIt скрипты .:[общие вопросы]:. Vadikan AutoIt 1543 18-01-2009 10:46
[архив - Часть 2] AutoIt скрипты Vadikan AutoIt 985 21-01-2008 09:58
[Архив - Часть 1.3] AutoIt скрипты biork AutoIt 503 09-06-2007 11:27
[Архив - Часть 1.1] AutoIt скрипты EgOrus AutoIt 335 04-02-2006 16:58




 
Переход