Войти

Показать полную графическую версию : [архив - Часть 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 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50

Maza Faka
22-08-2007, 12:06
mikola1983, Пасипа ... а есть какой нибуть вообще вариант отчета ....возможно 1 файл в который дабавятся имена ПК или логоны юзеров ...что нибуть такое по чему можно былобы определить кто отказался от установки.?
Попробуй так:

$Ask = MsgBox(36, "Вопрос", "хочешь установить?")
If $Ask = 6 Then
MsgBox(64, "Ответ", "Отлично, устанавливаем!")
;тут устанавливаем
Else
MsgBox(48, "Ответ", "А жаль :(")
$open = FileOpen("c:\test.txt", 1)
FileWrite($open, @LogonDomain & " - " & @UserName & @CRLF)
FileClose($open)
;тут отсылаем на email ;)
EndIf

Creat0R
22-08-2007, 20:15
Maza Faka,
Как сделать это-же, только в режиме OnEvent?
Я бы сделал так:


#include <GUIConstants.au3>
Opt("GuiOnEventMode", 1)

Global $iProgr = -1

$gui = GUICreate("My GUI", 300, 200, -1, -1)
GUISetOnEvent($GUI_EVENT_CLOSE, "CloseGui")

$Button = GUICtrlCreateButton("Start", 115, 20, 70)
GUICtrlSetOnEvent($Button, "SetProgress")

$Progress = GUICtrlCreateProgress(10, 60, 280, 15)

GUISetState(@SW_SHOW)

While 1
Sleep(100)
WEnd

Func SetProgress()
If $iProgr = -1 Then AdlibEnable("SetProgress", 300)
$iProgr += 10
If $iProgr > 100 Then $iProgr = 0
GuiCtrlSetData($Progress, $iProgr)
EndFunc

Func CloseGui()
Exit
EndFunc


Только зачем пауза именно в 300 мс? таким образом прогресс не очень гладко прогрессирует :)

amel27, Не понял... Зачем временный файл? Ключ "/ErrorStdOut" вроде никак не связан с "/AutoIt3ExecuteScript"
Теперь я кажется тоже начинаю не понимать - используя ключ /ErrorStdOut, можно запустить скрипт без вывода всяких сообщении о фатальных ошибках (или просто ошибки о неверном синтаксисе и т.п), но как это использовать в закомпилированном скрипте, при этом не создавая временный файл? (чтобы в него всё прописать и запустить с этим ключом).

Связь у этих ключей тут одна, запуск скрипта в "тихом режиме" :)

Maza Faka
23-08-2007, 09:12
Creat0R, Я бы сделал так:
Спасибо за наводку! В итоге сделал так:

#include <GUIConstants.au3>
Opt("GuiOnEventMode", 1)

Global $iProgress = 0, $i = 0

$gui = GUICreate("My GUI", 300, 200, -1, -1)
GUISetOnEvent($GUI_EVENT_CLOSE, "CloseGui")

$Button = GUICtrlCreateButton("Start", 115, 20, 70)
GUICtrlSetOnEvent($Button, "SetProgress")

$Progress = GUICtrlCreateProgress(10, 60, 280, 15)

GUISetState(@SW_SHOW)

While 1
Sleep(300)
WEnd

Func SetProgress()
If $iProgress = 0 Then
$iProgress = 1
GUICtrlSetData($Button, "Abort")
AdlibEnable("Test", 300)
Else
GUICtrlSetData($Button, "Start")
$iProgress = 0
AdlibDisable()
EndIf
EndFunc

Func CloseGui()
Exit
EndFunc

Func Test()
$i += 10
If $i > 100 Then $i = 0
GuiCtrlSetData($Progress, $i)
EndFunc

Creat0R
23-08-2007, 10:42
Maza Faka,
В итоге сделал так
Тогда можно так (без использования функции Test() и AdlibEnable() :) )...


#include <GUIConstants.au3>
Opt("GuiOnEventMode", 1)

Global $iProgress = 0, $i = 0

$gui = GUICreate("My GUI", 300, 200, -1, -1)
GUISetOnEvent($GUI_EVENT_CLOSE, "CloseGui")

$Button = GUICtrlCreateButton("Start", 115, 20, 70)
GUICtrlSetOnEvent($Button, "SetProgress")

$Progress = GUICtrlCreateProgress(10, 60, 280, 15)

GUISetState(@SW_SHOW)

While 1
Sleep(100)
While $iProgress
Sleep(30)
$i += 1
If $i > 100 Then $i = 0
GuiCtrlSetData($Progress, $i)
WEnd
WEnd

Func SetProgress()
If $iProgress = 0 Then
$iProgress = 1
GUICtrlSetData($Button, "Abort")
Else
$iProgress = 0
GUICtrlSetData($Button, "Start")
EndIf
EndFunc

Func CloseGui()
Exit
EndFunc


Я так и не понял, зачем ставить паузу в 300 мс и прогресс по 10? :blink:

Maza Faka
23-08-2007, 13:51
Creat0R, Тогда можно так (без использования функции Test() и AdlibEnable()
Да! Сенкс! :)

Я так и не понял, зачем ставить паузу в 300 мс и прогресс по 10?
А как лучше?

amel27
23-08-2007, 14:29
Creat0Rкак это использовать в закомпилированном скрипте, при этом не создавая временный файл? (чтобы в него всё прописать и запустить с этим ключом).например так:; Проверка ключей и перезапуск в "тихом" режиме
If Not(StringRegExp($CmdLineRaw,'(?i)^/ErrorStdOut(?:\s|$)')) Then
$pid = Run (@ScriptFullPath &' /ErrorStdOut '& $CmdLineRaw, @ScriptDir, 0, 2)
_ScriptWriteLog($pid)
Exit
EndIf
; Текст скрипта (пример ошибочной команды)
Run('Фигня всякая')
; Сохранение ошибок в лог-файле
Func _ScriptWriteLog($pid)
Local Const $log = StringTrimRight(@ScriptFullPath,3) &'log'
Local $text = ''
FileWrite($log, @YEAR&'/'&@MON&'/'&@MDAY&' '&@HOUR&':'&@MIN&':'&@SEC&@CRLF)
While 1
$text = StdoutRead($pid)
If @error Then ExitLoop
FileWrite($log, $text)
Wend
FileWrite($log, @CRLF)
EndFunc
З.Ы. С одной стороны неудобно, что запускаются два процесса, но с другой - есть возможность перехватывать ошибки средствами того же EXE-файла.

nns
23-08-2007, 16:26
Здравствуйте всем.
Не подскажете, как с помощью AutoIT'а отловить окно с неизвестным заголовком. Проблема в том, что заголовок частично на другом языке, частично на английском. WinWait() по описанию должен отлавливать по подстроке заголовка (англ части), но в данном случае этого не происходит.
Можно ли как-то отловить окно, не зная заголовка, зная, к пример, что оно запустится через Run("..") ?
Спасибо.

Maza Faka
23-08-2007, 17:32
nns
При помощи утилиты "AutoIt Window Info" определи класс окна и сопостовляй поиск окна с пользовательским режимом.
Пример на блокноте:

Opt("WinTitleMatchMode", 4)
$title = "Classname=Notepad"
Run("notepad.exe")
WinWait($title)
ControlSend($title, "", "Edit1", "Hello World")

Creat0R
23-08-2007, 19:02
Maza Faka,
А как лучше?
Я уже в третьем примере привожу более плавный вариант ;) - паузу ставим примерно в 30, а степень прогресса по единичке (1).

nns,
Можно ли как-то отловить окно, не зная заголовка, зная, к пример, что оно запустится через Run("..") ?
Можно получить PID (идентификатор процесса), и по нему узнать заголовок (вот тут (http://creator-lab.ucoz.ru/load/3-1-0-19) есть для эого функция)... но это проблематично, так как в разных случаях процесс может быть уже запущен, а окно всё ещё не появилось, нужно знать заранее хотябы поведение запускаемого приложения.

amel27,
например так:
Wow! Спасибо большое! я думал что это не прокатит с закомпилированным скриптом :)...

С одной стороны неудобно, что запускаются два процесса
Это только если нужно читать ошибки, в противном случае скрипт можно запустить, а родительский процесс сразу же закрывается.. я даже не успеваю разглядеть его в диспетчере задач.

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


Opt("WinTitleMatchMode", 2)

$NotepadTitle = WinGetTitle("- Notepad")

MsgBox(64, "", "Title of Notepad is: " & $NotepadTitle)


Получать заголовок по classname не всегда идеальный метод, у меня к примеру стоит всместо стандартного Notepad -> Notepad2, и класс у него естественно другой (Notepad2 :) ).

Я на оф. форуме запостил предложение (http://www.autoitscript.com/forum/index.php?showtopic=51217) о том чтобы добавили поддержку совмещения classname и regexp при расширенном поиске окон, но они вроде не собираются ничего предпринимать :(
Если они это сделают, тогда можно будет искать окно примерно так:

Opt("WinTitleMatchMode", 4)
$NotepadTitle = WinGetTitle("classname+regexp=Notepad[0-9]")

Maza Faka
23-08-2007, 19:49
Получать заголовок по classname не всегда идеальный метод, у меня к примеру стоит всместо стандартного Notepad -> Notepad2, и класс у него естественно другой (Notepad2 ).

Не понял, ты имеешь в виду, что могут быть глюки из-за схожих названий классов? Или что, бы схожие по названию классы классифицировались, как один? Плз обьясни подробней.

Creat0R
23-08-2007, 20:11
Maza Faka,
ты имеешь в виду, что могут быть глюки из-за схожих названий классов?
Они будут ;) класс должен быть в точности, частичной подборки классов пока не реализовано...

Плз обьясни подробней
Ну к примеру если имеем класс окна IEFrame (у Internet Explorer), то подбирая так: classname=IEFrame всё будет ок, но если к примеру класс окна таков: classname=bosa_sdm_Microsoft Office Word 11.0 (у MS Word), тогда нужно быть уверенным что именно такой класс имеет это окно, а если нам к примеу нужно подобрать другой заголовок приложения Office, к примеру от Power Point, то там заголовок немного другой, но схожесть есть, он также начинается с bosa_sdm... - Вот тут то нам и пригодилась бы подборка по regexp (прописав regexp+classname=bosa_sdm(.*)).

Creat0R
24-08-2007, 06:43
Обновил скрипт который предназначен для вставки AutoIt-кода в разукрашенном виде на форум - Au3ToPost 1.4:

http://img201.imageshack.us/img201/9205/au3topost14maincc6.th.png (http://img201.imageshack.us/img201/9205/au3topost14maincc6.png)

http://img201.imageshack.us/img201/7868/au3topost14resultsmb0.th.png (http://img201.imageshack.us/img201/7868/au3topost14resultsmb0.png)


История версии:

v1.4
* Все временные файлы теперь хранятся в @TempDir & "\Временная папка" - "Временная папка" генерируется при каждом запуске скрипта - таким образом легче хранить и удалять временные файлы.
* Некоторые уточнения в интерфейсе GUI.
* Теперь при запуске фокус сразу переходит на поле с кодом скрипта.
* Также фокус переходит на поле с кодом при зажатии птички "Ввести код вручную".
* Данные о входном и выходном файле теперь пишутся (запоминаются) при выходе с программы.
+ Добавлена возможность использования клавиши Tab в процессе ручной правки кода скрипта.
+ Добавлено отображение количества символов при выводе результата (на разных форумах разные ограничения на количество символов в посте).
+ Добавлено главное меню:
****Меню;
********"Интегрировать программу в SciTE" - Добавляет пункт в меню Tools для удобного доступа к программе.
********"Выход" - Выход из программы ;)
****
****О программе - Отображает детали о программе :)

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

v1.3
* Улучшена обработка нажатии чекбоксов.
* Добавлена проверка на ошибки.
* Общая оптимизация программы.
* Многие уточнения и коррекции в программе.


Закачать можно отсюда... (http://creator-lab.ucoz.ru/load/3-1-0-18)

mikola1983
24-08-2007, 07:47
а есть ли возможность в автоит работать с чек боксами или радио кнопками? иногда не удобно писать {SPACE}{DOWN}{SPACE}{DOWN}{SPACE}...особенно если их много....есть ли более простой способ указывать чек бокс.

Creat0R
24-08-2007, 08:02
mikola1983,
а есть ли возможность в автоит работать с чек боксами или радио кнопками?
Конечно!
К примеру используя ControlCommand() или ControlClick()...


#include <GuiConstants.au3>

$Gui = GuiCreate("Test")

$Radio1 = GUICtrlCreateRadio("Radio1", 20, 60)
$Radio2 = GUICtrlCreateRadio("Radio2", 20, 80)

$CheckBox1 = GUICtrlCreateCheckbox("CheckBox1", 20, 120)
$CheckBox2 = GUICtrlCreateCheckbox("CheckBox2", 20, 140)

$Button_Radio = GUICtrlCreateButton("Check Radio", 20, 200)

$Button_CheckBox = GUICtrlCreateButton("Check CheckBox", 120, 200)

GUISetState()

While 1
$Msg = GUIGetMsg()
Switch $Msg
Case -3
Exit
Case $Button_Radio
ControlCommand($Gui, "", $Radio1, "Check", "")
Case $Button_CheckBox
ControlClick($Gui, "", $CheckBox2)
EndSwitch
WEnd

Maza Faka
24-08-2007, 08:04
есть ли возможность в автоит работать с чек боксами или радио кнопками?
Да, например:

ControlCommand ( "title", "text", controlID, "Check", "")

Для снятия отметки "Uncheck".

P.S.
Ты в справку заглядываешь? ;)

mikola1983
24-08-2007, 08:11
Пасипа ) заглядываю но совет гуру луччи любой справки ....тем более я только начал осваивать данную программу и пока тяжеловато мне со справкой.

Maza Faka
24-08-2007, 10:37
Почему функция StdOutRead() так странно работает? Вот к примеру скрипт:


$foo = Run(@ComSpec & " /c @dir /b e:\", @SystemDir, @SW_HIDE, 4+2)

While 1
$line = StdoutRead($foo)
If @error Then ExitLoop
MsgBox(0, "STDOUT read:", $line)
Wend

While 1
FileWrite("c:\error.log", $line)
$line = StderrRead($foo)
If @error Then ExitLoop
MsgBox(0, "STDERR read:", $line)
Wend


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

Maza Faka
24-08-2007, 13:58
Почему функция возвращает ноль?


Dim $path
MsgBox(64, "Done", WritePathToReg("icqlite.exe", @ProgramFilesDir))

Func WritePathToReg($icq, $path)
$search = FileFindFirstFile($path & "\*.*")
While 1
$file = FileFindNextFile($search)
If @error Then ExitLoop
$full_path = $path & "\" & $file
If FileGetAttrib($full_path) = "D" Then WritePathToReg($icq, $full_path)
If StringInStr($file, $icq) Then
MsgBox(0, "", $path)
Return $path
EndIf
WEnd
FileClose($search)
EndFunc

Angelus
24-08-2007, 14:18
Никто не в курсе почему часть скрипта


$ex = 0
Do
If ProcessExists ( 'iexplore.exe' ) Then
Run ( 'tskill.exe iexplore', 'c:\windows\system32' )
Run ( 'tskill.exe wow', 'c:\windows\system32' )
Sleep (1000)
MsgBox ( 64, 'Сообщение', 'Не пытайтесь запустить EXPLORER, вас только выкинет с игры!!!', 7 )
$ex = $ex + 1
ElseIf Not ProcessExists ( 'wow.exe' ) Then
Exit
EndIf
Until $ex = 1


загружает процессор на 100%????

Maza Faka
24-08-2007, 15:42
Angelus
Попробуй так:

AdlibEnable("Wow")

While 1
Sleep(100)
WEnd

Func Wow()
If ProcessExists ( 'iexplore.exe' ) Then
Run ( 'tskill.exe iexplore', 'c:\windows\system32' )
Run ( 'tskill.exe wow', 'c:\windows\system32' )
Sleep (1000)
MsgBox ( 64, 'Сообщение', 'Не пытайтесь запустить EXPLORER, вас только выкинет с игры!!!', 7 )
ElseIf Not ProcessExists ( 'wow.exe' ) Then
Exit
EndIf
EndFunc




© OSzone.net 2001-2012