Показать полную графическую версию : [архив - Часть 2] AutoIt скрипты
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
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
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?
А как лучше?
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-файла.
Здравствуйте всем.
Не подскажете, как с помощью 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")
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 ).
Не понял, ты имеешь в виду, что могут быть глюки из-за схожих названий классов? Или что, бы схожие по названию классы классифицировались, как один? Плз обьясни подробней.
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(.*)).
Обновил скрипт который предназначен для вставки 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}...особенно если их много....есть ли более простой способ указывать чек бокс.
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
Никто не в курсе почему часть скрипта
$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
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.