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

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

Закрытая тема
Настройки темы
[архив - Часть 2] AutoIt скрипты

(*.*)


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


Конфигурация

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


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







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


Руководство к действию по работе c AutoIt.


Сайт программы
Русская справка
Коллекция AutoIt скриптов от Sanja Alone
Коллекция AutoIt скриптов от MSFN (могут быть устаревшие).
Справочник по командам rundll32 (команды запуска диалоговых окон и не только...)

AutoIt скрипты - введение и FAQ (статья содержит вводную информацию по AutoIt, а также ответы на ЧаВо).



Данная тема предназначена для общих вопросов по AutoIt. Вопросы по установке приложений при помощи AutoIt следует задавать в соответствии с правилами форума "Автоматическая установка приложений". Таким образом, если вы хотите узнать как установить Winamp 5.x при помощи AutoIt, то создайте тему [autoit] Winamp 5.х (если таковой еще нет на форуме). Проверить наличие тем можно при помощи поиска или фильтров.
Цитата Vadikan:
В теме уже свыше 500 сообщений и поиск нужной информации в ней усложняется. Есть предложение собрать все решения (скрипты) и разместить их на Wiki по принципу "один скрипт - одна статья wiki", добавляя статьи в категорию Autoit. Речь, в принципе, идет об общих решениях, а не о скриптах для установки конкретной программы. Название статьи, очевидно, должно отражать назначение скрипта. Затем можно в шапке просто разместить ссылки на статьи Wiki.

-------
Канал Windows 11, etc | Чат @winsiders

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

Отправлено: 00:02, 05-02-2006

 

Аватара для Creat0R

Must AutoIt


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

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


Maza Faka,
Цитата:
сначала отображается один файл, а затем все остальные, кроме файла, который отобразился в первый раз, почему так происходит?
Через StdOutRead можно читать данные те что доступны в момент выполнения (ком. строки).
Видимо отдаются не все данные сразу, можно их склеивать

Код: Выделить весь код
$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)
Цитата:
Почему функция возвращает ноль?
По умолчанию функция так и возвращает если не задано значение по Return, видимо у тебя в функции дело не доходит до Return - MsgBox показывается перед выходом с функции?
Кстати, у тебя проверяется на папку, но проверять нужно содержится ли буква D в возвращённом значении от FileGetAttrib(), потому как папка может ещё иметь атрибут скрытый и т.п


Angelus,
Цитата:
загружает процессор на 100%????
Если нет процесса iexplore.exe и существует процесс wow.exe, то цикл продолжает без паузы, для предотвращения загрузкий ЦП нужна пауза хотябы в 10 мс.
Кстати, вместо Run('tskill...') можно использовать ProcessClose()

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

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

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

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

Отправлено: 19:44, 24-08-2007 | #381



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

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


Аватара для Creat0R

Must AutoIt


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

Профиль | Сайт | Отправить 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, но не выходит - Пример попытки через обычный MsgBox():

Код: Выделить весь код
$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
Пробовал по разному использовать StdOutRad, StdinWrite, но так ничего и не вышло...

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

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

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


Отправлено: 00:32, 25-08-2007 | #382


Аватара для Maza Faka

Ветеран


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

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


Creat0R,
Цитата Creat0R:
По умолчанию функция так и возвращает если не задано значение по Return, видимо у тебя в функции дело не доходит до Return - MsgBox показывается перед выходом с функции?
Да, MsgBox показывается с путём C:\Program Files\IsqLite, но скрипт не завершает работу, а пару секунд, чего то там делает, и возвращает ноль. Такое ощущение, что после появления MsgBox скрипт продолжает работу.

Код: Выделить весь код
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


Аватара для Creat0R

Must AutoIt


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

Профиль | Сайт | Отправить 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
После этого, я сразу вижу что функция ВСЕГДА возвращает значение -1, потому как цикл заканчивается (после рекурсива). Но я если честно даже не знаю что она на самом деле должна возвращать, все пути где найден файл, или что? или может писать в реестер каждый путь? - Тогда зачем возвращать значения путей?

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

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

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


Отправлено: 09:36, 25-08-2007 | #384


Googler


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

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


Maza Faka
Цитата:
Почему функция возвращает ноль?
Кроме ошибки с атрибутами, на которую указал Creat0R у тебя в скрипте есть еще ряд мелких ошибок: используемые в функции переменные не объявлены как Local; выход из функции по Return происходит без закрытия хэндла FileClose().

Теперь к вопросу о возвращаемом значении… Во-первых, функция не является рекурсивной, так как нарушено одно из правил рекурсии: возвращаемое функцией значение должно передаваться по всей цепочке рекурсивных вызовов, у тебя же значение, возвращаемое 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


Аватара для Maza Faka

Ветеран


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

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


amel27
Спасибо! Отличный код! Работает в 3 раза быстрее чем мой корявый код.

-------
Сообщение помогло? Не забудьте нажать на Полезное сообщение


Отправлено: 10:46, 25-08-2007 | #386


Googler


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

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


Maza Faka
Всегда пожалуйста ИМХО единственный случай, когда оправдано применение глобальных данных в рекурсии это массивы, во всех остальных случаях можно обойтись правильным выбором передаваемого значения.... И еще важное замечание - если в функции используются глобальные переменные их нужно обязательно объявлять в параметрах через ByRef, иначе потом легко забыть и запутаться.
Это сообщение посчитали полезным следующие участники:

Отправлено: 10:55, 25-08-2007 | #387


Аватара для Maza Faka

Ветеран


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

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


Цитата amel27:
ключевой переменной, передаваемой между рекурсивными вызовами является $sRetPath:
If StringInStr(FileGetAttrib($sFullPath), "D") Then $sRetPath = _FindFile($sFile, $sFullPath)
Но ведь переменная $sRetPath заново обьявляется в начале функции:
Local $sRetPath='', $sFullPath, какой смысл присваивать ей значение?

Ммм...голова уже пухнет, кажется, что начинаю, что-то понимать, но оказывается, что понимаю не так.

Отправлено: 11:06, 25-08-2007 | #388


Googler


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

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


Цитата Maza Faka:
какой смысл присваивать ей значение?
Что возвращает функция _FindFile() ?... либо "пусто" (файл в каталоге не найден), либо путь к каталогу с файлом, поэтому: при входе в функцию $sRetPath "пусто", далее устанавливаем его значение для каждого элемента каталога:

для файлов: просто проверяем условие - если подходит, то присваиваем значение $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


Аватара для Creat0R

Must AutoIt


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

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


Есть такая нестандартная задачка:

Имеется массив содержащий 6 значимых элементов:

Код: Выделить весь код
Global $PlayersArray[7] = [6, "Вася", "Петя", "Паша", "Толик", "Лёня", "Кеша"]
Элементы массива, как видно, представляют имена игроков (скажем в настольный теннис ), нужно чтобы каждый игрок, поиграл со всеми остальными пятью игроками, но таким образом, чтобы все игроки ждали одинаковое количество игр между своими встречами, и при этом чтобы не получилось такого что один игрок играет более одной игры подряд ...

Результат желательно вывести в качесте подобной таблицы:

Цитата:
Вася vs Паша
Лёня vs Петя
Толик vs Кеша

И т.д.
Пытался решить циклами типа такого:

Код: Выделить весь код
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
Но как видно результат не впечатляющий
Если кто то сможет решить задачку, буду очень благодарен, я если честно после трёхчасового просижывания потерял надежду на то что это вообще реально... оч нужно ..

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

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

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


Отправлено: 13:46, 25-08-2007 | #390



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Открывая 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




 
Переход