• vkontakte odnoklassniki mailru yandex google
Забыли пароль?
» AutoIt скрипты - введение и FAQ

AutoIt

Эта статья появилась на сайте ввиду популярности AutoIt у посетителей форума Автоматической Установки Windows. Статья состоит из двух частей. В первой - введение в AutoIt, целиком взятое из русской справки к AutoIt, которую очень грамотно перевел с английского Валерий Иванов. К сожалению, найти координаты автора не удалось, но хочется верить, что он не возражает против публикации его трудов. Я настоятельно рекомендую загрузить справку и ознакомиться с уроками, из которых вы сразу узнаете, насколько просто автоматизировать установку приложений при помощи AutoIt. Вторая часть статьи представляет собой список часто задаваемых на конференции Oszone вопросов о работе с AutoIt. Ответы, конечно, прилагаются. "Oszone AutoIt FAQ" для вас подготовил Sanja Alone.

Введение в AutoItanchor

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

По замыслу AutoIt предполагался быть средством "тиражирования конфигураций" ПК. Но с момента создания третьей версии его возможности могут быть использованы для реализации "кухни" автоматизации - написания сценариев решения различных задач, в том числе и для администрирования системы.

AutoIt умеет:

  • Симулировать нажатия комбинаций клавиатуры (поддерживается основная масса раскладок клавиатуры)
  • Симулировать перемещения указателя мыши и нажатия на ее кнопки
  • Перемещать, менять размер и управлять параметрами отображения окон
  • Непосредственно взаимодействовать с "управляющими элементами" (controls) окна (получать/менять надпись, перемещать, отключать, и т.п. действия)
  • Работать с буфером обмена для пересылки его текстового содержания
  • Читать, менять и создавать ключи и значения реестра

Новая версия AutoIt3 распознает общепринятые конструкции и имеет стандартный синтаксис, напоминающий синтаксис VBScript и BASIC, и поддерживает обработку сложных выражений, выполнение собственных функций, проводить циклические и условные вычисления. Помимо этого AutoIt3 приспособлен для всего того, что уже давно используют ветераны-сценаристы.

Как и раньше AutoIt имеет небольшой размер интерпретатора (~100KB), который является самостоятельным и не ссылается на другие, кроме системных .dll библиотек. Он намеренно не делает самостоятельных или скрытых записей в реестре, кроме обязательных и составляющих процесс полной установки. Сценарии могут быть скомпилированы в независимые выполняемые файлы с помощью поставляемого компилятора сценариев - Aut2Exe.

Вместе с интерпретатором модернизируются ActiveX и DLL версия AutoIt, которые называются AutoItX3. Эта библиотека представляет собой объединенный композит (COM и стандартная DLL библиотека в одном модуле). AutoItX3 позволяет добавлять уникальные возможности AutoIt в написанные Вами приложения на других языках программирования!

И, наконец, самым знаменательным является тот факт, что AutoIt остался бесплатным. Однако, если Вы имеете возможность поддержать этот проект ценой собственного времени, деньгами или иными усилиями, то все виды пожертвований принимаются на домашней странице AutoIt.

Oszone AutoIt FAQanchor

Читайте руководство к AutoIt - многое прояснится :) Нижеизложенное - это что-то вроде краткой справки и FAQ по совместительству.

Запуск приложений

  1. Обычный запуск
    Run('C:\Program Files\RivaTuner\RivaTuner.exe')
    ;или так:
    FileChangeDir('C:\Program Files\RivaTuner\')
    Run('RivaTuner.exe')
    Для универсализации скриптов используйте макросы, например, вместо "C:\Program Files" гораздо практичнее использовать макрос@ProgramFilesDir. Тогда команда запуска приложения будет выглядеть так:
    Run(@ProgramFilesDir & '\RivaTuner\RivaTuner.exe')

    Полный список макросов смотрите в разделе руководства "Macro Reference".

  2. С ожиданием завершения (удобен для тихой установки приложений)
    RunWait('RivaTuner20RC158.exe /s')
    Обратите внимание на то, что первым аргументом функций Run и RunWait является ПОЛНЫЙ путь к исполняемому файлу. Писать одно имя можно только в двух случаях - если скрипт находится в том же каталоге или после предварительной смены рабочего каталога с пом. ф-цииFileChangeDir.

Системные переменные

  1. В принципе, макросы дублируют большинство системных переменных, но не все. Добраться напрямую к их значениям можно с пом. ф-цииEnvGet, например:
    EnvGet("SYSTEMDRIVE")
  2. Дописывание пути в переменную Path:
    ;например, допишем путь к 7-Zip в Path
    $addtopath='%ProgramFiles%\7-Zip'
    $smcur='HKEY_LOCAL_MACHINE\SYSTEM\ControlSet' & StringFormat("%03s",RegRead("HKEY_LOCAL_MACHINE\SYSTEM\Select","Current")) & '\Control\Session Manager\Environment'
    $syscurpath=RegRead($smcur,"Path")
    ;если путь уже был внесен в Path (например, при установке поверх более старой версии), то ничего не делаем
    If Not StringInStr ($syscurpath,@ProgramFilesDir&'\7-Zip') and Not StringInStr ($syscurpath,$addtopath) Then
    RegWrite($smcur,"Path","REG_EXPAND_SZ",RegRead($smcur,"Path") & ";" & $addtopath)
    EndIf
    Если верить руководству AutoIt, то применение ф-ции EnvUpdate() после внесения изменений в переменную Path должно сделать доступным новые пути, но, на практике этого не происходит - для вступления изменений в силу требуется перезагрузить ОС.
  3. Создание новой системной переменной:
    ;имя создаваемой переменной
    $newsysvarname='new'
    ;тип переменной
    $newsysvartype='REG_SZ'
    ;значение переменной
    $newsysvarvalue='value'
    $smcur='HKEY_LOCAL_MACHINE\SYSTEM\ControlSet' & StringFormat("%03s",RegRead("HKEY_LOCAL_MACHINE\SYSTEM\Select","Current")) & '\Control\Session Manager\Environment'
    RegWrite($smcur,$newsysvarname,$newsysvartype,$newsysvarvalue)

Создать сист. переменную также можно используя ф-цию EnvSet("envvariable"[,"value"]), но она будет существовать только до выхода из текущего скрипта.

Ввод данных / работа с элементами управления

  1. Посылка символов в активный элемент активного окна
    ;дожидаемся активности окна RivaTuner с текстом Choose Install Location
    WinWaitActive('RivaTuner','Choose Install Location')
    ;изменение пути уcтановки RivaTuner со стандартного на @ProgramFilesDir&'\RivaTuner'
    Send(@ProgramFilesDir & '\RivaTuner')
  2. Посылка символов непосредственно в текстовое поле
    ControlSetText('RivaTuner','Choose Install Location','Edit1',@ProgramFilesDir & '\RivaTuner')
    ;или
    ControlSend('RivaTuner','Choose Install Location','Edit1',@ProgramFilesDir & '\RivaTuner')
  3. Каракули вместо русских буковок

    Проверьте, чтобы текстовый файлик скрипта (au3) был в ANSI (Win-1251) кодировке.

  4. Клацанье по кнопкам, чекбоксам, выбор строки комбобокса и т.п.
    ;нажать кнопку Button4, в окне установки Winamp, содержащем текст Interface and Skin Selection
    ControlClick('Winamp','Interface and Skin Selection','Button4')
    ;выбрать radiobutton с текстом I &accept the agreement, в окне установки Everest, содержащем текст License Agreement
    ControlCommand('Setup','License Agreement','I &accept the agreement','Check','')
    ;выбрать строку Full Install из выпадающего списка ComboBox1 в окне установки FLY 2000 TV, содержащем текст Выберите тип установки
    ControlCommand('FLY 2000 TV','Выберите тип установки','ComboBox1','SelectString','Full Install')
  5. Как кликнуть по скрытой кнопке (Control is hidden)

    По идее, сначала нужно эту кнопку сделать видимой - ControlShow("title","text",controlID), но, довольно часто после применения этой ф-ции, клик на кнопке при помощи ControlClick("title","text",controlID) не проходит. В этом сл., спасением станет MouseClick("left",x,y,1).

  6. Как точно попасть MouseClick-ом в нужную кнопку не зная разрешения экрана.

    При написании скрипта используйте привязку координат к клиентской части активного окна. Т.е., когда Вы (используя "AutoIt Window Info") смотрите координаты кнопки, выставьте Options -> Coord Mode -> Client. А в скрипте (перед MouseClock-ом) задайте:
    ; 1 - привязка к левому верхнему углу экрана (по ум.)
    ; 0 - привязка к активному окну
    ; 2 - привязка к клиентской части активного окна (все то, что ниже заголовка)

    Opt("MouseCoordMode",2)
  7. Имя эл-та управления может изменяться от запуска к запуску программы (скажем, был "Button3", а в след раз стал "Button2") - имейте это ввиду. Решением в подобных ситуациях может стать обращение к эл-ту управления по его содержимому (Text), а не имени класса (ClassNameNN) или ControlID.
    ;фрагмент информационного окна AutoIt Window Info:
    Control ID: 1
    ClassNameNN: Button2
    Text: &Next >
    Ну, а если Вы предварительно убедитесь в активности окна с пом. WinWaitActive, то нажать на кнопку по умолчанию всегда можно банальным Send('{ENTER}'). Т.e. клацнуть по этому батону :) можно 4 способами:
    ControlClick('HyperSnap','',1)
    ControlClick('HyperSnap','','Button2')
    ControlClick('HyperSnap','','&Next >')
    Send('{ENTER}')
    Есть еще один способ - через указатели, но для получения указателя все равно сначала нужно идентифицировать эл-т управления по одному из трех признаков.

Работа с ini-файлами

  1. У AutoIt-а есть пять ф-ций для этих целей:

    IniDelete("filename","section"[,"key"]) - удалить секцию или значение из ini-файла.
    IniRead("filename","section","key","default") - считать значение из ini-файла.
    IniReadSection("filename","section") - считать все пары секция/значение из ini-файла.
    IniReadSectionNames("filename") - считать имена всех секций из ini-файла.
    IniWrite("filename","section","key","value") - записать значение в ini-файл.
  2. Пример использования:
    ;Winamp - отключить автообновление и отправку статистики на сервер программы
    IniWrite(@ProgramFilesDir & '\winamp\winamp.ini','Winamp','newverchk','0')
    IniWrite(@ProgramFilesDir & '\winamp\winamp.ini','Winamp','newverchk2','0')

Импорт данных из reg-файла в реестр

  1. С помощью функции RunWait и штатной утилиты regedit.exe
    ;для избавления от лишней головной боли лучше указывать полный путь к reg-файлу
    ;в данном примере, макрос @ScriptDir говорит о том, что reg-файл находится в одном каталоге со скриптом
    ;флаг @SW_HIDE заставит ф-цию RunWait отработать в скрытом окне

    RunWait('regedit /S ' & @ScriptDir & '\рег-файл.reg','',@SW_HIDE)
  2. Внесение в реестр одиночных настроек (ф-ции RegWriteRegDelete)
    ;отключение информационного окна в кодеке DivX
    RegWrite("HKEY_CURRENT_USER\Software\DivXNetworks\DivX4Windows","Disable feedback","REG_DWORD",0x00000001)
    ;регистрация WinAmp-а
    RegWrite("HKEY_LOCAL_MACHINE\SOFTWARE\Nullsoft\Winamp", "regname", "REG_SZ", "xxxxxxxxxxxxx")
    RegWrite("HKEY_LOCAL_MACHINE\SOFTWARE\Nullsoft\Winamp", "regkey", "REG_SZ", "xxxxxxxxxxxxxxxxxxxxxxxx")
    ;удаление WinampAgent-а из автостарта
    RegDelete("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run", "WinampAgent")

Предотвращение возможности множественного запуска скрипта

В начало скрипта добавьте такие строки:

If WinExists(@ScriptName) Then Exit
AutoItWinSetTitle(@ScriptName)

Отлов "случайных" окон

  1. Если место появления окна известно
    ;ждем не более 2 секунд. Будет окно - отработаем с ним, нет - просто пойдем дальше
    If WinWait("Installer Language","",2) Then
    WinActivate("Installer Language")
    WinWaitActive("Installer Language")
    Send("{ENTER}")
    EndIf
  2. Если момент появления окна известен
    If WinExists('Регистрация FineReader 7.0','Пожалуйста') Then
    WinActivate('Регистрация FineReader 7.0','Пожалуйста')
    Send('{SPACE}')
    ControlClick('Регистрация FineReader 7.0','Пожалуйста','Button4')
    WinWaitActive('Регистрация','Внимание!')
    Send('{ENTER}')
    EndIf
  3. Если ничего не известно.
    ;на протяжении выполнения тела скрипта каждые 500 мс (по ум. 250) будет выполняться ф-ция wfp
    AdlibEnable("wfp",500)
    ...
    ;тело скрипта
    ...
    Func wfp()
    If WinExists('Защита файлов Windows','Файлы') Then
          ControlClick('Защита файлов Windows','Файлы','Button3')
          WinWait('Защита файлов Windows','Вы отказались')
          ControlClick('Защита файлов Windows','Вы отказались','Button1')
    EndIf
    EndFunc

    Действующий пример использования AdlibEnable (а также вызова своей ф-ции при выходе из скрипта Opt("OnExitFunc","MyExit")) можете посмотреть в моем скрипте для установки переводчика Pragma.

  4. Окно браузера (многие инсталляторы открывают домашнюю страницу по завершении установки)
    ;достаем из реестра имя исполняемого файла браузера по умолчанию
    $defaultbrowser = RegRead ('HKEY_LOCAL_MACHINE\SOFTWARE\Clients\StartMenuInternet','')
    ;ждем процесс браузера (проверка на наличие процесса в памяти производится каждые 250 мс
    ;на практике это означает, что окно браузера даже не успеет появиться)
    ProcessWait ( $defaultbrowser )
    ;закрываем процесс браузера
    ProcessClose ( $defaultbrowser )
    ;дожидаемся момента полной выгрузки процесса браузера из памяти (это не обязательно)
    ProcessWaitClose ( $defaultbrowser )

Отлов ошибок

  1. Для начала проверьте правильность синтаксиса и кодировку au3-файла. Для проверки синтаксиса удобно использовать специальные редакторы - мне нравится SciTE (Ctrl+F5 - проверка синтаксиса, F4 - переход к след. ошибке).
  2. Если Ваш скрипт где-то, непонятно почему зависает, то посмотреть что его так озадачило можно так:
    1. Добавляем в начало скрипта строку Opt("TrayIconDebug",1) и убираем строку Opt("TrayIconHide",1) конечно, если она есть.
    2. Запускаем скрипт и, когда он застрянет, лезем мышкой к иконке АвтоИт-а в трэе и не нажимаем клавиш. Появится всплывающая подсказка, состоящая из 2 строк - в первой будет имя скрипта, а во второй строка на к-рой он застопорился (что-то вроде Line 5: WinWait("Name","Text")) Причем лучше запускать au3-файл, т.к. в случае с exe (откомпилированный скрипт) не будет показан номер строки.

Как с помощью AutoIt сменить раскладку клавиатуры

  1. WinAPI-метод (предложил ANGRO)
    Run("notepad.exe")
    Sleep(500)
    ;установка режима поиска окон по указателям (Advanced mode)
    Opt("WinTitleMatchMode",4)
    ;получение указателя (уникального идентификатора) окна с именем класса "Notepad" и запись его в переменную $hWnd
    $hWnd = WinGetHandle("classname=Notepad")
    ;переключение раскладки в окне, определяемом указателем $hWnd
    _SetKeyboardLayout("00000409", $hWnd)
    Func _SetKeyboardLayout($sLayoutID, $hWnd)
    Local $WM_INPUTLANGCHANGEREQUEST = 0x50
    Local $ret = DllCall("user32.dll", "long", "LoadKeyboardLayout", "str", $sLayoutID, "int", 0)
    DllCall("user32.dll", "ptr", "SendMessage", "hwnd", $hWnd, "int", $WM_INPUTLANGCHANGEREQUEST, "int", 1, "int", $ret[0])
    EndFunc
    Exit
    #cs
    Дополнительные языки.

    "00000407" Немецкий (стандартный)
    "00000409" Английский (США)
    "0000040C" Французский (стандартный)
    "0000040D" Финский
    "00000410" Итальянский
    "00000415" Польский
    "00000419" Русский
    "00000422" Украинский
    "00000423" Белорусский
    "00000425" Эстонский
    "00000426" Латвийский
    "00000427" Литовский
    #ce
  2. Реестровый метод (Sanja Alone)
    ;клавиши (разрешенные клавиши: 1,2,3,4,5,6,7,8,9,0,~,Ё - знак ударения)
    $vrtkey='1,2,3'
    ;модификаторы клавиш (разрешены: '05' - Ctrl; '06' - Alt)
    $keymod='05,05,06'
    ;коды языков (можете посмотреть в разделе "Appendix" руководства по AutoIt или в вышеприведенном примере)
    $lang='0409,0419,0422'
    ;включаем возможность раздельного переключения языков (англ. - Ctrl+Shift+1; рус. - Ctrl+Shift+2; укр. - Alt+Shift+3)
    _EnableLangSwitching($vrtkey,$keymod,$lang)
    ;----- пример кода -----
    Run("notepad.exe")
    Sleep(500)
    ;переключение на англ.
    Send('^+1')
    Send('Hello, World'&@LF)
    ;переключение на рус.
    Send('^+2')
    Send('Привет, Мир'&@LF)
    ;переключение на укр.
    Send('!+3')
    Send('Привўт, Свўте'&@LF)
    ;переключение на англ.
    Send('^+1')
    Send('Hello, New World'&@LF)
    ;------------------
    ;отключение возможности раздельного переключения языков (удаление из реестра внесенных туда веток)
    ;в кач-ве аргумента укажите к-во языков, заданное выше в переменной $lang (для данного примера. - 3)
    _DisableLangSwitching(3) Func _EnableLangSwitching($key,$mod,$lng) $constpart="HKEY_CURRENT_USER\Control Panel\Input Method\Hot Keys\000001" $akey=StringSplit($key,',',1) $amod=StringSplit($mod,',',1) $alng=StringSplit($lng,',',1) If UBound($akey,1)=UBound($amod,1) and UBound($akey,1)=UBound($alng,1) Then For $i=1 To UBound($alng,1)-1 RunWait('REG ADD "' & $constpart & StringFormat('%02s"',$i-1) & ' /v "Virtual Key" /t REG_BINARY /d ' & Hex(Asc($akey[$i]),2) & '000000 /f','',@SW_HIDE) RunWait('REG ADD "' & $constpart & StringFormat('%02s"',$i-1) & ' /v "Key Modifiers" /t REG_BINARY /d ' & $amod[$i] & 'c00000 /f','',@SW_HIDE) RunWait('REG ADD "' & $constpart & StringFormat('%02s"',$i-1) & ' /v "Target IME" /t REG_BINARY /d ' & StringRight($alng[$i],2)&StringLeft($alng[$i],2)&StringRight($alng[$i],2)&StringLeft($alng[$i],2) & ' /f','',@SW_HIDE) Next SetError(0) Return(1) Else SetError(1) Return(0) EndIf EndFunc Func _DisableLangSwitching($count) $constpart="HKEY_CURRENT_USER\Control Panel\Input Method\Hot Keys\000001" For $i=0 To $count-1 RunWait('REG DELETE "' & $constpart & StringFormat('%02s"',$i) & ' /f','',@SW_HIDE) Next EndFunc

Полезные ссылкиanchor

Источник: http://www.oszone.net/3663