|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [архив - Часть 2] AutoIt скрипты |
|
[архив - Часть 2] AutoIt скрипты
|
(*.*) Сообщения: 36570 |
Внимание! Тема переведена в архивное состояние Текущая тема http://forum.oszone.net/thread-98914.html (настоятельно рекомендуется к прочтению/поиску) Руководство к действию по работе c AutoIt. ![]() Сайт программы Русская справка Коллекция AutoIt скриптов от Sanja Alone Коллекция AutoIt скриптов от MSFN (могут быть устаревшие). Справочник по командам rundll32 (команды запуска диалоговых окон и не только...) AutoIt скрипты - введение и FAQ (статья содержит вводную информацию по AutoIt, а также ответы на ЧаВо). Данная тема предназначена для общих вопросов по AutoIt. Вопросы по установке приложений при помощи AutoIt следует задавать в соответствии с правилами форума "Автоматическая установка приложений". Таким образом, если вы хотите узнать как установить Winamp 5.x при помощи AutoIt, то создайте тему [autoit] Winamp 5.х (если таковой еще нет на форуме). Проверить наличие тем можно при помощи поиска или фильтров. Цитата Vadikan:
|
||
------- Отправлено: 00:02, 05-02-2006 |
Must AutoIt Сообщения: 3054
|
Профиль | Сайт | Отправить PM | Цитировать Maza Faka,
Цитата:
Видимо отдаются не все данные сразу, можно их склеивать ![]() $foo = Run(@ComSpec & " /c @dir /b e:\", @SystemDir, @SW_HIDE, 4+2) $line = "" $Errline = "" While 1 $line &= StdoutRead($foo) If @error Then ExitLoop Wend While 1 FileWrite("c:\error.log", $line) $Errline &= StderrRead($foo) If @error Then ExitLoop Wend MsgBox(0, "STDERR read:", $line) MsgBox(0, "STDOUT read:", $Errline) Цитата:
![]() Кстати, у тебя проверяется на папку, но проверять нужно содержится ли буква D в возвращённом значении от FileGetAttrib(), потому как папка может ещё иметь атрибут скрытый и т.п ![]() Angelus, Цитата:
Кстати, вместо Run('tskill...') можно использовать ProcessClose() ![]() |
|||
------- Отправлено: 19:44, 24-08-2007 | #381 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Must AutoIt Сообщения: 3054
|
Профиль | Сайт | Отправить PM | Цитировать Накалякал тут функцию для отображения MsgBox со счётчиком отсчёта + возможностью указывания hWnd (идентификатор окна к которому будет относится сообщение):
_MsgBoxCount(36, "Hello World!", "Hi!", 5, WinGetHandle("")) Func _MsgBoxCount($Flag, $Title, $Text, $Time=0, $hWnd=0, $ButtonIDName='Button1') Run(@AutoItExe & ' /ErrorStdOut /AutoIt3ExecuteLine "DllCall(''user32.dll'', ''int'', ''MessageBox'', ''hwnd'', ' & _ $hWnd & ', ''str'', ''' & $Text & ''', ''str'', ''' & $Title & ''', ''int'', ' & $Flag & '")') Local $OldWTMM = Opt("WinTextMatchMode", 2) If $Time > 0 Then WinWait($Title, $Text) Local $ButtonText = ControlGetText($Title, $Text, $ButtonIDName) For $i = $Time To 1 Step -1 If Not WinExists($Title, $Text) Then ExitLoop ControlSetText($Title, $Text, $ButtonIDName, $ButtonText & ' (' & $i & ')') Sleep(1000) Next EndIf Opt("WinTextMatchMode", $OldWTMM) If WinExists($Title, $Text) Then ControlClick($Title, $Text, $ButtonIDName) EndFunc Пробовал через StdOutRead, но не выходит ![]() $Ret = _MsgBoxCount(36, "Hello World!", "Hi!", 5) MsgBox(0, "", $Ret) Func _MsgBoxCount($Flag, $Title, $Text, $Time=0, $ButtonIDName='Button1') Local $Pid = Run(@AutoItExe & ' /ErrorStdOut /AutoIt3ExecuteLine "StdinWrite(''' & @AutoItPID & ''', MsgBox(' & _ $Flag & ', ''' & $Title & ''', ''' & $Text & ''',' & $Time & '))"', '', '', 6) Local $OldWTMM = Opt("WinTextMatchMode", 2) If $Time > 0 Then WinWait($Title, $Text) Local $ButtonText = ControlGetText($Title, $Text, $ButtonIDName) For $i = $Time To 0 Step -1 If Not WinExists($Title, $Text) Then ExitLoop ControlSetText($Title, $Text, $ButtonIDName, $ButtonText & ' (' & $i & ')') Sleep(1000) Next EndIf Opt("WinTextMatchMode", $OldWTMM) Return StdoutRead($Pid) EndFunc |
------- Отправлено: 00:32, 25-08-2007 | #382 |
Ветеран Сообщения: 604
|
Профиль | Отправить PM | Цитировать Creat0R,
Цитата Creat0R:
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 StringInStr(FileGetAttrib($full_path), "D") Then WritePathToReg($icq, $full_path) If $file = $icq Then MsgBox(0, "", $path) Return $path EndIf WEnd FileClose($search) EndFunc |
|
Отправлено: 09:02, 25-08-2007 | #383 |
Must AutoIt Сообщения: 3054
|
Профиль | Сайт | Отправить PM | Цитировать Maza Faka,
Цитата:
![]() Какого назначение этой функции? сюдя по названию что-то пишет в реестер, но судя по содержанию, рекурсивно ищет определённый файл... ![]() Во-первых у тебя при выходе не закрывается поиск, это уже ошибка. Во-вторых, если ничего не найдено, нужно решить что возвращать, иначе будет 0... и тогда ты сможешь определить ошибку... А в третьих, зачем обьявлять переменную $path в начале скрипта? она ведь используется как параметр в функции, обьявлять в этом случае незачем, имхо. Func WritePathToReg($icq, $path) $search = FileFindFirstFile($path & "\*.*") While 1 $file = FileFindNextFile($search) If @error Then ExitLoop $full_path = $path & "\" & $file If StringInStr(FileGetAttrib($full_path), "D") Then WritePathToReg($icq, $full_path) If $file = $icq Then FileClose($search) Return $path EndIf WEnd FileClose($search) Return -1 EndFunc ![]() |
|
------- Отправлено: 09:36, 25-08-2007 | #384 |
Googler Сообщения: 3665
|
Профиль | Отправить PM | Цитировать Maza Faka
Цитата:
Теперь к вопросу о возвращаемом значении… Во-первых, функция не является рекурсивной, так как нарушено одно из правил рекурсии: возвращаемое функцией значение должно передаваться по всей цепочке рекурсивных вызовов, у тебя же значение, возвращаемое WritePathToReg() вообще игнорируется… из этого имеем два следствия: - дальше первого уровня подкаталогов функция и не пытается заглянуть, если бы файл лежал глубже чем на один уровень функция бы его не нашла; - функция, осуществившая рекурсивный вызов не знает о результате этого вызова… поэтому даже если файл найден (как в твоем случае) на возвращаемое значение это никак не повлияет и результат будет зависеть только от содержимого текущего каталога ($path). один из возможных вариантов, ключевой переменной, передаваемой между рекурсивными вызовами является $sRetPath: MsgBox(64, "Done", _FindFile("icqlite.exe", @ProgramFilesDir)) Func _FindFile($sFile, $sPath) Local $sRetPath='', $sFullPath Local $hSearch = FileFindFirstFile($sPath & "\*.*"), $sName = FileFindNextFile($hSearch) While @error=0 And $sRetPath = '' $sFullPath = $sPath &'\'& $sName If $sName = $sFile Then $sRetPath = $sPath If StringInStr(FileGetAttrib($sFullPath), "D") Then $sRetPath = _FindFile($sFile, $sFullPath) $sName = FileFindNextFile($hSearch) WEnd FileClose($hSearch) Return $sRetPath EndFunc |
|
Отправлено: 10:23, 25-08-2007 | #385 |
Ветеран Сообщения: 604
|
Профиль | Отправить PM | Цитировать amel27
Спасибо! Отличный код! Работает в 3 раза быстрее чем мой корявый код. ![]() |
------- Отправлено: 10:46, 25-08-2007 | #386 |
Googler Сообщения: 3665
|
Профиль | Отправить PM | Цитировать Maza Faka
Всегда пожалуйста ![]() |
Отправлено: 10:55, 25-08-2007 | #387 |
Ветеран Сообщения: 604
|
Профиль | Отправить PM | Цитировать Цитата amel27:
Но ведь переменная $sRetPath заново обьявляется в начале функции: Local $sRetPath='', $sFullPath, какой смысл присваивать ей значение? Ммм...голова уже пухнет, кажется, что начинаю, что-то понимать, но оказывается, что понимаю не так. ![]() |
|
Отправлено: 11:06, 25-08-2007 | #388 |
Googler Сообщения: 3665
|
Профиль | Отправить PM | Цитировать Цитата Maza Faka:
для файлов: просто проверяем условие - если подходит, то присваиваем значение $sRetPath = $sPath; для каталогов: функция _FindFile() сама устанавливает требуемое значение $sRetPath. Может тебе так будет понятней (пожалуй, это будет и правильней): MsgBox(64, "Done", _FindFile("icqlite.exe", @ProgramFilesDir)) Func _FindFile($sFile, $sPath) Local $sRetPath='', $sFullPath Local $hSearch = FileFindFirstFile($sPath &"\*"), $sName = FileFindNextFile($hSearch) While @error=0 And $sRetPath = '' $sFullPath = $sPath &'\'& $sName If StringInStr(FileGetAttrib($sFullPath), "D") Then $sRetPath = _FindFile($sFile, $sFullPath) Else If $sName = $sFile Then $sRetPath = $sPath EndIf $sName = FileFindNextFile($hSearch) WEnd FileClose($hSearch) Return $sRetPath EndFunc Цитата Maza Faka:
![]() |
||
Отправлено: 11:43, 25-08-2007 | #389 |
Must AutoIt Сообщения: 3054
|
Профиль | Сайт | Отправить PM | Цитировать Есть такая нестандартная задачка:
Имеется массив содержащий 6 значимых элементов: Элементы массива, как видно, представляют имена игроков (скажем в настольный теннис ![]() ![]() Результат желательно вывести в качесте подобной таблицы: Цитата:
Global $TotalPlayers = 6 Global $PlayersArray[$TotalPlayers+1] = [$TotalPlayers, "Вася", "Петя", "Паша", "Толик", "Лёня", "Кеша"] $GamesList = '' For $i = 1 To $TotalPlayers $CurrentGameArr = GetRandomGame() While StringInStr($GamesList, $CurrentGameArr[0] & " vs " & $CurrentGameArr[1]) Or _ StringInStr($GamesList, $CurrentGameArr[1] & " vs " & $CurrentGameArr[0]) $CurrentGameArr = GetRandomGame() WEnd $GamesList &= $CurrentGameArr[0] & " vs " & $CurrentGameArr[1] & @LF Next MsgBox(0, "", $GamesList) Func GetRandomGame() Local $Player_1 = $PlayersArray[Random(1, $TotalPlayers, 1)] Local $Player_2 = $PlayersArray[Random(1, $TotalPlayers, 1)] While $Player_2 = $Player_1 $Player_2 = $PlayersArray[Random(1, $TotalPlayers, 1)] WEnd Local $RetArr[2] = [$Player_1, $Player_2] Return $RetArr EndFunc ![]() Если кто то сможет решить задачку, буду очень благодарен, я если честно после трёхчасового просижывания потерял надежду на то что это вообще реально... оч нужно ![]() |
|
------- Отправлено: 13:46, 25-08-2007 | #390 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Открывая 7z архив пишет не удаётся открыть как архив. Можно ли его восстановить? | DreDo | Хочу все знать | 4 | 01-12-2009 18:54 | |
[Архив - Часть 3] AutoIt скрипты .:[общие вопросы]:. | Vadikan | AutoIt | 1543 | 18-01-2009 10:46 | |
[Архив - Часть 1.3] AutoIt скрипты | biork | AutoIt | 503 | 09-06-2007 11:27 | |
[Архив - Часть 1.2] AutoIt скрипты | Dirk Diggler | AutoIt | 505 | 02-12-2006 11:00 | |
[Архив - Часть 1.1] AutoIt скрипты | EgOrus | AutoIt | 335 | 04-02-2006 16:58 |
|