Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Программы » AutoIT (Часть 3)

Модерирует : gyra, Maz

gyra (23-01-2020 10:51): AutoIT (Часть 4)  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200

   

Widok



Moderator-Следопыт
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

 
Описание:

Цитата:
AutoIt v3 - это язык для написания сценариев, напоминающий BASIC. Основным его назначением является автоматизация работ с Windows GUI (графическим интерфейсом пользователя MS Windows). Для выполнения этой сложной задачи предоставляется комбинация испытанных методов, включающих в себя эмуляцию нажатий комбинаций клавиш клавиатуры, перемещения указателя мыши, управление окнами и их визуальными элементами. Как показывает практика, эти "приводные ремни" весьма эффективны для получения работающих решений в ситуациях, когда другие стандартные средства (например, VBScript и SendKeys) оказываются бессильны.
Умеет он очень и очень многое! Бесплатный.

 
  • Справки
  • Инструменты
  • Ресурсы, посвящённые AutoIt
  • Полезные советы новичкам и не только
  • Готовые решения
  • Скрипт раскраски кода AutoIt для публикации в форумах
     


     
    За шапкой следит ViSiToR / AZJIO  

  • Всего записей: 24190 | Зарегистр. 07-04-2002 | Отправлено: 13:07 01-06-2010 | Исправлено: Maz, 12:29 10-01-2020
    madmasles

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    SLIDER999

    Цитата:
    Я так и понял, что это именно UDF стало причиной.
    Задайте вопрос автору на офф. форуме, если знаете английский.

    Всего записей: 1277 | Зарегистр. 25-09-2008 | Отправлено: 09:42 03-02-2015
    SLIDER999

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Скажите, как можно мониторить установку флеш карты?
    Пока использую цикл с функцией:

    Код:
    Func _FindDrive()
       $letterDrive = DriveGetDrive('REMOVABLE')
       If NOT @error Then
          For $i = 1 to $letterDrive[0]
             $sStatus = DriveStatus($letterDrive[$i] & '\')
             If $sStatus = 'READY' Then
                Global $bortdrive = $letterDrive[$i]
                $aFiles = _FileListToArray($letterDrive[$i] & '\', '*', 1)
                If IsArray($aFiles) Then
                   For $j = 1 to $aFiles[0]
                      $files = StringRegExp($aFiles[$j], '\d+\.dat$')
                      If $files = 1 Then
                         Global $bort = 1
                         DriveSetLabel($bortdrive & '\', 'SD Card')
                      Endif
                   Next
                Else
                   Global $bort = 0
                EndIf
             Endif
          Next
       EndIf
    EndFunc

     
    Хочу уйти от цикла и срабатывать по событию. wm_devicechange работает только с usb, а мне нужно и usb и карты памяти. Была идея отслеживать появление окна виндового, но эта функция включена далеко не везде.

    Всего записей: 261 | Зарегистр. 16-03-2005 | Отправлено: 13:14 06-02-2015 | Исправлено: SLIDER999, 13:17 06-02-2015
    madmasles

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    SLIDER999,
    Посмотрите здесь: Определение flash-карты в картридере.
     
    Проверил, срабатывает и на флешку, и на flash-карту, но только, если наше окно активно и включен автозапуск.

    Всего записей: 1277 | Зарегистр. 25-09-2008 | Отправлено: 12:27 08-02-2015 | Исправлено: madmasles, 13:59 08-02-2015
    AZJIO



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    В Text Correction сделал раскрытие аббревиатур. Смотрите Replace.ini. Можно имена функций по русски писать, а потом преобразовывать в английский,так быстрее. Хотя нужно создать список русских вариантов.

    Всего записей: 4413 | Зарегистр. 03-05-2006 | Отправлено: 15:59 10-02-2015
    jekov



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Посоветуйте,пожалуйста,что не так в коде моего Gui . Выбранная картинка в Gui Preview подергивается ? Спасибо

    Всего записей: 1272 | Зарегистр. 11-09-2005 | Отправлено: 09:02 12-02-2015 | Исправлено: jekov, 09:03 12-02-2015
    madmasles

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    jekov
    Цитата:
    что не так в  коде моего Gui  . Выбранная картинка в Gui Preview подергивается
    Вы в бесконечном цикле создаете примерно 100 элементов-картинок в секунду, так делать нельзя. Создайте элемент $Pic1 один раз и меняйте в нем картинку (функция GUICtrlSetImage()) только при изменении в поле $idFile2.  
    Изменения можно отследить с помощью GUIRegisterMsg($WM_COMMAND, "WM_COMMAND"). Смотрите пример к функции _GUICtrlEdit_Create() (код $EN_UPDATE).
     
     

    Всего записей: 1277 | Зарегистр. 25-09-2008 | Отправлено: 11:29 12-02-2015 | Исправлено: madmasles, 11:29 12-02-2015
    SLIDER999

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Не могу разобраться...
    У меня в папке есть файлы вида "ЦИФРЫ_upload.log". В каждом файле есть строки: "блаблабла (Версия: ЗДЕСЬ_ВЕРСИЯ)"
     
    Как мне вывести список из последней найденной версии каждого файла?

    Всего записей: 261 | Зарегистр. 16-03-2005 | Отправлено: 13:11 13-02-2015
    madmasles

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    SLIDER999
    Цитата:
    Как мне вывести список из последней найденной версии каждого файла?
    Если я Вас правильно понял, то можно примерно так.
    Код:
    #include <Array.au3>
     
    Local $sDir = @ScriptDir & '\upload_log', $hSearch, $sFile, $aTxt, $iUb, $vRet
     
    If @WorkingDir <> $sDir Then FileChangeDir($sDir)
    $hSearch = FileFindFirstFile('*_upload.log')
    If $hSearch = -1 Then Exit 1
    Do
        $sFile = FileFindNextFile($hSearch)
        If @error Then ExitLoop
        If @extended Then ContinueLoop
        $aTxt = StringRegExp(FileRead($sFile), '\(Версия:\h*(.+)\)', 3)
        $iUb = UBound($aTxt)
        If Not $iUb Then ContinueLoop
        $vRet &= $aTxt[$iUb - 1] & '|'
    Until 0
    FileClose($hSearch)
    If $vRet Then
        $vRet = StringSplit(StringTrimRight($vRet, 1), '|')
        _ArrayDisplay($vRet)
    Else
        ConsoleWrite('Error' & @LF)
        Exit 2
    EndIf
    Или так.
    Код:
    #include <Array.au3>
     
    Local $sDir = @ScriptDir & '\upload_log', $hSearch, $sFile, $vRet
     
    If @WorkingDir <> $sDir Then FileChangeDir($sDir)
    $hSearch = FileFindFirstFile('*_upload.log')
    If $hSearch = -1 Then Exit 1
    Do
        $sFile = FileFindNextFile($hSearch)
        If @error Then ExitLoop
        If @extended Then ContinueLoop
        $sFile = StringRegExpReplace(FileRead($sFile), '(?s).*\(Версия:\h*(.+)\).*', '$1')
        If @extended <> 1 Then ContinueLoop
        $vRet &= $sFile & '|'
    Until 0
    FileClose($hSearch)
    If $vRet Then
        $vRet = StringSplit(StringTrimRight($vRet, 1), '|')
        _ArrayDisplay($vRet)
    Else
        ConsoleWrite('Error' & @LF)
        Exit 2
    EndIf


    Всего записей: 1277 | Зарегистр. 25-09-2008 | Отправлено: 20:47 13-02-2015 | Исправлено: madmasles, 20:53 13-02-2015
    SLIDER999

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    madmasles
    Благодарю!! Очередной раз. Направление понял, дальше под себя сделаю.

    Всего записей: 261 | Зарегистр. 16-03-2005 | Отправлено: 14:05 14-02-2015
    thejustsoul



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Подскажите, как решить задачу, не могу догадаться.  
    В общем есть форма, одно поле и условно 1 кнопка, нужна проверка ввода (если пустое поле - msgbox, если заданное значение тоже msgbox с уведомлением об ошибке).
    После нажатия на кнопку запускается проверка ввода. Затем если все ок, запускается некий процесс с нужными параметрами (передается из поля).
    Но нужна еще одна проверка на запущенный процесс (если процесс уже запущен (существует) то сообщение об ошибке - типа уже запущено, ждите). Как только процесс завершит свою работу, то вывести сообщение "готово".
     
    Пока получилось так, только вот если процесс запущен, то нажатие на кнопку не выводит сообщение об уже запущенной программе, а "копит в себе", потом после закрытия запускает еще раз (сколько раз нажали)...

    Код:
    Func Download()
     
        If (GUICtrlRead($Input1) = "") Or (GUICtrlRead($Input1) = "Вставьте ссылку..") Then
            MsgBox(0, "Ошибка!", "Не указана ссылка для скачивания." & @CRLF & @CRLF & "Пример ссылки:" & @CRLF & "https://www.site.com/")
        Else
            ;If ProcessExists("notepad.exe") = 0 Then
            If Not ProcessExists("notepad.exe") Then
                Run("notepad.exe")
                While ProcessExists("notepad.exe") <> 0
                    Sleep(100)
                    ;MsgBox(0, "", " Скачивание завершено.")
                WEnd
                MsgBox(0, "", "Скачивание завершено.")
            Else
                MsgBox(0, "", "Скачивание уже идет, дождитесь его завершения.")
            EndIf
        EndIf
    EndFunc   ;==>Download

    Всего записей: 1789 | Зарегистр. 30-03-2014 | Отправлено: 13:29 15-02-2015
    NIKZZZZ



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    thejustsoul

    Цитата:
     а "копит в себе"

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

    Код:
    Func Download()
    GUICtrlSetState($кнопка,$GUI_DISABLE)
    ....
    GUICtrlSetState($кнопка,$GUI_ENABLE)
    EndFunc   ;==>Download

     
    Добавлено:
    И еще, желательно дождаться, пока процесс будет запущен

    Код:
    Run("notepad.exe")
    ProcessWait("notepad.exe")
    While ProcessExists("notepad.exe") <> 0
     


    Всего записей: 5365 | Зарегистр. 08-02-2006 | Отправлено: 13:57 15-02-2015
    madmasles

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    NIKZZZZ
    Цитата:
    И еще, желательно дождаться, пока процесс будет запущен
    ИМХО, так корректнее:
    Код:
    $iPID = Run('notepad.exe')
    If Not $iPID Then Exit ConsoleWrite('Error Run' & @LF)
    While ProcessExists($iPID)
        Sleep(100)
    WEnd


    Всего записей: 1277 | Зарегистр. 25-09-2008 | Отправлено: 14:34 15-02-2015 | Исправлено: madmasles, 14:36 15-02-2015
    NIKZZZZ



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    madmasles
    Run() не ждет, пока процесс будет запущен, проверка "If Not $iPID" гарантирует все-го лишь что сама попытка запуска прошла удачно.
    наиболее корректно, тогда уж
     

    Код:
    $iPID = Run('notepad.exe')
    If Not $iPID Then Exit ConsoleWrite('Error Run' & @LF)*0 + 1
    ProcessWait($iPID)
    ProcessWaitClose($iPID)

    Всего записей: 5365 | Зарегистр. 08-02-2006 | Отправлено: 16:37 15-02-2015 | Исправлено: NIKZZZZ, 16:44 15-02-2015
    madmasles

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    NIKZZZZ,
    Согласен, только я бы таймаут ожидания добавил.

    Всего записей: 1277 | Зарегистр. 25-09-2008 | Отправлено: 17:00 15-02-2015 | Исправлено: madmasles, 06:53 16-02-2015
    thejustsoul



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    NIKZZZZ
    Вариант с отключением кнопки хороший.

    Цитата:
    наиболее корректно, тогда уж  

    Это куда дописать или вместо чего? Так?
     
    вариант 1

    Код:
    Func Download3()
        GUICtrlSetState($Button1, $GUI_DISABLE)
        If (GUICtrlRead($Input1) = "") Or (GUICtrlRead($Input1) = "Вставьте сюда ссылку...") Then
            MsgBox(0, "Ошибка!", "Не указана ссылка для скачивания." & @CRLF & @CRLF & "Пример ссылки:" & @CRLF & "https://")
        Else
            $iPID = Run('notepad.exe')
            ;If Not $iPID Then Exit ConsoleWrite('Error Run' & @LF) * 0 + 1
            If Not $iPID Then Exit MsgBox(0, "", "Скачивание уже идет, дождитесь его завершения.") * 0 + 1
            ProcessWait($iPID)
            ProcessWaitClose($iPID)
            MsgBox(0, "", "Скачивание завершено.")
        EndIf
        GUICtrlSetState($Button1, $GUI_ENABLE)
    EndFunc   ;==>Download3
     
    вариант 2
    Func Download4()
        GUICtrlSetState($Button1, $GUI_DISABLE)
        If (GUICtrlRead($Input1) = "") Or (GUICtrlRead($Input1) = "Вставьте сюда ссылку...") Then
            MsgBox(0, "Ошибка!", "Не указана ссылка для скачивания." & @CRLF & @CRLF & "Пример ссылки:" & @CRLF & "https://")
        Else
            $iPID = Run('notepad.exe')
            If Not $iPID Then Exit ConsoleWrite('Error Run' & @LF) * 0 + 1
            ;If Not $iPID Then Exit MsgBox(0, "", "Скачивание уже идет, дождитесь его завершения.") * 0 + 1
            ProcessWait($iPID)
            ProcessWaitClose($iPID)
            MsgBox(0, "", "Скачивание завершено.")
        EndIf
        GUICtrlSetState($Button1, $GUI_ENABLE)
    EndFunc   ;==>Download4

     
    --
    Then Exit ConsoleWrite('Error Run' & @LF) * 0 + 1
    Что это и  * 0 + 1 значит?  
    И какой вариант правильный будет?
     
     
     
    Добавлено:
    И еще как добавить туда обработку, если notepad.exe не существует и/или его не удалось запустить с выводом сообщения об ошибке (msgbox) и без вывода сообщения о завершении "скачивания"?

    Всего записей: 1789 | Зарегистр. 30-03-2014 | Отправлено: 21:57 15-02-2015
    dialmak



    BANNED
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Может кто знает... Есть ли готовый шаблончик под wizard?

    Всего записей: 14007 | Зарегистр. 27-04-2013 | Отправлено: 01:48 16-02-2015
    NIKZZZZ



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    thejustsoul

    Цитата:
    Что это и  * 0 + 1 значит?  

    Это выражение, имеющее значение 1, будет возвращено в errorlevel.

    Код:
     
    $iPID = Run('notepad.exe')
    If Not $iPID Then
       MsgBox(0, "", "notepad.exe не существует и/или его не удалось запустить")
      return
    endif
    ProcessWait($iPID)
    .....

     

    Всего записей: 5365 | Зарегистр. 08-02-2006 | Отправлено: 02:37 16-02-2015
    madmasles

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    NIKZZZZ,
    По поводу функции Run().
     
    Я на 99,9% уверен, что Run() создает процесс API функцией CreateProcess, которая, при удачном выполнении, возвращает PID создаваемого процесса в структуре PROCESS_INFORMATION structure, то есть, если Run() вернула корректный результат, то процесс уже существует, ИМХО.

    Всего записей: 1277 | Зарегистр. 25-09-2008 | Отправлено: 07:00 16-02-2015 | Исправлено: madmasles, 07:02 16-02-2015
    Skif_off

    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Подскажите, пожалуйста, не получилось найти: где-то попадалась дискуссия на тему запуска с помощью Run() программ, требующих повышения прав - не всегда срабатывало (тупо не запускалось), для работы требовалось добавить #RequireAdmin, а вот почему - не помню.

    Всего записей: 6489 | Зарегистр. 28-01-2008 | Отправлено: 07:55 16-02-2015
    NIKZZZZ



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    madmasles

    Цитата:
    если Run() вернула корректный результат, то процесс уже существует

    Я не совсем корректно выразился, иногда связка
     
    Код:
    $iPID = Run('notepad.exe')
     ProcessWaitClose($iPID)

    некорректно работает, либо нужен между ними sleep() , либо ProcessWait() для надежности.  

    Всего записей: 5365 | Зарегистр. 08-02-2006 | Отправлено: 12:06 16-02-2015
       

    Страницы: 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 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200

    Компьютерный форум Ru.Board » Компьютеры » Программы » AutoIT (Часть 3)
    gyra (23-01-2020 10:51): AutoIT (Часть 4)


    Реклама на форуме Ru.Board.

    Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
    Modified by Ru.B0ard
    © Ru.B0ard 2000-2024

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru