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

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



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

    Цитата:
    Если строка почти одинаковая, то так быстрее, потому что делается одним проходом.  

    Под вопросом,  StringRegExpReplace медленнее, сильно зависит от регулярки.
     
     
    Добавлено:
    thejustsoul

    Цитата:
    В вашем скрипте, тоже ошибка:

    Поправил пост, не хватало ")"

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



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

    Всего записей: 4411 | Зарегистр. 03-05-2006 | Отправлено: 13:29 17-08-2014 | Исправлено: AZJIO, 13:29 17-08-2014
    NIKZZZZ



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

    Цитата:
    На счёт скорости, вызов функции по возможности не помещать внутри цикла

    Все правильно, но экономить тысячные доли процента скорости нет смысла. Скорость определяется наиболее тяжелой функцией StringReplace, на остальное можно наплевать.

    Всего записей: 5365 | Зарегистр. 08-02-2006 | Отправлено: 13:31 17-08-2014
    thejustsoul



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    NIKZZZZ
    Скрипт запустился, отработал 24 сек (прописал в нем вместо трех, 7 замен), завершился без ошибок, создал новый файл.  
    Сравнил два файла, одинаковы. Ничего видимо не нашел..
     
    Может надо как-то в HEX переводить строку и искать с заменой? Там ведь не простой текст (например если его открыть в notepad++ то не найдет ничего из того, что нужно)..

    Всего записей: 1789 | Зарегистр. 30-03-2014 | Отправлено: 13:31 17-08-2014
    NIKZZZZ



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    thejustsoul
    Возможно, ты не совсем правильно поставил задачу, искомый текст не заканчивается 0x00.
    Попробуй так

    Код:
    $vIniFile = StringReplace($vIniFile, $asFindString[$i], _StringRepeat(Chr(0), StringLen($asFindString[$i])))


    Всего записей: 5365 | Зарегистр. 08-02-2006 | Отправлено: 13:43 17-08-2014 | Исправлено: NIKZZZZ, 13:43 17-08-2014
    thejustsoul



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    AZJIO
    Проверил, пробовал простой строкой (например strin1g) и это же самое но в HEX (например 737472696E3167 и так 737472696E316700  ), итог ~32 сек. работы и оба файла одинаковы.

    Всего записей: 1789 | Зарегистр. 30-03-2014 | Отправлено: 13:46 17-08-2014
    AZJIO



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

    Цитата:
    Может надо как-то в HEX переводить строку и искать с заменой?
    Для моего примера можно так перевести в строку:

    Код:
    $sFind = Chr(0x73) & Chr(0x74) & Chr(0x72) & Chr(0x69) & Chr(0x6E) & Chr(0x67) & Chr(0x31) & Chr(0x00)

    Если она содержит нечитабельные данные. А если обычный текст, то как есть.
     
     
    Добавлено:
    thejustsoul
    1. На какой версии проверяешь? 3.3.8.1 или выше?
    2. Делай всегда вывод ошибок в консоль или в месагу, например  

    Код:
    If @error Then MsgBox(0, 'Сообщение', @error)

     
    Добавлено:
    Проверка по времени для каждого участка кода

    Код:
    $timer = TimerInit()
    ; тут был код
    MsgBox(0, "Время выполнения", 'Время : ' & Round(TimerDiff($timer) / 1000, 2) & ' сек')
     
    $timer = TimerInit()
    ; тут был код
    MsgBox(0, "Время выполнения", 'Время : ' & Round(TimerDiff($timer), 2) & ' мсек')

    Всего записей: 4411 | Зарегистр. 03-05-2006 | Отправлено: 13:46 17-08-2014 | Исправлено: AZJIO, 13:55 17-08-2014
    thejustsoul



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Я скоро начну путаться в этих скриптах -)
     
    NIKZZZZ
    Попробовал, тоже нет результата.
     
    Еще раз, мне нужно допустим в файле myfile.dll найти строку (как я ее ищу в HEX редакторе - тип текст - юникодовая строка), строка допустим вида
    Код:
    http://stroka.local
    (смотрю как она выглядит в HEX , это будет
    Код:
    68 74 74 70 3A 2F 2F 73 74 72 6F 6B 61 2E 6C 6F 63 61 6C
    , убираю пробелы, и вставляю в скрипт найти ЭТО и заменить на нули (равное кол-ву символов в той строке, которую ищу). Все.
     
    %)
     
    AZJIO
    Сегодня обновил на самую последнюю с офф.сайта, 3.3.12.0

    Всего записей: 1789 | Зарегистр. 30-03-2014 | Отправлено: 14:01 17-08-2014 | Исправлено: thejustsoul, 14:04 17-08-2014
    AZJIO



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

    Цитата:
    (например если его открыть в notepad++ то не найдет ничего из того, что нужно)..
    Так то notepad++ нормально работает с бинарниками, всё отображает, в том числе и управляющие символы. А вот комбо-элемент в окно поиска и замены не поддерживает вставку через буфер обмена спец-символы. Но можно выделив нужный текст в окне и вызвав Ctrl+H вставит возможно вставит нужые символы, например переносы строк вставляет. А при замене поставь галку "Расширенный" и в поле замены вставь \0\0\0\0 столько раз сколько надо.
     
    Добавлено:
    thejustsoul
    Можно конечно и в бинарный преобразовывать, но для меня это лишняя проблема самому себе. Лучше работать со строкой как есть. Но для регулярного выражения нужно экранировать спецсимволы. По моему лучший и быстрый вариант, ты выкладываешь файл, выкладываешь что на что заменить, люди дают готовый скрипт. А так мы играем в глухой телефон...

    Всего записей: 4411 | Зарегистр. 03-05-2006 | Отправлено: 14:04 17-08-2014
    NIKZZZZ



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

    Цитата:
     тип текст - юникодовая строка


    Цитата:
    смотрю как она выглядит в HEX , это будет "68 74 74 70 3A 2F 2F 73 74 72 6F 6B 61 2E 6C 6F 63 61 6C"

    Это не UNI !
    Приведи кусочек hex из исходного файла, содержащий искомую строку, а то ты всех запутал.
     
     

    Всего записей: 5365 | Зарегистр. 08-02-2006 | Отправлено: 14:09 17-08-2014
    thejustsoul



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    NIKZZZZ
    Прошу прощение с предыдущим сообщением попутал чуть-чуть, там не такой HEX код, в исходном я правильно искал, а тут я просто новый файл создал и вписал туда и копирнул HEX, в оригинале там такой вид (не юникодом не ищется кстати):
     
    строчка time.kriss.re.kr в HxD выглядит так:

    Код:
    74 00 69 00 6D 00 65 00 2E 00 6B 00 72 00 69 00 73 00 73 00 2E 00 72 00 65 00 2E 00 6B 00 72 00
    t.i.m.e...k.r.i.s.s...r.e...k.r.

     
    Может картинкой сделать, понятней мб будет?

    Всего записей: 1789 | Зарегистр. 30-03-2014 | Отправлено: 14:17 17-08-2014 | Исправлено: thejustsoul, 14:18 17-08-2014
    madmasles

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    thejustsoul,
    Это кодировка UTF16 Little Endian
    Код:
    $bTxt = Binary('0x740069006D0065002E006B0072006900730073002E00720065002E006B007200')
    $sTxt = BinaryToString($bTxt, 2)
    ConsoleWrite($sTxt & @LF)
    ConsoleWrite(StringToBinary($sTxt, 2) & @LF)


    Всего записей: 1277 | Зарегистр. 25-09-2008 | Отправлено: 14:59 17-08-2014
    AZJIO



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    thejustsoul
    Попробуй TextReplace, там есть поддержка ком-строки и бинарный режим.

    Всего записей: 4411 | Зарегистр. 03-05-2006 | Отправлено: 15:13 17-08-2014
    thejustsoul



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    AZJIO
    Желательно одним скриптом (и максимально простым и быстрым), без сторонних программ/скриптов/оболочек. С тем же успехом можно и макрос записать чем-нибудь для HxD..)

    Всего записей: 1789 | Зарегистр. 30-03-2014 | Отправлено: 15:21 17-08-2014
    NIKZZZZ



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

    Код:
    #include <String.au3>
    Dim $asFindString[3] = ["string1", "string2", "string3"]
    $vIniFile = FileRead("File.bin")
    FileDelete("New_File.bin")
    For $i = 0 To UBound($asFindString) - 1
        $vIniFile = StringReplace($vIniFile, Ansi2Uni($asFindString[$i]) & Chr(0), _StringRepeat(Chr(0), StringLen(Ansi2Uni($asFindString[$i])) + 1))
    Next
    FileWrite("New_File.bin", $vIniFile)
     
    Func Ansi2Uni($sStr)
        Return BinaryToString(StringToBinary($sStr, 2))
    EndFunc   ;==>Ansi2Uni

     
    Поиск в Uni16
     
     

    Всего записей: 5365 | Зарегистр. 08-02-2006 | Отправлено: 15:22 17-08-2014
    thejustsoul



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    NIKZZZZ
    Скрипт работает, заменяет все правильно, но все равно долго 30,33 сек). Или так и должно быть и быстрее никак?
    П.С. первоначальный скрипт отработал за 38.42.
     
    Время засекалось кодом таймера, что выше давали, до этого условно было.
     
    AZJIO
    В моем случае не помогут регулярки (как и другие инструменты типа Notepad++ и других редакторов), т.к. строчки разные которые мне нужно заменить, руками через HxD это делается быстро (нашел, занулил, дальше), вот захотелось автоматизации с помощью AutoIt. Если как-то запутал (не хотел), извиняюсь

    Всего записей: 1789 | Зарегистр. 30-03-2014 | Отправлено: 16:23 17-08-2014 | Исправлено: thejustsoul, 16:30 17-08-2014
    NIKZZZZ



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

    Цитата:
    и быстрее никак?  

    Это нормальное время для файла твоего размера.
    Можно попробовать

    Код:
     $vIniFile = StringReplace($vIniFile, Ansi2Uni($asFindString[$i]) & Chr(0), _StringRepeat(Chr(0), StringLen(Ansi2Uni($asFindString[$i])) + 1),0,1)

    будет искать точное совпадение (без игнорирования регистра), проверь.

    Всего записей: 5365 | Зарегистр. 08-02-2006 | Отправлено: 16:42 17-08-2014
    thejustsoul



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    NIKZZZZ
    Вот это поворот, время : 1.93 сек (при повторном 1.86 сек) =) Так уже нааамного лучше, спасибо!
    Думаю на этом можно закончить (хотя если есть еще варианты, почитаю), спасибо всем помогавшим

    Всего записей: 1789 | Зарегистр. 30-03-2014 | Отправлено: 16:49 17-08-2014 | Исправлено: thejustsoul, 16:50 17-08-2014
    AZJIO



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    thejustsoul
    Проверил в TextReplace, поиск 4-символьного патерна 0.5 сек в файле размером 20 Мб. Если 7*0.5 = 3,5 сек. Вот такая оценочная скорость для двухядерного проца интел 3000 МГц

    Всего записей: 4411 | Зарегистр. 03-05-2006 | Отправлено: 17:05 17-08-2014 | Исправлено: AZJIO, 17:19 17-08-2014
    DragonSerW



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    AZJIO, здравствуйте. Вы мне советовали два способа запуска исполняемых файлов.
    Первый, для запуска файла не по полному имени:
    Код:
    ; Автоматически запускаем установочный .exe из папки скрипта
    ; http://forum.ru-board.com/topic.cgi?forum=5&topic=33902&start=1900#8
    Local $sPath
    $hSearchFile = FileFindFirstFile(@ScriptDir & '\AdbeRdr*.exe')
    If $hSearchFile <> -1 Then
       $hFile = FileFindNextFile($hSearchFile)
       If Not @error Then $sPath = @ScriptDir & '\' & $hFile
    EndIf
    FileClose($hSearchFile)
    If Not $sPath Then Exit MsgBox(4096, 'Сообщение', 'Измените 33-ю строку скрипта')

     
    И второй - для запуска .msi файла:
    Код:
    RunWait(@COMSPEC & " /c Start LibreOffice_4.3.1_Win_x86.msi")

     
    Подскажите, пожалуйста, как можно объединить эти два crрипта так, чтобы можно было запустить LibreOffice*.msi?

    ----------
    Сергей Ш. » DragonSerW.RU

    Всего записей: 274 | Зарегистр. 11-05-2007 | Отправлено: 11:29 30-08-2014
       

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