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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в 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
    AZJIO



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

    Цитата:
    Какие ограничения есть у Search duplicates?
    Ни каких ограничений не должно быть. Проверю. Я 150 000 файлов сканировал, а люди 300 000 вроде, глюков не было (точнее просто тест поиска файлов). Но там был просто список файлов, а тут 6-ти колоночный массив, в котором есть MD5 и размер. Кроме того массив 1 раз дублируется, то есть создаётся его копия. Можно во время работы посмотреть занимаемую процессом память. MD5 извлекаются с помощью виндовых библиотек, а значит порциями читается файл, тут не должно быть проблем.
     

    Цитата:
    на этапе Создание списка дубликатов MD5 и сортировка  
    Теоритически 43 000 это 7-я часть от 300 000, даже если продублировать массив в функциях, вроде не должен был вызвать проблему. Первый раз я столкнулся с такой мессагой в TextReplace, когда открывались файлы более 180 Мб, они к тому же за счёт UTF16 занимали 2-х кратный размер и ещё 2-кратно больше занимали память потому что нужно выделить память для приёмника, куда переписывался изменяемая часть, поэтому я выставил ограничение на размер. И то эта проблема была на WinXP, а Win7 обрабатывал без проблем. И для бинарного режима позволяет в 2 раза больше размер обработать - 400 Мб. А со списком файлов пока не понимаю.
     
    Сейчас потестил на 16 Гб, 162 000 файлов 53 000 добавлено, из них отмечено 33 000, время 1236 сек (20 мин). Процесс в памяти занимает 64 Мб. Что удивило, что полоса прогресса дошла до конца, а он ещё столько же времени молотил, хотя не должно быть так, потому что я получаю общий размер файлов, чтобы из него вычислять полосу прогресса. У меня была идея сделать на каждые например 15 Мб запись текущего файла в строку состояния. Когдя я делал для всех файлов, это тормозило в 2 раза общую продолжительность поиска, но без статистики тоже плохо.

    Всего записей: 4407 | Зарегистр. 03-05-2006 | Отправлено: 04:22 08-08-2013 | Исправлено: AZJIO, 05:20 08-08-2013
    Skif_off

    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    AZJIO
    Не знаю, поможет ли: WinPE на основе WinXP, свободно 2 Гб ОЗУ, ЕМНИП - процесс занимал в памяти 34-36 Мб (по диспетчеру задач). Вероятно, это частный редкий случай?

    Всего записей: 6462 | Зарегистр. 28-01-2008 | Отправлено: 17:02 08-08-2013 | Исправлено: Skif_off, 17:03 08-08-2013
    AZJIO



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Skif_off
    На сильно урезанных WinPE некоторые мои программы не работают.

    Всего записей: 4407 | Зарегистр. 03-05-2006 | Отправлено: 14:31 09-08-2013
    Skif_off

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

    Цитата:
    На сильно урезанных WinPE некоторые мои программы не работают.

    Нет идей, с чем это может быть связано? Смотрел в Fileinfo (плагин для ТС) - вроде все зависимости удовлетворены, добавил двухгиговый файл подкачки - та же фигня. Выбрал папку с ~10 тыс файлов общим весом 3,5 Гб - все равно ошибка.

    Всего записей: 6462 | Зарегистр. 28-01-2008 | Отправлено: 15:22 09-08-2013
    AZJIO



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Skif_off
    1. Проверь какой самый большой файл в папке. Может ли из-за не го сбой.
    2. Проверь туже папку на стационарной системе.
    Судя по сообщению список хэш-сум уже получен и данные направляются в функции выявления дубликатов, которая использует Assing. Может этот нестандартный способ вызывает проблему на архитектуре атлона и попробовать объект Scripting.Dictionary? Отпиши результат не в WinPE, чтобы исключить проблему урезанной системы.

    Всего записей: 4407 | Зарегистр. 03-05-2006 | Отправлено: 17:56 09-08-2013
    Skif_off

    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    AZJIO
    1. Самый большой файл - 157 Мб, всего два десятка файлов больше 30 Мб.
    2. На нормальной системе все нормально, при этом в WinPE на основе Win7 тоже все нормально.
    Покопался с Process Hacker, получился вот такой результат, по порядку: WinPE, WinPE+2 Gb pagefile, WinPE3, WinXP SP3, старался поймать момент перед появлением ошибки, там где нет ошибок - приблизительно на том же этапе.
    Вот это может быть полезно: версия v0.5.1 вываливается с ошибкой
    Line 1721 (File "...\Search_duplicates.exe"):
    Error: Subscript used with non-Array variable.

    Хотел посмотреть строку (любопытство, вряд ли разобрался бы), пропустил через Obfuscator - 12 ошибок при компиляции, AutoIT v3.3.8.1 (не знаю, как переделать скрипты 3.3.6.1->3.3.8.1).
     
    За Scripting.Dictionary не скажу, с массивами практически не знаком, нагуглил такое мнение.
     
    В принципе, условия ошибки достаточно специфичны, поэтому если нет времени/желания разобраться - не настаиваю

    Всего записей: 6462 | Зарегистр. 28-01-2008 | Отправлено: 20:26 09-08-2013
    AZJIO



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

    Цитата:
    Хотел посмотреть строку (любопытство, вряд ли разобрался бы), пропустил через Obfuscator - 12 ошибок при компиляции, AutoIT v3.3.8.1 (не знаю, как переделать скрипты 3.3.6.1->3.3.8.1).
    Теоретически на 3.3.8.1 тоже должен работать, так как изменений нет конфликтных. На счёт ошибок - обфускатору ненравится Assign, Eval , а там на них построено штук 6 функций. И к тому же пока не пользуюсь Au3Check.exe, который найдёт всё что надо и всё что не надо. Ошибку "Subscript used with non-Array variable" всё равно не найдёшь методом номера строки, она просто покажет цикл, где произошла оверзапись, а источник раньше. Но на моём компе за несколько лет сколько я пользовался программой ни разу не было ошибки. Кстати там была копия с меткой " (Group)", я удалил эту копию. Сначала мне казалось что может кому то приятнее будет этот стиль, а потом после нахождения исправления ошибок в версии 0.6 я решил удалить копию с пометкой " (Group)", потому что она не проверена годами. Если она выдала ошибку, удали её совсем. Вот этот Search_duplicates (Group).exe - удали и не тестируй, в новом архиве от 01.08.2013 её уже нет.

    Цитата:
    За Scripting.Dictionary не скажу, с массивами практически не знаком, нагуглил такое мнение.  
    я могу сказать, вот описание составленное мной, вот Compare strings успешно работает на этом алгоритме.

    Цитата:
    В принципе, условия ошибки достаточно специфичны, поэтому если нет времени/желания разобраться - не настаиваю
    по идее моя инициатива чтобы разобраться, но не ломать свой мозг ради того чтобы заставить её работать на урезанной WinPE. То есть только нормальная ось в приоритете и только версия 0.6.3. Старую версию 0.5.1 я точно обновлять не буду (чтобы сделать из неё опять версию 0.6?). Движок в принципе практически тот же, просто добавлена колонка приоритетов, которая определяет приоритет удаления.
     

    Цитата:
    Самый большой файл - 157 Мб
    при всех вариантах с 2 Гб это не является проблемой. В новой версии задействован элемент "список изображений" и листвью управляется через UDF. Раньше я не добавлял их потому что процесс в диспетчере задач подскакивал с 8 Мб до 17 Мб. Но ради удобства в новой версии добавлено. Но опять же когда идет построение списка в строке состояния уже другая запись. Там где ошибка смотри в исходнике старой версии функцию _ArrayDublMD5 только она работает между этими записями в строке состояния. То есть либо пробовать "Scripting.Dictionary" либо пожелать тебе использовать программу в нормальной Windows

    Всего записей: 4407 | Зарегистр. 03-05-2006 | Отправлено: 21:41 09-08-2013 | Исправлено: AZJIO, 21:42 09-08-2013
    Skif_off

    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    AZJIO
    Я решил, что спотыкается здесь

    Код:
    Func _ArrayDublLines($data)
        Local $k, $i
        Assign('/', -1000000, 1)
        $k = 1
        For $i = 1 To $data[0]
            Assign($data[$i] & '/', Eval($data[$i] & '/') + 1, 1)
            If Eval($data[$i] & '/') = 1 Then
                $data[$k] = $data[$i]
                $k += 1
            EndIf
        Next
        If $k = 1 Then Return SetError(1, 0, 0)
        ReDim $data[$k]
        $data[0] = $k - 1
        Return $data
    EndFunc   ;==>_ArrayDublLines

    но в RusLive, например, работает, из бросающихся в глаза отличий - собрано в WinBuilder с SP3. Т.о. условия еще уже, в исходник лезть не буду, покопаюсь в сбоке еще немного

    Всего записей: 6462 | Зарегистр. 28-01-2008 | Отправлено: 02:23 10-08-2013
    AZJIO



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

    Цитата:
    Я решил, что спотыкается здесь
    Можно проверить что ваше решение ошибочно

    Код:
    #include <Array.au3>
    Local $avArray[10]
     
    $avArray[0] = 9
    $avArray[1] = "Holger"
    $avArray[2] = "Jon"
    $avArray[3] = "Larry"
    $avArray[4] = "Jeremy"
    $avArray[5] = "Valik"
    $avArray[6] = "Jon"
    $avArray[7] = "Nutster"
    $avArray[8] = "Jon"
    $avArray[9] = "Holger"
     
    $avArray = _ArrayDublLines($avArray)
    _ArrayDisplay($avArray)
     
    Func _ArrayDublLines($data)  
        Local $k, $i  
        Assign('/', -1000000, 1)  
        $k = 1  
        For $i = 1 To $data[0]  
            Assign($data[$i] & '/', Eval($data[$i] & '/') + 1, 1)  
            If Eval($data[$i] & '/') = 1 Then  
                $data[$k] = $data[$i]  
                $k += 1  
            EndIf  
        Next  
        If
    $k = 1 Then Return SetError(1, 0, 0)  
        ReDim $data[$k]  
        $data[0] = $k - 1  
        Return $data  
    EndFunc   ;==>_ArrayDublLines

    Функция работает отлично. Хотя в новой версии эта функция выглядит уже так

    Код:
    #include <Array.au3>
    Local $avArray[10]
     
    $avArray[0] = 9
    $avArray[1] = "Holger"
    $avArray[2] = "Jon"
    $avArray[3] = "Larry"
    $avArray[4] = "Jeremy"
    $avArray[5] = "Valik"
    $avArray[6] = "Jon"
    $avArray[7] = "Nutster"
    $avArray[8] = "Jon"
    $avArray[9] = "Holger"
     
    _ArrayDublLines($avArray)
    _ArrayDisplay($avArray)
     
    Func _ArrayDublLines(ByRef $data)
        Local $k, $i
        Assign('/', -1000000, 1)
        $k = 0
        For $i = 1 To $data[0]
            If Not IsDeclared($data[$i] & '/') Then
                $k += 1
                $data[$k] = $data[$i]
                Assign($data[$i] & '/', '', 1)
            EndIf
        Next
        If
    $k = 0 Then
            ReDim
    $data[1]
            $data[0] = 0
            Return SetError(1, 0, 0)
        EndIf
        ReDim
    $data[$k + 1]
        $data[0] = $k
        Return SetError(0, 0, $k)
    EndFunc   ;==>_ArrayDublLines

    Всего записей: 4407 | Зарегистр. 03-05-2006 | Отправлено: 13:49 10-08-2013
    Skif_off

    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    AZJIO
    Таки вычислил, в чем дело, не знаю, какая связь, но с добавлением службы Cryptographic Services все заработало.

    Всего записей: 6462 | Зарегистр. 28-01-2008 | Отправлено: 16:55 10-08-2013
    araneon



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Ребят подскажите можно ли средствами AutoIT решить такую проблему.
    Необходимо узнать сетевые настройки компа которые он получает по DHCP (IP адрес, маску, DNS (основной и альтернативный)) и затем записать эти данные в настройки сетевой карты, то есть сделать статическими.

    Всего записей: 156 | Зарегистр. 18-07-2008 | Отправлено: 12:56 14-08-2013
    AhrimanSefid



    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Hello.
    I want to do more of:
    1. The login code that only a 4 digit number, for example: (1234)
    2. The data stored in the database page after login.
     
    I know I can not do but so much.
    Thank you for helping me and I can provide sample code.

    Всего записей: 10 | Зарегистр. 21-10-2012 | Отправлено: 12:35 19-08-2013
    AZJIO



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    AhrimanSefid
    Why do not you ask the question in English forum?

    Всего записей: 4407 | Зарегистр. 03-05-2006 | Отправлено: 13:00 19-08-2013
    YURETS777



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Нужен AutoIT скрипт для скрытия / показа указателя курсора мыши в Windows 8
    DllCall('User32.dll', 'int', 'ShowCursor', 'int', 0) не работает.

    Всего записей: 2161 | Зарегистр. 29-04-2005 | Отправлено: 00:12 20-08-2013
    winkot



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Необходимо одновременно следить и управлять двумя окнами. Конечно. можно для каждого из них написать и скомпилировать скрипты. Но в этом случае придется ставить в автозагрузку два файла. А если контролируемых окон будет еще больше, то, соответсвенно и файлов будет много. Этого не хотелось бы. Попробовал написать эти две задачи в одном цикле while 1. Но вторая задача не выполняется. Подскажите, как можно объдинить эти две задачи в одну.
    Вот мой пример:

    Код:
    While 1
       Opt("WinDetectHiddenText", 1)
       Opt("WinTitleMatchMode", 2)
    If WinWait("Окно 1", "") Then
       WinSetState("Окно 1", "", @SW_HIDE)
          If WinWait("Окно 1", "Загрузка завершена") Then
             ControlSend("Окно 1", "", "", "{ENTER}")
          EndIf
    EndIf
    If WinWait("Окно 2", "") Then
          ControlSend("Окно 2", "", "", "{ESC}")
    EndIf
    WEnd

    Всего записей: 427 | Зарегистр. 17-07-2013 | Отправлено: 23:51 24-08-2013
    madmasles

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    winkot, Появление Вашего вопроса на разных площадках вряд ли увеличит скорость получения правильного ответа, ИМХО.

    Всего записей: 1277 | Зарегистр. 25-09-2008 | Отправлено: 01:19 25-08-2013
    AZJIO



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    1. Как узнать количество элементов в таблице SQLite? Знаю что можно пробежать по строкам и сделать инкремент счётчика, но должно ведь быть проще. Есть _SQLite_LastInsertRowID, но у меня в базе несколько таблиц, а _SQLite_LastInsertRowID не содержит информации  какая таблица используется.
     
    2. Раньше я делал таблицу и в ней обязательно была первая колонка идентификатор. Но теперь я не понимаю зачем его использовать, хотя без него не могу. Если раньше я добавлял элемент, то чтобы не получить дубликат я искал такой номер элемента, в котором во второй колонке не было такого же значения:
    Например
    _SQLite_QuerySingleRow(-1, "SELECT " & $ID1 & " FROM '" & $sNameTable & "' WHERE " & $ID1 & " = '" & $a & "';", $aRow)
    Если я упразднил колонку идентификаторов $ID1, то как мне добавить элемент чтобы его не было в списке?
    _SQLite_QuerySingleRow(-1, "SELECT '" & $tmp & "' FROM 'Таблица';", $aRow)
    Здесь я пытаюсь выбрать элемент, и если удалось, значит он существует. Но у меня это не работает.
     
    Вот тестовый пример
     
    Кстати сайт с русским описанием перестал существовать.
     
    Нашёл некоторую информацию
    1. INTEGER PRIMARY KEY - ключ для идентификации
    2. UNIQUE - колонка, которая содержит только уникальные элементы
    3. ROWID - использовать в качестве идентификатора первой колонки (для второго вопроса).

    Всего записей: 4407 | Зарегистр. 03-05-2006 | Отправлено: 09:22 26-08-2013 | Исправлено: AZJIO, 10:52 27-08-2013
    SlavaS



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    1.
    Цитата:
    Как узнать количество элементов в таблице SQLite?

    ; запрос
    $iRval = _SQLite_GetTable2d(-1, "SELECT * FROM persons;", $aResult, $iRows, $iColumns)
    $iRows - и будет количество строк в таблице.
     
    2.
    Цитата:
    как мне добавить элемент чтобы его не было в списке?  

    если правильно понял вопрос, то можно и так
    _SQLite_Query(-1, "SELECT " & $ID1 & " FROM '" & $sNameTable & "' WHERE " & $ID1 & " = '" & $a & "';", $hQuery)
    If Not _SQLite_FetchData($hQuery, $aRow, False, False) = $SQLITE_OK Then
        _SQLite_Exec($dbn, "INSERT INTO '" & $sNameTable & "' VALUES ('" & $ID1 & "');")  
    EndIf
     

    Всего записей: 45 | Зарегистр. 16-01-2006 | Отправлено: 05:48 27-08-2013
    AZJIO



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

    Цитата:
    если правильно понял вопрос, то можно и так  
    так у меня сейчас

    Цитата:
    $iRows - и будет количество строк в таблице.  
    да я в курсе. Но вы должны понимать, что при милионе элементах возвращать всё в массив уйдёт уйма времени, то есть мой варинат с итерационным циклом будет на порядок быстрее, так как это будет пробег по указателям строк, а не вытаскивание всего этого добра в массив, чтобы до кучи получить и кол. строк. Я же выше написал, неужели мне при добавлении делать итерационный цикл.
    Я пока читаю справки, и просматриваю готовые примеры на офсайте, может выложу сам примеры. Тема то достаточно широкая, там целый язык, можно даже некоторые алгоритмы выполнить на стороне движка SQL.

    Всего записей: 4407 | Зарегистр. 03-05-2006 | Отправлено: 09:10 27-08-2013
    Zloy_Gelud



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

    Код:
    _SQLite_Query(-1, "SELECT Count(*) FROM " & $sNameTable & ";", $hQuery)

    Всего записей: 3265 | Зарегистр. 30-05-2007 | Отправлено: 09:26 27-08-2013
       

    Страницы: 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