AutoIt v3: краткое Оглавление...

54
AutoIt v3: краткое руководство by Andy Flesner Copyright © 2007 O'Reilly Media, Inc. ISBN: 978-0-596-51512-6 Released: September 14, 2007 На русский язык перевёл Затеев Константин AutoIt становится все более и более популярным в среде системного администрирования как инструмент автоматизации возникающих задач. Помимо этого, AutoIt возможно использовать для автоматизации ряда задач в системе Windows. Этот мощный язык сценариев может запустить любую программу и управлять процессом ввода команд с мыши и клавиатуры. При помощи инструмента RunAs системные администраторы могут осуществлять "тихие" установки программного обеспечения и изменять его конфигурацию, используя встроенные функции администрирования. Это руководство содержит основы языка AutoIt v3. Вы узнаете о переменных и вложениях, графическом интерфейсе пользователя, пользовательских функциях, операторах цикла и условных выражениях. Полученную теорию Вы примените в примерах, связанных с системным администрированием. Приведенные в данной книге примеры могут быть использованы на практике: от модификации игр до создания сценария входа в систему. Оглавление Введение в AutoIt и его история…... 2 Переменные и вложения …………… 2 Графический интерфейс пользователя (GUI) ............................. 10 Автоматизация приложений .......... 35 Заключение .......................................... 55

Transcript of AutoIt v3: краткое Оглавление...

Page 1: AutoIt v3: краткое Оглавление руководствоautoit-script.ru/autoit_rv_ua/files/Other/AutoIt_v3_Kratkoe... · Введение в AutoIt и его ... GUI

AutoIt v3: краткое руководство

by Andy Flesner

Copyright © 2007 O'Reilly Media, Inc.

ISBN: 978-0-596-51512-6 Released:

September 14, 2007

На русский язык перевёл Затеев Константин

AutoIt становится все более и более популярным в среде системного администрирования как инструмент автоматизации возникающих задач. Помимо этого, AutoIt возможно использовать для автоматизации ряда задач в системе Windows. Этот мощный язык сценариев может запустить любую программу и управлять процессом ввода команд с мыши и клавиатуры. При помощи инструмента RunAs системные администраторы могут осуществлять "тихие" установки программного обеспечения и изменять его конфигурацию, используя встроенные функции администрирования. Это руководство содержит основы языка AutoIt v3. Вы узнаете о переменных и вложениях, графическом интерфейсе пользователя, пользовательских функциях, операторах цикла и условных выражениях. Полученную теорию Вы примените в примерах, связанных с системным администрированием. Приведенные в данной книге примеры могут быть использованы на практике: от модификации игр до создания сценария входа в систему.

Оглавление Введение в AutoIt и его история…... 2

Переменные и вложения …………… 2

Графический интерфейс

пользователя (GUI) ............................. 10

Автоматизация приложений .......... 35

Заключение .......................................... 55

Page 2: AutoIt v3: краткое Оглавление руководствоautoit-script.ru/autoit_rv_ua/files/Other/AutoIt_v3_Kratkoe... · Введение в AutoIt и его ... GUI

Введение в AutoIt и его история

AutoIt стартовал в конце 1998 г. как программа на языке Си для автоматизации

процесса нажатия клавиш клавиатуры во время установки программного

обеспечения. В январе 1999 г. команда AutoIt выпустиля AutoIt v1, который включал

следующие функции: Send, Run, RunWait, WinWait, WinWaitClose, WinWaitActive,

WinHide, WinActivate, WinClose, WinRestore, Sleep и SetKeyDelay. AutoIt v2 был

выпущен в августе того же года и содержал первую версию AutoItХ, который

предложил управление DLL/COM. За следующие два года к AutoIt v2 было

добавлено много новых функций. В мае 2001, исходный код AutoIt был полностью

переписан в C++, а в 2003 году, была выпущена бета-версия AutoIt v3. До фефраля

2004 г. было выпущено более 100 бета-версий AutoIt v3. Февраль 2005 г.

ознаменовался выпуском AutoIt v3.1.0, который добавил возможности графического

интерфейса пользователя (GUI). Эта версия стала самой известной, что выдвинуло

AutoIt на первый план среди программ для написания скриптов и сделало его

конкурентом Visual Basic Scripting, пакетным файлам и другим языкам для

написания сценариев. AutoIt является свободно распространяемой программой и

пользуется большой популярностью.

Данное руководство готовилось для AutoIt v3.2.4.9, представленного 25.05.2007 г.

Скачать последнюю версию AutoIt можно по приведенной ссылке:

http://www.autoitscript.com/autoit3/downloads.php

Для редактирования скриптов я рекомендую использовать SciTE AutoIt3 Editor. Он

включает обширный справочный материал и удобную цветную подсветку кода.

Последнюю версию SciTE AutoIt3 Editor можно скачать здесь:

http://www.autoitscript.com/autoit3/scite/downloads.php

Переменные и вложения Переменная - просто именованный адрес расположения строки или массива

данных. Вы можете использовать переменную в пределах сценария неограниченное

количество раз, при этом ее требуется объявить только один раз. Это дает

возможность управлять и манипулировать локальными данными.

Переменные необходимы, если Вы хотите писать работоспособные сценарии,

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

файла как переменную, Вы можете в дальнейшем изменять его без необходимости

правки множества статических записей. Использование статического ввода данных

может привести к определенным трудностям. Пример 1 описывает установку двух

обновления системы защиты Windows XP. Пример 2 выполняет те же самые

операции, но делает это с использованием переменных. Вы еще можете не понять

код в данных примерах; они приведены, чтобы показать, что замена имен файлов

переменными является одним из способов оптимизации кода.

Page 3: AutoIt v3: краткое Оглавление руководствоautoit-script.ru/autoit_rv_ua/files/Other/AutoIt_v3_Kratkoe... · Введение в AutoIt и его ... GUI

Пример 1. Автоматическое обновление Windows

If @Username <> "Administrator" Then

RunAsSet("Administrator",@ComputerName,"password")

install()

RunAsSet()

Else

install()

EndIf

Func install()

RunWait("Windows Update l.exe /passive /norestart")

RunWait("Windows Update 2.exe /passive /norestart")

EndFunc

Пример 2. Автоматическое обновление Windows с использованием переменных Global $admin, $password, $program, $program2

$admin = "Administrator"

$password = "password" ; ввод пароля учетной записи Администратора

$program = "Windows Update 1.exe /passive /norestart"; указание файлов с обновлениями

$program2 = "Windows Update 2.exe /passive /norestart"

If @Username <> "Administrator" Then

RunAsSet($admin,@ComputerName,$password) install()

RunAsSet()

Else

install()

EndIf

Func install()

RunWait($program)

RunWait($program2)

EndFunc

Обратите внимание на то, как изменение имен переменных, перечисленных в

объявлениях переменной, может изменить название программы. Эта тонкость

станет полезной при разработке более сложных сценариев.

Типы переменных—Dim, Global и Local Здесь описаны три типа переменных AutoIt:

Dim (переменная с неявной областью видимости)

Декларация (объявление) данной переменной определяется ключевым словом

и его текущим положением в скрипте. Если переменная объявлена вне тела Dim

функции, то она является глобальной.

Page 4: AutoIt v3: краткое Оглавление руководствоautoit-script.ru/autoit_rv_ua/files/Other/AutoIt_v3_Kratkoe... · Введение в AutoIt и его ... GUI

В следующем примере объявляется переменная в глобальной зоне видимости.

Она запускает setup.exe из директории расположения скрипта:

Dim $variable = @ScriptDir & "\setup.exe"

Run($variable)

В следующем примере показано объявление глобальной переменной внутри

локальной функции. При выполнении функции переменная уничтожается.

Результатом данного кода служит сообщение об ошибке, так как $variable не

объявлена глобально:

function() Func function()

Dim $variable = @ScriptDir & "\setup.exe"

EndFunc

Run($variable)

Переменные с неявной областью видимости необходимо объявлять так, чтобы

глобальные и локальные переменные не конфликтовали. Если переменная

объявляется в функции, когда существует глобальная переменная, то последняя

перезаписывается. Следующий пример показывает, что происходит с

имеющейся глобальной переменной, когда та же самая переменная объявляется

в пределах функции. В результате этих действий выполняется setupbad.exe

вместо ; глобальная setup.exe $variable изменяется и принимает значение

, потому что переменная была объявлена локально в пределах setupbad.exe

функции:

Global $variable = @ScriptDir & "\setup.exe"

function() Func function()

Dim $variable = @ScriptDir & "\setupbad.exe" EndFunc Run($variable)

Global (глобальная переменная)

Этот тип переменной может быть записан и считан из любой части скрипта.

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

их завершении. Пример объявления глобальной переменной:

Global $variable = 2

Local (локальная переменная)

Локальная переменная используется только в пределах функции. Как только

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

Page 5: AutoIt v3: краткое Оглавление руководствоautoit-script.ru/autoit_rv_ua/files/Other/AutoIt_v3_Kratkoe... · Введение в AutoIt и его ... GUI

Переменная с таким же именем уже существует при выполнении функция

изменяет ее, таким образом данные из локальной переменной не уничтожаются,

а передаются в глобальную переменную. Переменные сначала всегда

проверяются в локальном контексте, затем в глобальной области видимости.

Следующий пример показывает использование локальной переменной в

пределах функции:

function() Func function()

Local $variable = @ScriptDir & "\setup.exe"

Run($variable)

EndFunc

Явное объявление переменных в AutoIt необязательно

AutoIt не требует явного объявления переменных. Однако, для упрощения

дальнейшей отладки, целесообразно объявить все переменные явно. Если этого не

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

которое может вызывать ошибку при выполнении сценария. Для обязательности

явного объявления переменных можно включить в скрипт следующий код:

Opt("MustDeclareVars", 1)

С этой опцией все переменные должны быть явно объявлены с помощью Global,

Local или Dim.

Constants (константы)

Константа - переменная, которая никогда не изменяется. Она остается неизменной

во время выполнения сценария. Вы не можете изменить значение константы, и не

можете преобразовать существующую переменную в константу. Ключевое слово

, помещенное после , или делает переменную константой. Const Dim Global Local

Возможно создать константу и без явного объявления. Следующий пример

иллюстрирует, как объявить константу в каждом сценарии:

Const $example = 0

Dim Const $example1 = 1

Global Const $example2 = 2

Local Const $example3 = 3

Arrays (массивы)

Массив - это набор данных, в котором все элементы имеют одинаковый тип данных

и размер. Например, массив двух чисел - ―5‖ и ―3‖ - объявлен следующим образом:

Page 6: AutoIt v3: краткое Оглавление руководствоautoit-script.ru/autoit_rv_ua/files/Other/AutoIt_v3_Kratkoe... · Введение в AutoIt и его ... GUI

$num[0] = "5"

$num[1] = "3"

Массивы могут быть многомерными, вплоть до 64 уровней. В примере 3 показан

двумерный массив (визуальное изображение для примера 3 смотри на рисунке 1):

Пример 3. Двумерный массив

$letter[0][0] = "w"

$letter[0][i] = "x"

$letter[l][0] = "y"

$letter[i][i] = "z"

Массив с типом данных Variant

Массив, использующий различные типы данных, объявляется как и может Variant

содержать данные от числа до Булева значения. Тип данных Variant не запрещается

в AutoIt; однако, его использование не рекомендуется. Используя отличающиеся

типы данных в массивах массива особенно в пределах массива - может существенно

уменьшить скорость выполнения Ваших сценариев.

Подключение вложенных элементов

Директива подключает файлы, которые содержат предварительно Include

записанные функции. Воспринимайте их как функции, записанные в Ваш скрипт,

которые можно вызвать для выполнения необходимых действий. Вы можете

использовать эти файлы, добавляя их к скрипту следующим образом:

#include <имя файла au3>

Таблица 1 содержит перечень и описание стандартных элементов, поставляемых

совместно с AutoIt v3, которые можно вложить в Ваш скрипт.

Рисунок 1. Визуальное представление Примера 3. Двумерный массив

Page 7: AutoIt v3: краткое Оглавление руководствоautoit-script.ru/autoit_rv_ua/files/Other/AutoIt_v3_Kratkoe... · Введение в AutoIt и его ... GUI

Таблица 1. Подключаемые пользовательские элементы, поставляемые с AutoIt v3

Файл Описание

Array.au3 Управление массивами

AVIConstants.au3 AVI - константы

ButtonConstants.au3 Константы для кнопок

Color.au3 Управление цветопередачей

ComboConstants.au3 Константы для ComboBox

Constants.au3 Набор констант AutoIt

Date.au3 Управления выводом даты и времени

DateTimeConstants.au3 Константы для отражения даты и времени

EditConstants.au3 Константы редактора

File.au3 Функции для операций с файлами и директориями

GuiCombo.au3 Управление ComboBox

GUIConstants.au3 Константы, относящиеся к GUI

GUIConstantsEx.au3 Константы, используемые в GUI приложений

GUIDefaultConstants.au3 Настройки стиля GUI по умолчанию

GuiEdit.au3 Управление настройками редактирования

GuiIPAddress.au3 Создание пользовательских настроек IP-адреса

GuiList.au3 Управление Listbox

GuiListView.au3 Управление ListView

GuiMonthCal.au3 Управление календарем

GuiSlider.au3 Управление настройками «ползунка»

GuiStatusBar.au3 Управление панелью состояния

GuiTab.au3 Управление табуляцией

GuiTreeView.au3 Управление TreeView

IE.au3 Библиотеки автоматизации Internet Explorer для

AutoIT v3

Inet.au3 Управление настройками Internet

ListBoxConstants.au3 Константы ListBox

ListViewConstants.au3 Константы ListView

Math.au3 Функции для математических расчетов

Memory.au3 Управление памятью

Page 8: AutoIt v3: краткое Оглавление руководствоautoit-script.ru/autoit_rv_ua/files/Other/AutoIt_v3_Kratkoe... · Введение в AutoIt и его ... GUI

FileInstall - подключение файлов к скриптам AutoIt

Функция FileInstall() позволяет подключить любой файл, например,

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

файлу сценария. Данная функция подобна директиве , но в большинстве #include

случаев подключение дополнительных элементов существенно увеличивает размер

скомпилированного исполнимого файла. Функция FileInstall() имеет

следующий синтаксис:

FileInstall ("исходный_файл", "место_назначения" [flag])

Флаги являются дополнением к функции . Флаг запрещает FileInstall() 0

функции перезаписывать существующие файлы. Флаг используется для 1

перезаписи встречающихся в скрипте файлов. Исходный файл не может быть

переменной; это должен быть элемент типа (строка), который не должен string

содержать знаки подстановки.

Пример 4 содержит код, использующий функцию , которая FileInstall()

извлекает установочные файлы программы во временный каталог. После

компиляции мы получаем инсталлятор в виде единого исполнимого файла.

Файл Описание

Misc.au3 Управление диалогами

Process.au3 Управление процессами

ProgressConstants.au3 Константы состояния

SliderConstants.au3 Константы «бегунка»

Sound.au3 Управление звуковыми файлами

SQLite.au3 Управление базами данных SQLite

SQLite.dll.au3 Встроенная библиотека SQLite3.dll

StaticConstants.au3 Статичные константы

StatusBarConstants.au3 Константы строки состояния

String.au3 Строковые функции

TabConstants.au3 Константы табуляции

TreeViewConstants.au3 Константы TreeView

UpDownConstants.au3 Константы UpDown

Visa.au3 VISA (шина GPIB и протокол TCP)

WindowsConstants.au3 Константы Windows

Page 9: AutoIt v3: краткое Оглавление руководствоautoit-script.ru/autoit_rv_ua/files/Other/AutoIt_v3_Kratkoe... · Введение в AutoIt и его ... GUI

Пример 4. Использование функции FileInstall()

#NoTrayIcon

Opt("MustDeclareVars", 1)

FileInstall(''C:\Documents and Settings\Administrator\Desktop\Program\" & _

"Setup.exe", @TempDir & "\Setup.exe", 1)

FileInstall("C:\Documents and Settings\Administrator\Desktop\Program\" & _

"Setup.exe", @TempDir & "\setup.ico", 1)

FileInstall("C:\Documents and Settings\Administrator\Desktop\Program\" & _

"Setup.exe", @TempDir & "\setup.ini", 1)

FileInstall("C:\Documents and Settings\Administrator\Desktop\Program\" & _

"Setup.exe", @TempDir & "\program.dll", 1)

FileInstall("C:\Documents and Settings\Administrator\Desktop\Program\" & _

"Setup.exe", @TempDir & "\readme.txt", 1)

Run(@TempDir & "\Setup.exe")

WinWait("Installation Wizard", "Welcome to the")

If Not WinActive("Installation Wizard", "Welcome to the") Then _

WinActivate("Installation Wizard", "Welcome to the")

WinWaitActive("Installation Wizard", "Welcome to the")

ControlClick("Installation Wizard", "", "Next")

WinWait("Installation Wizard", "Installation Complete")

If Not WinActive("Installation Wizard", "Installation Complete") Then _

WinActivate("Installation Wizard", "Installation Complete")

WinWaitActive("Installation Wizard", "Installation Complete")

ControlClick("Installation Wizard", "", "Finish")

В этом примере функция FileInstall() копирует пять файлов во временную

директорию, затем команда Run() запускает файл . Программа ожидает Setup.exe

появления мастера установки, прописанного в функции и передает ему WinWait()

управление с помощью функции , после чего ожидается нажатие на WinActivate()

кнопку (функция ), а по окончании установки ожидается Next ControlClick()

нажатие на кнопку . Finish

Перенос длинных строк

Нижнее подчеркивание сигнализирует, что текущая строка кода ( _ )

продолжается на следующей строке. Этот подход делает код более читаемым и

облегчает обработку длинных строк, не вмещающихся на экран, при

редактировании скрипта. Разделяемая строка должна быть закрыта и соединена

со следующей строкой, как показано в этом примере:

Неверно:

"строка _ продолжение строки"

Верно:

"строка" & _ "продолжение строки"

Page 10: AutoIt v3: краткое Оглавление руководствоautoit-script.ru/autoit_rv_ua/files/Other/AutoIt_v3_Kratkoe... · Введение в AutoIt и его ... GUI

Графический интерфейс пользователя (GUIs)

Одна из новейших функций AutoIt - возможность создания графического

интерфейса пользователя. Эта функция добавляет экстраординарное количество

возможностей на язык AutoIt. Некоторые из наиболее популярных способов

использования GUI - создание меню установки, входных форм и строк состояния.

Я начинаю этот раздел с примера, таким образом, Вы сможете увидеть порядок создания

GUI и ознакомиться с функциями, используемыми для создания GUI. Пример 5 создает две

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

других задач, где требуется селектор с двумя кнопками, например установщик для двух

различных программ, селектор для двух различных учетных записей пользователей, и т.д.

Вы можете легко увеличить размер кода и создать большее количество кнопок. Позже, на

примере 8 Вы изучите возможности каждой функции GUI и правила их конфигурации.

Пример 5. Графический интерфейс пользователя ; Подключаем вложенные GuiConstants (необходимы для использования функций GUI) #include <GuiConstants.au3>

; скрываем иконку в трее

#NoTrayIcon

; Настройка опций режима показа системных событий OnEvent()

Opt('GUIOnEventMode', 1)

; Создание GUI

GuiCreate("Ai Smart Homes - Saint Louis, Missouri", 400, 300)

GuiSetIcon("icon.ico")

; Запуск функции GUIExit() при закрытии GUI

GUISetOnEvent($GUI_EVENT_CLOSE, 'GUIExit')

; Логотип / изображение GuiCtrlCreatePic("logo.jpg",120,5,156,160)

; Инструкции

GUICtrlCreateLabel(''Please Choose an Option Below:", 50, 180, 300, 15,

$SS_CENTER) GUICtrlSetColor(-1,0xFF0000) ; цвет инструкций (здесь - красный)

; Кнопка 1

GUICtrlCreateButton("Visit Our Website", 100, 210, 200, 30)

GUICtrlSetOnEvent(-1, 'website') ; При нажатии запускается website()

; Кнопка 2

GUICtrlCreateButton("Send an Email", 100, 250, 200, 30)

GUICtrlSetOnEvent(-1, 'email') ; При нажатии запускается email()

Page 11: AutoIt v3: краткое Оглавление руководствоautoit-script.ru/autoit_rv_ua/files/Other/AutoIt_v3_Kratkoe... · Введение в AutoIt и его ... GUI

Рисунок 2. Результат выполнения скрипта из примера 5

Func website()

; Скрыть GUI на время выполнения функции

GUISetState(@SW_HIDE)

Run("C:\Program Files\Internet Explorer\iexplore.exe ") www.aismarthomes.com

Exit

EndFunc

Func email()

Скрыть GUI на время выполнения функции ;

GUISetState(@SW_HIDE)

Run("mailto:[email protected]")

Exit

EndFunc

Показать GUI после завершения выполнения функции ;

GUISetState(@SW_SHOW)

Бездействие скрипта во время выполнения цикла – эта функция ДОЛЖНА БЫТЬ ПОДКЛЮЧЕНА ;

OnEvent

mode While 1

Sleep(500)

Wend

Эта функция заставляет выйти из скрипта при закрытии GUI ;

Func GUIExit()

Exit

EndFunc

Рисунок 2 показывает интерфейс, созданный в примере 5. Вложенный logo.jpg

находится в том же самом каталоге, что и файл сценария. После компиляции

логотип выводится на форме GUI - интерфейса.

Page 12: AutoIt v3: краткое Оглавление руководствоautoit-script.ru/autoit_rv_ua/files/Other/AutoIt_v3_Kratkoe... · Введение в AutoIt и его ... GUI

Комментарии в скрипте

Комментарии в сценариях AutoIt могут быть оформлены двумя способами:

1. Точка с запятой. Точка с запятой обозначает начало комментария на

одной строке. После точки с запятой на этой же строке идет собственно

комментарий. Если комментарий необходимо продолжить на следующей

строке, необходимо снова поставить точку с запятой, иначе, во время

выполнения скрипта вероятны ошибки.

2. #comments-start и #comments-end (также обозначаются как ). #cs и #ce

Эти команды используются для создания многострочных комментариев.

Начинается комментарий с или #comments-start #cs , а заканчивается с помощью #comments-end или . #ce

События GUI

Как назначить и обработать событие, которое должно произойти при нажатии кнопки на Вашей форме GUI? Есть два режима обработки событий, способных вызвать определенное действие в скрипте при нажатии кнопки:

1. MessageLoop (режим обработки событий в цикле сообщений). Этот режим используется по умолчанию; он заставляет GUI реагировать на события, вызывающие функцию . Данную функцию рекомендуется GuiGetMsg()вызывать с помощью цикла множество раз в секунду; в противном случае созданный пользовательский интерфейс будет медленно работать. Следующий цикл непрерывно вызывает функцию , пока не нажата одна из двух GuiGetMsg()кнопок, или пользователь не пытается закрыть форму:

While 1

$guimsg = GuiGetMsg()

Select

Case $guimsg = $GUI_EVENT_CLOSE

Exit ; закрытие интерфейса

Case $guimsg = $button1

button1(); выполнение одной функции

Case $guimsg = $button2

button2(); выполнение другой функции

EndSelect

Wend

Обратите внимание, что приведенный цикл бесконечен (он имеет значение ; 1

более подробно об этом будет рассказано в разделе, посвященном условным

операторам и циклам). Переменная $guimsg будет непрерывно обновляться

функцией , пока не будет выполнено одно из трех условий. Выбор GuiGetMsg()

Page 13: AutoIt v3: краткое Оглавление руководствоautoit-script.ru/autoit_rv_ua/files/Other/AutoIt_v3_Kratkoe... · Введение в AutoIt и его ... GUI

или приводит к запуску соответствующей функции. Button1 Button2Закрытие GUI – интерфейса приводит к выходу из программы. Пример 6

вводит GuiGetMsg() в состав полностью функционального скрипта.

Пример 6. Метод GuiGetMsg()

; Подключение GuiConstants (необходимо для использования GUI-функций)

#include <GuiConstants.au3>

; Создание GUI

GuiCreate("Menu", 400, 150)

; Кнопка 1

$button1 = GUICtrlCreateButton(''Button1", 100, 20, 200, 30)

; Кнопка 2

$button2 = GUICtrlCreateButton(''Button2", 100, 70, 200, 30)

; Показать GUI после создания

GUISetState(@SW_SHOW)

Func Function1()

; Скрыть GUI на время выполнения функции

GUISetState(@SW_HIDE)

; ==================================================

; Скрипт, аналогичный составленному для Кнопки 1

; ==================================================

EndFunc

Func Function2()

; Скрыть GUI на время выполнения функции

GUISetState(@SW_HIDE)

; ==================================================

; Скрипт, аналогичный составленному для Кнопки 2

; ==================================================

EndFunc

While 1

$guimsg = GuiGetMsg()

Select

Case $guimsg = $GUI_EVENT_CLOSE

Exit ; выход из GUI

Case $guimsg = $button1

function1() ; выполнение кода для Button1

function Case $guimsg = $button2

function2() ; выполнение кода для Button2

function EndSelect WEnd

Page 14: AutoIt v3: краткое Оглавление руководствоautoit-script.ru/autoit_rv_ua/files/Other/AutoIt_v3_Kratkoe... · Введение в AutoIt и его ... GUI

2. OnEvent (режим обработки прерываний). Описанный в AutoItSetOption

( ) режим обычно приостанавливает выполнение 'GUIOnEventMode',1 OnEvent

скрипта, если что-либо активировано на форме пользователя, и выполняет

соответствующую функцию. Как только функция завершена, выводится резюме

скрипта. Пример 7 демонстрирует, возможность использования режима OnEvent

в сценарии, подобном скрипту в примере 6.

Пример 7. Метод GUIOnEventMode

; Подключение GuiConstants (необходимо для использования GUI-функций)

#include <GuiConstants.au3>

; Настройка режима OnEvent

Opt('GUIOnEventMode', 1)

; Создание GUI

GuiCreate("Menu", 400, 150)

; Запуск функции GUIExit() при закрытии формы

GUISetOnEvent($GUI_EVENT_CLOSE, 'GUIExit')

; Кнопка 1

GUICtrlCreateButton(''Button1", 100, 20, 200, 30)

GUICtrlSetOnEvent(-1, 'Function1') ; запуск Function1 при нажатии

; Кнопка 2

GUICtrlCreateButton(''Button2", 100, 70, 200, 30)

GUICtrlSetOnEvent(-1, 'Function2') ; Запуск function2 при нажатии

Func Function1()

; Скрыть GUI на время выполнения функции

GUISetState(@SW_HIDE)

; ==================================================

; Скрипт, аналогичный составленному для Кнопки 1

; ==================================================

EndFunc

Func Function2()

; Скрыть GUI на время выполнения функции

GUISetState(@SW_HIDE)

; ==================================================

; Скрипт, аналогичный составленному для Кнопки 2

; ==================================================

EndFunc

; Показать GUI после выполнения функции

GUISetState(@SW_SHOW)

Page 15: AutoIt v3: краткое Оглавление руководствоautoit-script.ru/autoit_rv_ua/files/Other/AutoIt_v3_Kratkoe... · Введение в AutoIt и его ... GUI

Рисунок 3. Вывод результатов работы скриптов из примера 6 и примера 7

; Бездействие скрипта во время выполнения цикла – эта функция ДОЛЖНА БЫТЬ

; ПОДКЛЮЧЕНА во время режима OnEvent

While 1

Sleep(500)

WEnd

; Данная функция создает скрипт при закрытии формы

Func GUIExit()

Exit

EndFunc

Здесь также присутствует цикл , как и в режиме . На сей раз, While 1 MessageLoop

вместо обновления переменной с помощью , режим GuiGetMsg() OnEvent

обновляет функцию , пока не произойдет ожидаемое событие Sleep(500)

(функция отключает выполнение скрипта на определенное время, в конкретном

случае таймаут равен 500 миллисекунд). При нажатии кнопок на

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

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

Пример 6 и пример 7 создают пользовательскую форму, показанную на

рисунке 3. Оба сценария выполняют аналогичные действия, но каждый

использует различный режим реагирования на события.

Создавая GUI, требуется определить, какой режим реагирования на события

является более предпочтительным. Оба подхода являются работоспособными,

но более подходит для скриптов, где GUI - интерфейс постоянно MessageLoop

находится в фокусе ввода. В скриптах, где GUI - интерфейс не находится в

фокусе ввода, либо используется только периодически, предпочтительнее

использовать режим . В конце-концов, оба метода выполняют OnEvent

одинаковый набор задач, различаются лишь способы их выполнения. Выбор

между режимами и в большинстве случаев зависит OnEvent MessageLoop

только от личных предпочтений.

Элементы управления GUI

Таблица 2 содержит список элементов управления, доступных в AutoIt, их описания

и ассоциированные с ними функции.

Page 16: AutoIt v3: краткое Оглавление руководствоautoit-script.ru/autoit_rv_ua/files/Other/AutoIt_v3_Kratkoe... · Введение в AutoIt и его ... GUI

Таблица 2. Элементы управления графическим интерфейсом пользователя

Элемент Описание Функция

AVI Video Clip Вставка видеоклипа типа *.avi GuiCtrlCreateAvi()

Button Создание кнопки GuiCtrlCreateButton()

Checkbox Создание панели выбора элементов

GuiCtrlCreateCheckbox()

Combo Box Создание комбинированного окна

GuiCtrlCreateComboBox()

Context Menu Создание контекстного меню, появляющегося при клике правой кнопкой мыши

GuiCtrlCreateContextMenu()

Date Управление параметрами даты GuiCtrlCreateDate()

Dummy Создание модели собственного элемента

GuiCtrlCreateDummy()

Edit Создание панели редактирования

GuiCtrlCreateEdit()

Group Создание панели управления GuiCtrlCreateGroup()

Icon Создание иконки GuiCtrlCreateIcon()

Input Создание поля ввода GuiCtrlCreateInput()

Label Создание надписи GuiCtrlCreateLabel()

List Создание простого списка GuiCtrlCreateList()

List View Создание списка GuiCtrlCreateListView()

List View Item Создание элемента списка GuiCtrlCreateListViewItem()

Menu Создание меню GuiCtrlCreateMenu()

Menu Item Создание пункта меню или контекстного меню

GuiCtrlCreateMenuItem()

Object— ActiveX Создание объекта ActiveX GuiCtrlCreateObj()

Picture Вставка изображения GuiCtrlCreatePic()

Progress Bar Создание строки состояния GuiCtrlCreateProgress()

Radio Button Создание кнопки выбора GuiCtrlCreateRadio()

Slider Создание «ползунка» GuiCtrlCreateSlider()

Tab Создание раздела табуляции GuiCtrlCreateTab()

Tab Item Создание элемента в разделе табуляции

GuiCtrlCreateTabItem()

Tree View Создание структуры в виде дерева элементов

GuiCtrlCreateTreeView()

Page 17: AutoIt v3: краткое Оглавление руководствоautoit-script.ru/autoit_rv_ua/files/Other/AutoIt_v3_Kratkoe... · Введение в AutoIt и его ... GUI

Пример 8 содержит модель использования в AutoIt элементов управления GUI. Код

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

большего количества сведений об элементах управления ознакомьтесь со

справочной информацией и файлом помощи AutoIt.

Пример 8. Набор элементов управления GUI

#include <GuiConstants.au3>

; GUI Creation

GuiCreate("GUI Control Examples", 500, 420)

GuiSetIcon(@WindowsDir & "\explorer.exe", 0)

; Menu Creation

$filemenu = GUICtrlCreateMenu("File")

GUICtrlCreateMenuitem("Example File Menu Item",$filemenu)

; Context Menu

$contextmenu = GUICtrlCreateContextMenu()

; Context Menu Item

GUICtrlCreateMenuitem("Example1",$contextmenu)

GUICtrlCreateMenuitem("",$contextmenu) ; separator

GUICtrlCreateMenuitem("Example2",$contextmenu)

; Tab Creation

GUICtrlCreateTab(0,0,500,400)

; Tab 1 Creation

; ==============

GUICtrlCreateTabItem("AVI,Button,Checkbox,ComboBox")

; AVI

GUICtrlCreateAvi(@WindowsDir & "\clock.avi",-1,10,30,321,321,$ACS_AUTOPLAY)

GUICtrlCreateLabel("AVIExample",140,355,60,15)

; Button

GUICtrlCreateButton("Button Example",350,30,120,30)

; Checkbox

GUICtrlCreateCheckbox("Checkbox Example",350,70,120,30)

; Combo Box

GUICtrlCreateCombo("ComboBox Example",350,110,120,30)

Элемент Описание Функция

Tree View Item Добавление элемента в дерево элементов

GuiCtrlCreateTreeViewItem()

Up / Down Создание элемента up/down GuiCtrlCreateUpdown()

Page 18: AutoIt v3: краткое Оглавление руководствоautoit-script.ru/autoit_rv_ua/files/Other/AutoIt_v3_Kratkoe... · Введение в AutoIt и его ... GUI

; Tab 2 Creation

; ==============

GUICtrlCreateTabItem("Group,Date,Dummy,Edit,Icon,Input,List,ListView")

; Start Group

GUICtrlCreateGroup("Group Example",20,40,460,60)

; Date

GUICtrlCreateDate("",30,60,200,25)

; Dummy

$dummybutton = GUICtrlCreateButton("Dummy Example",270,60,200,25)

$dummy = GUICtrlCreateDummy()

; Close Group

GUICtrlCreateGroup("",-99,-99,1,1)

; Edit

GUICtrlCreateEdit("Edit Example",30,120,440,60)

; Icon

GUICtrlCreateIcon(@WindowsDir & "\Cursors\drum.ani",-1,30,200,32,32)

GUICtrlCreateLabel("Icon Example",70,210,80,20)

; Input

GUICtrlCreateInput(''Input Example",160,205,300,20)

; List

GUICtrlCreateList("List Example",30,240,440,80)

; List View

$listview = GUICtrlCreateListView("List View Example",30,330,440,60)

; List View Item

GUICtrlCreateListViewItem(''List View Item Example",$listview)

; Tab 3 Creation

; ==============

GUICtrlCreateTabItem("ActiveX Object")

; ActiveX Object

GUICtrlCreateLabel("ActiveX Object Example",l0,30,l40,20)

$ie = ObjCreate("Shell.Explorer.2")

$GUIActiveX = GUICtrlCreateObj($ie,l0,50,480,340)

$ie.navigate("http://www.aismarthomes.com")

; Tab 4 Creation

; ==============

GUICtrlCreateTabItem("Picture,Progress,Radio,Slider,TreeView,Updown")

Page 19: AutoIt v3: краткое Оглавление руководствоautoit-script.ru/autoit_rv_ua/files/Other/AutoIt_v3_Kratkoe... · Введение в AutoIt и его ... GUI

; Picture

GUICtrlCreatePic(@WindowsDir & "\Blue Lace I6.bmp",l0,30,40,40)

GUICtrlCreateLabel(''Picture Example",55,45,80,20)

; Progress Bar

GUICtrlCreateLabel("Progress Example",400,70,90,20)

$progress = GUICtrlCreateProgress(l0,90,480,25)

GUICtrlSetData($progress,33)

; Radio

GUICtrlCreateRadio("Radio Example",l0,l40,90,20)

; Slider

GUICtrlCreateLabel(''Slider Example",290,l70,l00,20)

GUICtrlCreateSlider(l80,l30,280,30)

; Tree View

GUICtrlCreateLabel("Tree View Example",l0,200,l20,20)

$treeview = GUICtrlCreateTreeView(l0,220,480,60)

; Tree View Item

$treetoplevel = GUICtrlCreateTreeViewItem("Tree View Example",$treeview)

GUICtrlCreateTreeViewItem("Subiteml",$treetoplevel)

GUICtrlCreateTreeViewItem("Subitem2",$treetoplevel)

; Up/Down

GUICtrlCreateLabel("Example Updown",l0,300,l00,20)

$updowninput = GUICtrlCreateInput("0",10,320,480,60)

GUICtrlCreateUpdown($updowninput)

; Close Tabs

GUICtrlCreateTabItem("")

; Display GUI

GuiSetState(@SW_SHOW)

; Цикл проверки событий элементов управления GUI

While 1

$guimsg = GUIGetMsg()

Select

Case $guimsg = $dummybutton

GUICtrlSendToDummy($dummy)

Case $guimsg = $dummy

MsgBox(0,"Dummy Example","You have clicked the dummy button.")

Case $guimsg = $GUI_EVENT_CLOSE

Exit

EndSelect

Wend

Page 20: AutoIt v3: краткое Оглавление руководствоautoit-script.ru/autoit_rv_ua/files/Other/AutoIt_v3_Kratkoe... · Введение в AutoIt и его ... GUI

Рисунок 4. Набор выведенных элементов управления GUI

Если выполнить скрипт из примера 8, то будут созданы четыре формы с

элементами управления пользовательским интерфейсом (см. рисунок 4).

Обращение с данными

При создании графического интерфейса пользователя необходимо назначить

переменные для всех элементов управления, впоследствии их можно использовать в

качестве значений в функциях. Например, при создании комбинированного списка

мы создаем переменную и в качестве ее значения указываем соответствующую

функцию; это позволяет считать данные из созданного комбинированного списка

во время выполнения функции . Пример 9 показывает, как GuiCtrlRead()

выполнить событие, основанное на значении из комбинированного списка:

Пример 9. Функция GuiCtrlRead()

#include <GuiConstants.au3>

; GUI

GuiCreate("Combo Example",200,80)

; Combo Box

$combobox = GuiCtrlCreateCombo("Notepad",l0,l0,l20,20)

GuiCtrlSetData(-l,"Paint|Command Prompt")

; Button

$button = GuiCtrlCreateButton("Go",l0,40,60,20)

Page 21: AutoIt v3: краткое Оглавление руководствоautoit-script.ru/autoit_rv_ua/files/Other/AutoIt_v3_Kratkoe... · Введение в AutoIt и его ... GUI

Рисунок 5. Результат выполнения примера 9

GUISetState(@SW_SHOW)

; Проверка событий в теле цикла

While 1

$guimsg = GUIGetMsg

Select

Case $guimsg = $button

MsgBox(0,"","You chose " & GUICtrlRead($combobox) & ".")

Select

Case GUICtrlRead($combobox) = "Notepad"

Run("notepad.exe")

Exit

Case GUICtrlRead($combobox) = "Paint"

Run("mspaint.exe")

Exit

Case GUICtrlRead($combobox) = "Command Prompt"

Run("cmd.exe")

Exit

EndSelect

Case $guimsg = $GUI_EVENT_CLOSE

Exit

EndSelect

Wend

С помощью структуры Select...Case отслеживаются события, происходящие в

функции . В свою очередь эта структура вложена в GUICtrlRead($combobox)

аналогичную структуру, управляемую функцией . Пример 9 создает GUIGetMsg()

комбинированный список, показанный на рисунке 5.

Пользовательские функции Функции могут быть вызваны в скрипте в любое время. AutoIt поставляется с

набором заранее определенных функций, призванных решать установленный круг

задач. Сообществом AutoIt, целью повышения его функциональности, также

создается множество пользовательских функций. Для использования

пользовательских функций в скрипте необходимо воспользоваться командой

. Вы можете создавать и свои собственные функции. #include

Page 22: AutoIt v3: краткое Оглавление руководствоautoit-script.ru/autoit_rv_ua/files/Other/AutoIt_v3_Kratkoe... · Введение в AutoIt и его ... GUI

Создание функций — Func, Return, EndFunc Синтаксис пользовательских функций выглядит следующим образом:

Func functioname ( [Const] [ByRef] $paraml, ..., [Const] [ByRef]

$paramN,_

$optionalparl = value, ...)

...

[Return [value]]

EndFunc

В следующих разделах разъясняется назначение компонентов функций.

Const (константа) и ByRef (переход по ссылке) Ключевые слова и могут одновременно применяться к одному и тому Const ByRef

же параметру, причем порядок, в котором они записаны, не имеет никакого

значения. При использовании и необходимо помнить: Const ByRef

параметр является опциональным и применяется только к объявленным Const

переменным, причем переменную-константу можно передать в функцию только

с помощью -параметра. Const

параметр также является опциональным, в качестве его значения может ByRef

быть только переменная. При использовании этого параметра, все изменения

передаются в исходную переменную. По умолчанию, внутри функции

используется копия переменной.

Параметры функции

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

умолчанию, она может быть вызвана с пустыми параметрами как , при function()

этом будут использованы значения по умолчанию. После выполнения функции

открывается окно сообщения подтверждающее, что значение переменной $z

является : 5

Func function($x = 2, $y = 3)

$x + $y = $z

MsgBox(0,"$z's value",$z)

EndFunc

Переменные могут быть объявлены по-разному, но значения по умолчанию при

вызове функции используются только в том случае, если ее параметры явно не

определены. Когда функция изменяется в ходе исполнения, переменные должны

быть явно объявлены при вызове функции. Примером корректного вызова

нижеприведенной функции является , в результате окно сообщения function(5,3)

выведет на экран значение . Если или не объявлены явно, функция не будет 8 $x $y

исполняться должным образом:

Page 23: AutoIt v3: краткое Оглавление руководствоautoit-script.ru/autoit_rv_ua/files/Other/AutoIt_v3_Kratkoe... · Введение в AutoIt и его ... GUI

Func function($x, $y)

$x + $y = $z

MsgBox(0,"$z's value",$z)

EndFunc

Return Команда Return используется, чтобы выйти из функции. При завершении работы функция по умолчанию возвращает значение , но возвращаемое значение может 0

быть переопределено. Следующий пример выводит на экран окно сообщения с именем текущего пользователя:

MsgBox(0,"Currently logged on user", user())

Func user()

$user = @UserName

Return $user EndFunc

Библиотеки пользовательских функций Большое количество библиотек с пользовательскими функциями (UDF – User-

Defined Functions ) доступны на форуме Autolt. Список находящихся в обращении

пользовательских функций AutoIT можно получить по адресу:

http://www.autoitscript.com/forum/index.php?showtopic=45167. Далее приведено

описание некоторых UDF-библиотек:

Auto3Lib

Разработчиком является Paul Campbell (логин PaullA). Эта библиотека включает

более 1,200 функций, в том числе элементы управления анимацией,

параметрами даты и времени, основными настройками, IP-адресами, списками,

меню, календарем, строкой состояния, табуляцией, панелью инструментов

Window, всплывающими подсказками, деревом элементов и множество других.

SysTray_UDF

Разработчик залогинен как Tuape. Библиотека позволяет получать информацию

из элементов системного трэя и управлять им.

Microsoft Word Automation Library Разработчик - Bob Anthony (логин big_daddy). Библиотека позволяет производить

манипуляции с документами Microsoft Word.

ExcelCOM_UDF

Логин разработчика Locodarwin. Библиотека позволяет производить

манипуляции и создавать рабочие книги Microsoft Excel.

Я создал демонстрационную пользовательскую функцию, предназначенную для

нахождения на экране определенных изображений по чек-сумме их пикселей

указанных в . Пользовательская функция описана PixelChecksum() _findchecksum

Page 24: AutoIt v3: краткое Оглавление руководствоautoit-script.ru/autoit_rv_ua/files/Other/AutoIt_v3_Kratkoe... · Введение в AutoIt и его ... GUI

ниже. Этот код необходимо сохранить как findchecksum_UDF.au3 и поместить его в

C:\Program Files\AutoIt3\Include (или в папку в директории с AutoIt3, Include

если она расположена на диске по иному адресу) или в папке, где вы позже

сохраните скрипт из примера 10 (после его создания и выполнения). Функция

_findchecksum() возвращает , если чек-сумма не обнаружена, иначе возвращает 0

координаты размещения изображения иx ( соответствует , y [0] x [1] соответствует

). y

Пользовательская функция _findpixelchecksum подходит для автоматизации задач

по открытию или перемещению файлов изображений. Популярное поле для

данного типа автоматизации - модификация видеоигр. Есть много онлайновых

ролевых игр, для которых программируются скрипты, с их помощью можно

приобрести необходимый опыт и "отшлифовать" свои навыки по автоматизации

повторяющихся процессов. ; ===================================================================================

; _findchecksum UDF v1 - June 24, 2007

; Автор Andy Flesner

; Произведено и протестировано Windows XP Service Pack 2

; http://autoit.flesner.com

#cs

Синтаксис имеет вид: _findchecksum($checksum, $width, $height, $pcolor, $x = 0, _

$y = 0, $d_width = @DesktopWidth, $d_height = @DesktopHeight), где:

$checksum – чек-сумма искомой области

$width – ширина области

$height – высота области

$pcolor – цвет верхнего левого пикселя искомой области

$x – начальная координата Х

$y – начальная координата У

$D_Width – общая ширина зоны поиска, по умолчанию это ширина разрешения экрана

$D_Height - общая высота зоны поиска, по умолчанию это высота разрешения экрана

Функция возвращает координаты x и y, соответствующие координатам верхнего

левого пикселя искомого изображения. Например:

$coordinates = _findchecksum($checksum, $width, $height, $pcolor)

Координата x будет выведена как $coordinates[0], а координата y будет

выведена как $coordinates[l].

Если координаты не будут найдены, функция вернет значение 0.

#ce

; ===================================================================================

Func _findchecksum($checksum, $width, $height, $pcolor, $x= 0, $y = 0, _

$d_width = @DesktopWidth, $d_height = @DesktopHeight)

$current_y = $d_height - 1

While 1

$xy = PixelSearch($x, $y, $d_width- 1, $current_y, $pcolor)

If @error AND $current_y = ($d_height - 1) Then

Return 0

Page 25: AutoIt v3: краткое Оглавление руководствоautoit-script.ru/autoit_rv_ua/files/Other/AutoIt_v3_Kratkoe... · Введение в AutoIt и его ... GUI

ElseIf @error Then

$x = 0

$y = $current_y + 1

$current_y = ($d_height - 1)

ElseIf $checksum = PixelCheckSum($xy[0], $xy[1],$xy[0] + $width, _

$xy[l] + $height) Then

Return $xy

Else

$x = $xy[0] + 1

$y = $xy[1]

$current_y = $y

EndIf

WEnd

EndFunc

Пример 10 определяет зону поиска, вычисляет чек-суммы имеющихся областей, а

затем находит чек-сумму, введенную пользователем с клавиатуры.

Пример 10. Пользовательская функция findchecksum()

#include <findchecksum_UDF.au3>

Global $checksum, $coord, $pcolor

; Указанная в чек-сумме ширина

Global $width = 30

; Указанная в чек-сумме высота

Global $height = 30

HotKeySet("{ENTER}","checksum_record")

Global $instructions1 = "Поместите курсор мыши в левую верхнюю " & @LF & _

"часть области нажмите ENTER для ее записи."

Global $instructions2 = "Нажмите F для поиска записанной зоны."

While $checksum = “ “

$coord = MouseGetPos()

$pcolor = PixelGetColor($coord[0], $coord[1])

ToolTip($instructions1 & @LF & @LF & "x = " & $coord[0] & @LF & "y = " & $coord[1] _

& @LF & @LF & "Decimal Pixel Color = " & $pcolor,$coord[0] - 250, $coord[1] - 100)

Sleep(100)

Wend

HotKeySet("f","Поиск чек-суммы")

While 1

ToolTip($instructions2)

Sleep(100)

Page 26: AutoIt v3: краткое Оглавление руководствоautoit-script.ru/autoit_rv_ua/files/Other/AutoIt_v3_Kratkoe... · Введение в AutoIt и его ... GUI

Рисунок 6. «Подсказки» к пользовательской функции findchecksum(),

описанной в примере 10

Wend

Func checksum_record()

$checksum = PixelChecksum($coord[0], $coord[1], $coord[0] + $width, _

$coord[1] + $height)

HotKeySet("{ENTER}")

EndFunc

Func checksum_find()

ToolTip("")

$found = _findchecksum($checksum, $width, $height,$pcolor)

If$found = 0 Then

MsgBox(4096,"Ошибка","Чек-сумма не найдена.")

Exit

Else

MouseMove($found[0] + ($width / 2), $found[1] + ($height / 2), 1000)

ToolTip("Обнаружено!")

Sleep(5000)

ToolTip("")

MsgBox(0,"Чек-сумма найдена", "Координаты искомого объекта x=" &_

$found[0] + ($width / 2) & " y=" & $found[1] + ($height / 2) & ".")

Exit

EndIf

EndFunc

Скомпилируйте и запустите код из примера 10. Поместите курсор мыши в область

на экране, которую впоследствии потребуется распознать, и нажмите ENTER. Затем

переместите курсор в другую область экрана. Нажав "горячую" клавишу F, мы

запускаем процесс поиска области экрана с определенной чек-суммой, и курсор

перемещается в центр объекта с искомой чек-суммой, которая ранее была сохранена

при нажатии клавиши ENTER. Пример действия программы проиллюстрирован на

рисунке 6.

Page 27: AutoIt v3: краткое Оглавление руководствоautoit-script.ru/autoit_rv_ua/files/Other/AutoIt_v3_Kratkoe... · Введение в AutoIt и его ... GUI

Условные выражения и операторы цикла

Условные выражения и операторы цикла упрощают исходный код и делают

возможным решение сложных задач.

Вместо того, чтобы повторять тот же самый код много раз, Вы можете просто

выполнить оператор цикла, который самостоятельно повторяет код, пока не

соблюдено заданное условие. Пока выражение является истинным, оператор будет

выполняться в рамках цикла.

Условные операторы позволяют Вам выполнять задачи, основанные на истинности

обрабатываемого выражения. Если выражение является истинным, оператор

подлежит выполнению.

Условные операторы

Условный оператор выполняется в зависимости от того, соблюдены ли

определенные условия. В AutoIt имеется три типа условных операторов:

1. . Оператор If...Then...Else выполняется если заданное условие If

является истинным; в противном случае выполняется оператор . В Else

приведенном примере, в случае ввода значения , выводится сообщение, в 2

противном случае происходит прекращение выполнения скрипта:

Global $number = 2

If $number = 2 Then

MsgBox(0, "Message", "The value of $number is " & $number & ".")

Else

Exit

EndIf

Операторы могут быть вложенными. Это означает, что оператор может If

содержать в своем теле многократные операторы , что и показано в If

следующем примере:

Global $number = 2

If @OSVersion = "WIN_XP" Then

If @Username = "Administrator" Then

If $number = "2" Then

MsgBox(0, "Message", "The value of $number is " & $number & ".")

Else

Exit

EndIf

Else

MsgBox(4096, "Error", "You must be logged on as Administrator.")

EndIf

Else

MsgBox(4096, "Error", "You must be running Windows XP.")

EndIf

Page 28: AutoIt v3: краткое Оглавление руководствоautoit-script.ru/autoit_rv_ua/files/Other/AutoIt_v3_Kratkoe... · Введение в AutoIt и его ... GUI

используется, чтобы добавить несколько выражений для проверки в теле ElseIf

оператора, хотя обычно, более эффективными для оценки многократных

выражений являются структуры или . Select...Case Switch...Case

Следующий пример выводит на экран оператор , который использует : If ElseIf

If @OSVersion = "WIN_VISTA" Then

MsgBox(0, "OS Version", "You are running Windows Vista.")

ElseIf @OSVersion = "WIN_2003" Then

MsgBox(0, "OS Version", "You are running Windows 2003.")

ElseIf @OSVersion = "WIN_XP" Then

MsgBox(0, "OS Version", "You are running Windows XP.")

ElseIf @OSVersion = "WIN_2000" Then

MsgBox(0, "OS Version", "You are running Windows 2000.")

Else

EndIf

В операторах могут также использоваться булевы значения ( ) и If AND, OR, NOT

логические операторы ( ). Вот пример, который <, <=>, >=, <>, =, ==

использует и булевы значения и логические операторы:

Global $num1 = InputBox("Number 1","Number 1: ","")

Global $num2 = InputBox("Number 2","Number 2: ","")

If @OSVersion = "WIN_XP" AND @OSServicePack = "Service Pack 2" Then

If $num1 + $num2 > 10 Then

MsgBox(0,"Greater than 10","The sum of Number 1 and Number 2 is " & _

"greater than 10.")

ElseIf $num1 + $num2 < 10 Then

MsgBox(0,"Less than 10","The sum of Number 1 and Number 2 is less " & _

"than 10.")

Else

MsgBox(0,"Must be 10","If not less than or greater than 10, the sum " & _

"of Number 1 and Number 2 must be equal to 10.")

EndIf

Else

MsgBox(4096,"Error","You must be running Windows XP SP2.")

EndIf

Если установленная на машине пользователя версия Windows не является XP

Service Pack 2, пользователь увидит всплывающее сообщение о необходимости

запустить Windows XP SP2. Если пользователь запустит XP SP2, скрипт исполнит

выражение . Если полученное значение будет больше , $num1 + $num2 10

пользователь увидит об этом сообщение, в противном случае он получит другие

прописанные в скрипте сообщения.

2. . В операторе выбора Select...Case , оценивается истинность или If

Page 29: AutoIt v3: краткое Оглавление руководствоautoit-script.ru/autoit_rv_ua/files/Other/AutoIt_v3_Kratkoe... · Введение в AutoIt и его ... GUI

ложность выражения. Если выражение истинно, условие ассоциируется с выражением и оно выполняется. Оператор Select...Case является подобным, но вместо оценки одного выражения на предмет истинности или ложности он проверяет сразу несколько выражений. Оператор Select...Case показан далее:

Select

Case @OSVersion = "WIN_VISTA"

MsgBox(0, "OS Version", "You are running Windows Vista.")

Case @OSVersion = "WIN_2003"

MsgBox(0, "OS Version", "You are running Windows 2003.")

Case @OSVersion = "WIN_XP"

MsgBox(0, "OS Version", "You are running Windows XP.")

Case @OSVersion = "WIN_2000"

MsgBox(0, "OS Version", "You are running Windows 2000.")

EndSelect

В результате исполнения скрипта пользователь получает сообщение о том, какая

версия Windows запущена в данный момент: Vista, 2003, XP или 2000.

Как и оператор , оператор If Select...Case может быть вложенным и позволяет

пользователю обращаться с булевыми и логическими операторами. Вместо Else

(как в операторе ), здесь используется оператор , который If Case Else

выполняет ряд задач. Case Else выполняется, если ни одно из условий не

является истинным. В следующем примере продемонстрированы вложенные

операторы Select...Case использующие булевы и логические выражения:

Global $num1 = InputBox("Number 1","Number 1: ","")

Global $num2 = InputBox("Number 2","Number 2: ","")

Select

Case @OSVersion = "WIN_XP" AND @OSServicePack = "Service Pack 2"

Select

Case $num1 + $num2 > 10

MsgBox(0,"Greater than 10","The sum of Number 1 and Number 2 " & _

"is greater than 10.")

Case $num1 + $num2 < 10

MsgBox(0,"Less than 10","The sum of Number 1 and Number 2 is " & _

"less than 10.")

Case $num1 + $num2 = 10

MsgBox(0,"Equals 10","The sum of Number 1 and Number 2 is " & _

"equal to 10.")

EndSelect

Case Else

MsgBox(4096,"Error","You must be running Windows XP SP2.")

EndSelect

3. . Данный оператор аналогичен оператору ; Switch...Case Select...Case

Page 30: AutoIt v3: краткое Оглавление руководствоautoit-script.ru/autoit_rv_ua/files/Other/AutoIt_v3_Kratkoe... · Введение в AutoIt и его ... GUI

отличие состоит в оценке выражения. В операторе Switch...Case оцениваются

данные, заявленные в теле оператора. С целью определения истинности условий

данные оцениваются точно так же, как в операторе . (Если ни Select...Case

одно из условий не является истинным, выполняется оператор .) Case Else

Преимуществом и особенностью Switch...Case является то, что здесь есть

параметр , с помощью которого можно задать диапазон значений, в пределах To

которых выражение является истинным. Операторы Switch...Case могут также

быть вложенными. Далее следует пример вложенного оператора , Switch...Case

использующего параметр : To

Global $num1 = InputBox("Number 1","Number 1: ","")

Global $num2 = InputBox("Number 2","Number 2: ","")

Switch @OSVersion

Case "WIN_XP"

Switch @OSServicePack

Case "Service Pack 2"

Switch $num1 + $num2

Case 0 To 9

MsgBox(0,"Less than 10","The sum of Number 1 and" &_

"Number 2 is less than 10.")

Case 10

MsgBox(0,"Equals 10","The sum of Number 1 and Number " & _

"2 is equal to 10.")

Case Else

MsgBox(0,"Greater than 10","The sum of Number 1 and " & _

"Number 2 is greater than 10.")

EndSwitch

Case Else

MsgBox(4096,"Error","You must be running Windows XP Service " & _

"Pack 2.")

EndSwitch

Case Else

MsgBox(4096,"Error","You must be running Windows XP.")

EndSwitch

Операторы цикла Операторы цикла - это операторы, которые повторяют себя неоднократно. В AutoIt

v3 доступны четыре типа операторов цикла:

1. . Синтаксис оператора For...Next For...Next следующий:

For <variable> = <start> To <stop> [Step <stepval>]

Page 31: AutoIt v3: краткое Оглавление руководствоautoit-script.ru/autoit_rv_ua/files/Other/AutoIt_v3_Kratkoe... · Введение в AutoIt и его ... GUI

Statements

...

Next

Счетчик цикла автоматически определяется как локальная переменная даже при

включенном параметре . В ходе цикла пошагово перебираются MustDeclareVars

значения начиная со значения <stаrt> (по умолчанию шаг цикла <stepval>

равняется 1). Цикл завершается, как только значение переменной превышает

значение . <stop>

Значения и <stop> <stepval> могут изменяться, но считываются они только

один раз, при старте цикла. Структура For...Next может быть вложенной в

другие операторы. Далее следует пример оператора , в котором For...Next

скрипт выводит на экран 10-секундный обратный отсчет, после чего открывается

окно сообщения, которое говорит: “Бум!” :

For $variable = 10 To 1 Step -1

SplashText0n("Countdown", $variable, 65, 20)

Sleep(1000)

Next

Splash0ff()

MsgBox(0,"", "Boom!")

2. For...In...Next Данный тип операторов цикла используется для работы с .

данными массивов или коллекций объектов. Оператор имеет следующий

синтаксис:

For <variable> In <expression>

Statements

Next

Если коллекция объектов не содержит элементов, то цикл пропускается, а

<variable> будет содержать пустую строку. Если коллекция не является

объектом или массивом, выполнение скрипта завершается сообщением об

ошибке. Структура For...In...Next может быть вложенной. Далее приведен

пример использования структуры For...In...Next для работы с данными

массива:

Global $array[4]

$array[0]="w"

$array[1]="x"

$array[2]="y"

$array[3]="z"

For $element IN $array

MsgBox(0,"Current $array item", $element)

Next

Page 32: AutoIt v3: краткое Оглавление руководствоautoit-script.ru/autoit_rv_ua/files/Other/AutoIt_v3_Kratkoe... · Введение в AutoIt и его ... GUI

3. Данный оператор выполняет цикл до тех пор, пока значение Do...Until.

Until не станет истинным, и имеет следующий синтаксис:

Do

Statements

...

Until <expression>

В ходе выполнения цикла происходит проверка значений, пока не будет достигнуто самое последнее. Структура Do...Until может быть вложенной. Следующий пример использует Do...Until для вывода 10-секундного

обратного отсчета, после которого появляется сообщение:

$variable = 10

Do

SplashTextOn("Countdown", $variable, 65, 20)

Sleep(1000)

$variable = $variable - 1

Until $variable = 0

SplashOff()

MsgBox(0,"","Boom!")

4. Пока условие является истинным, выполняются указанные в While...WEnd.цикле команды. Отличие от структуры Do...Until состоит в том, что значение переменной проверяется до запуска цикла, при этом, если значение переменной не соответствует заданным условиям (является ложным) операторы в теле цикла выполняться не будут, и цикл не запустится. Структура While...WEnd имеет следующий синтаксис: While <expression>

Statements ...

Wend

Приведенный далее цикл While...Wend будет выполняться, пока значение не

достигнет . Данный тип циклов можно использовать в скриптах для 1

программирования ожидания каких-либо действий или процессов (например,

нажатие «горячей» клавиши): $variable = 10

While $variable > 0

SplashTextOn("Countdown",$variable,65,20)

Sleep(1000)

$variable = $variable - 1

WEnd

SplashOff()

MsgBox(0,"","Boom!")

Page 33: AutoIt v3: краткое Оглавление руководствоautoit-script.ru/autoit_rv_ua/files/Other/AutoIt_v3_Kratkoe... · Введение в AutoIt и его ... GUI

Пока значение переменной $variable более , будет производиться обратный 0

отсчет в секундах от 10 до 1. По завершении цикла появится сообщение “Boom!”

With...EndWith

Данный тип операторов не производит оценку значений как условные операторы

или операторы цикла. В файле помощи Autolt структура With...EndWith отнесена

к категории операторов цикла, но реально она используется только для упрощения

программного кода ссылок на переменные объектного типа. Синтаксис структуры

выглядит так:

With <expression>

Statements

...

EndWith

Выражения должны быть объектного типа. Пример 11 и пример 12 код ссылки на

объект, который становится более простым при использовании : With...EndWith

Пример 11. Длинный метод без использования With...EndWith

#cs Настоящий скрипт составлен без использования структуры With...EndWith #ce

$object = ObjCreate("InternetExplorer.Application.1")

$object.Visible = 1

$object.Height = 768

$object.Width = 1024

$object.Navigate("http://www.aismarthomes.com/")

Пример 12. Простой метод с использованием With...EndWith

#cs Приведенный пример демонстрирует как структура With...EndWith упрощает код #ce

$object = ObjCreate("InternetExplorer.Application.1")

With $object

.Visible = 1

.Height = 768

.Width = 1024

.Navigate("http://www.aismarthomes.com/")

EndWith

Данные переменной $object содержащие , , .Visible .Height .Width и .Navigate

автоматически выполняются внутри структуры . На рисунке 7 With...EndWith

показан результат выполнения скомпилированного скрипта.

Page 34: AutoIt v3: краткое Оглавление руководствоautoit-script.ru/autoit_rv_ua/files/Other/AutoIt_v3_Kratkoe... · Введение в AutoIt и его ... GUI

Рисунок 7. Пример 11 и пример 12 запускают окно Internet Explorer размером 1024х768

COM - объекты (Component Object Models)

СОМ - расширения обеспечивают общий интерфейс для работы с приложениями в

среде Microsoft. Программы имеют определенные COM-объекты, которые могут

использоваться в AutoIt (и в других языках программирования), для управления

приложениями и выполнения в их пределах определенных задач. Чтобы

использовать COM-объекты, необходимо знать имя объекта, его свойства и методы.

Чтобы найти данные объекты и сведения о их свойствах и методах, можно

использовать Microsoft OLE/COM Object Viewer, который является частью набора

ресурсов Windows. Загрузить Microsoft OLE/COM Object Viewer можно здесь:

http://download.microsoft.com/download/win2000platform/oleview/ 1.00.0.1/nt5/en-us/oleview_setup.exe

Если при запуске oleview.exe вы получите сообщение об ошибке в библиотеке

, загрузите файл: http://download.microsoft.com/download/2Zf/ iviewers.dll1/2f15a59b-6cd7-467b-8ff2-f162c3932235/ovi386.exe

Запустите скачанный файл ovi386.exe и распакуйте его содержимое в

. Скопируйте C:\MSTOOLS\BIN iviewers.dll из C:\MSTOOLS\BIN в директорию с

установленным . После этого зарегистрируйте библиотеку с oleview_setup.exe

помощью regsvr32 iviewers.dll в директории с oleview_setup.exe.

При просмотре объектов с OLE/COM Object Viewer учтите, что в AutoIT могут

использоваться только объекты управления с TypeLib и IDispatch.

Page 35: AutoIt v3: краткое Оглавление руководствоautoit-script.ru/autoit_rv_ua/files/Other/AutoIt_v3_Kratkoe... · Введение в AutoIt и его ... GUI

Далее следует пример COM-объекта, который создает электронную таблицу Excel,

после чего закрывает программу Excel:

$oExcel = ObjCreate("Excel.Application") ; создание объекта Excel

With $oExcel

.Visible = 1 ; открытие Excel

.WorkBooks.Add ; создание новой электронной таблицы

.Quit ; закрытие Excel

EndWith

Для получения более детальной информации о COM – объектах ознакомьтесь с

файлом помощи Autolt v3.

Примеры автоматизации

Редактирование системного реестра, копирование файлов, запуск от имени

пользователя, контроль над клавиатурой и мышью, работа с COM – объектами –

чего только нельзя сделать с помощью AutoIt.

Данный раздел полностью посвящен скриптам. Я создавал и использовал их с

правами сетевого администратора. Все скрипты были переработаны для данной

книги; скрипты создавались и тестировались на Microsoft Windows XP Service Pack 2.

Проверка версии программы McAfee AntiVirus Эта программа получает сведения о версии используемого McAfee AntiVirus, версии

ePO Agent, и дате создания файла определений. Скрипт был создан рядом

пользователей на основании доступных доменных ресурсов. В первую очередь

проверяется наличие установленного антивируса и/или ePO Agent, после чего

проверяется файл определений за последние пять рабочих дней (McAfee обычно не

выпускает релизы определений в выходные дни). В данном скрипте имеется ссылка

на файл . Он описывается далее в разделе User Lockout. Пример 13 Lock.exe

оперирует вложенными операторами , структурой If Select...Case и

пользовательскими функциями.

Пример 13. Проверка версии программы McAfee AntiVirus

#include <Date.au3> ; подключение констант даты и времени

; Объявление всех глобальных переменных

; =====================================================================================

Global

$dat71, $dat71monthday, $dat71year, $dat71format, $dat80i, $dat80imonthday, _

$dat80iyear, $dat80iformat, $dat85, $dat85monthday, $dat85monthday, _

$dat85year, $dat85format, $datdate, $sLongDayName, $currentdate, $datediff, _

Page 36: AutoIt v3: краткое Оглавление руководствоautoit-script.ru/autoit_rv_ua/files/Other/AutoIt_v3_Kratkoe... · Введение в AutoIt и его ... GUI

$answer, $username, $epoversion, $eporeg, $updatepath, $weekday

; Проверка прав текущего пользователя

; =====================================================================================

$username = EnvGet("USERNAME")

; Получение из системного реестра сведений о версии ePO Agent

; =====================================================================================

$eporeg = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Network Associates\ePolicy " & _

"Orchestrator\Application Plugins\EPOAGENT3000","Version")

; Сокращение значения версии ePO Agent до трех левых знаков и проверка значения ключа

; =====================================================================================

$epoversion = StringLeft($eporeg,3)

If $epoversion = "3.6" Then ; не делать ничего

ElseIf $epoversion = "" Then ; ключ реестра отсутствует, Agent не установлен

RunWait("Lock.exe","") ; блокировка соединения

MsgBox(0,"EPO Agent не установлен!","Вы не можете обновить Virus-Scan" & _

" Agent! Соединение заблокировано! Нажмите OK для выхода.")

Exit

Else ; установлена устаревшая версия EPO Agent

RunWait("Lock.exe","") ; блокировка соединения

MsgBox(0,"EPO Agent устарел!","Невозможно обновить текущий Virus-Scan " & _

"Agent! Соединение заблокировано! Нажмите OK для выхода.")

Exit

EndIf

; Запуск функции DatDate() для определения даты создания файла определений

; =====================================================================================

DatDate()

Func DatDate()

; получение ключа реестра со сведениями о дате создания McAfee Scan Engine 7.1

$dat71 = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Network Associates\ePolicy " & _

"Orchestrator\Application Plugins\VIRUSCAN7100","DatDate")

; получение из ключа реестра сведений о дне и месяце

$dat71monthday = StringTrimRight($dat71, 5)

; получение из ключа реестра сведений о годе

$dat71year = StringTrimLeft($dat71, 6)

; приведение даты в формат YYYY/MM/DD для дальнейших вычислений

$dat71format = ($dat71year & "/" & $dat71monthday)

;получение ключа реестра со сведениями о дате создания McAfee Scan Engine 8.0i

$dat80i = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Network Associates\ ePolicy " & _

"Orchestrator\Application Plugins\VIRUSCAN8000","DatDate")

Page 37: AutoIt v3: краткое Оглавление руководствоautoit-script.ru/autoit_rv_ua/files/Other/AutoIt_v3_Kratkoe... · Введение в AutoIt и его ... GUI

; получение из ключа реестра сведений о дне и месяце

$dat80imonthday = StringTrimRight($dat80i, 5)

; получение из ключа реестра сведений о годе

$dat80iyear = StringTrimLeft($dat80i, 6)

приведение даты в формат YYYY/MM/DD для дальнейших вычислений

$dat80iformat = ($dat80iyear & "/" & $dat80imonthday)

; получение ключа реестра со сведениями о дате создания McAfee Scan Engine 8.5.0i

$dat85 = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Network Associates\ePolicy " & _

"Orchestrator\Application Plugins\VIRUSCAN8600","DatDate")

; получение из ключа реестра сведений о дне и месяце

$dat85monthday = StringTrimRight($dat85, 5)

; получение из ключа реестра сведений о годе

$dat85year = StringTrimLeft($dat85, 6)

приведение даты в формат YYYY/MM/DD для дальнейших вычислений

$dat85format = ($dat85year & "/" & $dat85monthday)

; определение версии антивирусного сканера

; =====================================================================================

If $dat71 = "" And $dat80i = "" And $dat85 = "" Then

RunWait("Lock.exe","") ; Блокировка соединения

MsgBox(0, "Не определен антивирус!", & _

"Установлен другой ативирус. Нажмите OK, чтобы закрыть сообщение.")

ElseIf $dat71 = "" And $dat80i = "" Then ; установлена версия 8.5.0i

$datdate = $dat85format

ElseIf $dat71 = "" And $dat85 = "" Then ; установлена версия 8.0i

$datdate = $dat80iformat

ElseIf $dat80i = "" And $dat85 = "" Then ; установлена версия 7.1

$datdate = $dat71format

Else

EndIf

; определение директории с файлом mcupdate.exe

; =====================================================================================

If FileExists("C:\Program Files\Network Associates\VirusScan\mcupdate.exe")Then

$updatepath = "C:\Program Files\Network Associates\VirusScan\mcupdate.exe"

ElseIf FileExists("C:\Program Files\McAfee\VirusScan Enterprise\mcupdate.exe") Then

$updatepath = "C:\Program Files\McAfee\VirusScan Enterprise\mcupdate.exe"

Else

EndIf

; конвертация даты и определение дня недели

; =====================================================================================

; конвертация даты в текущий день недели для выполнения структуры Select...Case

$sLongDayName = _DateDayOfWeek( @WDAY )

Page 38: AutoIt v3: краткое Оглавление руководствоautoit-script.ru/autoit_rv_ua/files/Other/AutoIt_v3_Kratkoe... · Введение в AutoIt и его ... GUI

; извлечение системных переменных для приведения даты к формату YYYY/MM/DD

$currentdate = ( @YEAR & "/" & @MON & "/" & @MDAY )

; вычисление разницы между текущей датой и датой создания файла определений

$datediff = _DateDiff( 'd', $datdate, $currentdate) ;

EndFunc

Select

Case $sLongDayName = "Monday"

$weekday = 2

Case $sLongDayName = "Tuesday"

$weekday = 2

Case $sLongDayName = "Wednesday

$weekday = 2

Case $sLongDayName = "Thursday"

$weekday = 2

Case $sLongDayName = "Friday"

$weekday = 2

Case $sLongDayName = "Saturday"

$weekday = 0

Case $sLongDayName = "Sunday"

$weekday = 1

EndSelect

If $datediff >= (5 + $weekday) Then ; если определения старее 5 рабочих дней

If $username = "Administrator" Then ; сообщить об ошибке и закрыть скрипт

MsgBox(0,"Anti-Virus Out of Date","Your are currently logged onto a " & _

"machine with out of date Anti-Virus. Click OK to exit.")

Exit

Else

EndIf

RunWait("Lock.exe","") ; блокировка соединения

$answer = MsgBox(4,"AntiVirus устарел","Определения не актуальны " & _

"Аккаунт заблокирован, пока Anti-Virus не будет обновлен. Обновить сейчас?")

If $answer = 6 Then ; согласие на обновление

RunWait($updatepath) ; запуск инструкции по обновлению DatDate()

; запуск проверки для определения обновлена ли база данных полностью

; ===============================================================================

; если данные определений старее пяти дней, сообщить об ошибке

If $datediff >= (5 + $weekday) Then

MsgBox(0,"Error","Обновление завершено. Нажми OK для выхода.")

Exit

; если данным определений менее пяти дней вывести сообщение об успешном обновлении

ElseIf $datediff < (5 + $weekday) Then

Page 39: AutoIt v3: краткое Оглавление руководствоautoit-script.ru/autoit_rv_ua/files/Other/AutoIt_v3_Kratkoe... · Введение в AutoIt и его ... GUI

MsgBox(0,"Обновление завершено","Антивирусная программа " & _

"полностью обновлена! Нажмите OK для выхода.")

Exit

EndIf

ElseIf $answer = 7 Then ; no is clicked

MsgBox(0,"Ошибка","Антивирусная программа не обновлена. " & _

"Аккаут был заблокирован.")

EndIf

Else

EndIf

Exit

Исправления для утилиты AutoPatcher

Скрипт примера 14 использует функции FileCopy, WinWait, WinActive, WinAc

и . Цель создания программы – исправление tivate, WinClose, Run RunWait

некоторых проблем в старой версии утилиты AutoPatcher, используемой для

обновления Windows.

Пример 14. Исправления для утилиты AutoPatcher

#NoTrayIcon ; скрыть иконку в трее

; выполнение программы

; =====================================================================================

Run("C:\Program Files\AutoPatcher\Tools\AutoPatcher Module Editor.exe")

; ожидание открытия программы

; =====================================================================================

WinWait("AutoPatcher Module Editor 2.0","")

; проверка видимости активного окна, если окно не активно – активировать

; =====================================================================================

If Not WinActive("AutoPatcher Module Editor 2.0","") Then _

WinActivate("AutoPatcher Module Editor 2.0","")

; ожидание активации окна

; =====================================================================================

WinWaitActive("AutoPatcher Module Editor 2.0","")

; закрытие окна программы

; =====================================================================================

WinClose("AutoPatcher Module Editor 2.0","")

Page 40: AutoIt v3: краткое Оглавление руководствоautoit-script.ru/autoit_rv_ua/files/Other/AutoIt_v3_Kratkoe... · Введение в AutoIt и его ... GUI

; копирование необходимых файлов в C:\WINDOWS\system32 и перезапись имеющихся

; =====================================================================================

FileCopy("C:\Program Files\AutoPatcher\bin\COMDLG32.OCX", _

"C:\WINDOWS\system32\COMDLG32.OCX",1)

FileCopy("C:\Program Files\AutoPatcher\bin\COMCTL32.OCX", _

"C:\WINDOWS\system32\COMCTL32.OCX",1)

FileCopy("C:\Program Files\AutoPatcher\bin\FM20.DLL", _

"C:\WINDOWS\system32\ FM20.DLL",1)

FileCopy("C:\Program Files\AutoPatcher\bin\FM20ENU.DLL", _

"C:\WINDOWS\system32\FM20ENU.DLL",1)

FileCopy("C:\Program Files\AutoPatcher\bin\MSCOMCTL.OCX", _

"C:\WINDOWS\system32\MSCOMCTL.OCX",1)

FileCopy("C:\Program Files\AutoPatcher\bin\SSubTmr6.dll", _

"C:\WINDOWS\system32\SSubTmr6.dll",1)

FileCopy("C:\Program Files\AutoPatcher\bin\poweroff.exe", _

"C:\WINDOWS\system32\poweroff.exe",1)

; «тихая» регистрация всех *.ocx и *.dll файлов с помощью regsvr32.exe

; =====================================================================================

RunWait('regsvr32 "c:\WINDOWS\system32\COMDLG32.OCX" /s')

RunWait('regsvr32 "c:\WINDOWS\system32\COMCTL32.OCX" /s')

RunWait('regsvr32 "c:\WINDOWS\system32\FM20.DLL" /s')

RunWait('regsvr32 "c:\WIND0WS\system32\FM20ENU.DLL" /s')

RunWait('regsvr32 "c:\WINDOWS\system32\MSCOMCTL.OCX" /s')

RunWait('regsvr32 "c:\WINDOWS\system32\SSubTmr6.dll" /s')

; Запуск программы AutoPatcher в автоматическом режиме с установками defaults.ini

; =====================================================================================

Run('C:\Program Files\AutoPatcher\AutoPatcher.exe /unattend:t2 /noeula " & _

"/noreboot /skipdetection /defaults:C:\Program Files\AutoPatcher\defaults.ini')

Exit ; выход из скрипта

Изменение месторасположения папки «Мои документы»

Программа в примере 15 изменяет месторасположение пользовательской папки

«Мои документы». Скрипт использует события нажатия клавиш клавиатуры и

оператор выбора . If

Пример 15. Изменение расположения папки «Мои документы»

#NoTrayIcon; Hides tray icon

; Объявление глобальных переменных

; ====================================================================================

Global $username, $newpath

$username = @UserName ; Определение имени текущего пользователя

Page 41: AutoIt v3: краткое Оглавление руководствоautoit-script.ru/autoit_rv_ua/files/Other/AutoIt_v3_Kratkoe... · Введение в AutoIt и его ... GUI

; настройки расположения папки «Мои документы» в переменной $homepath

; ====================================================================================

$newpath = InputBox("Новое расположение","Введите новый путь к папке " & _

"Мои документы (пользовательская директория будет создана здесь): ","")

; Проверка наличия директории из $newpath и её создание, если она отсутствует

; ====================================================================================

If FileExists($newpath) Then

Else

DirCreate($newpath)

EndIf

; Настройка свойств кнопок управления

; ====================================================================================

Send("{LWINDOWN}d{LWINUP}")

Sleep(500)

Send("my{SPACE}d")

Sleep(500)

Send("{LSHIFT}+{F10}")

Sleep(500)

Send("{UP}{ENTER}")

Sleep(500)

; настройка пути $newpath\$username

; ====================================================================================

Send($newpath & "\" & $username)

Send("{ENTER}")

; 5-секундный таймаут для принятия решения о перемещении документов

; ====================================================================================

WinWait("Перемещение документов","Переместить всё",5)

If WinExists("Перемещение документов","Переместить всё ") Then

If Not WinActive("Перемещение документов","Переместить всё") Then

WinActivate("Перемещение документов","Переместить всё")

WinWaitActive("Перемещение документов","Переместить всё")

Send("n")

Else

EndIf

; 5-секундный таймаут для принятия решения о создании директории

; ====================================================================================

WinWait("Создание директории","Директория",5)

If WinExists("Создание директории","Директория") Then

If Not WinActive("Создание директории","Директория") Then

WinActivate("Создание директории","Директория")

WinWaitActive("Создание директории","Директория")

Send("n")

Else

EndIf

Exit

Page 42: AutoIt v3: краткое Оглавление руководствоautoit-script.ru/autoit_rv_ua/files/Other/AutoIt_v3_Kratkoe... · Введение в AutoIt и его ... GUI

Рисунок 8. Диалоговое окно из примера 15

Отключение DEP в Windows XP

В Windows XP существует технология предотвращения исполнения данных – DEP

(Data Execution Prevention), запрещающая изменения ряда файлов. Как отключить

DEP показано в скрипте из примера 16, который запускает себя от имени

локального администратора и перезаписывает конфигурационный файл . boot.ini

Пример 16. Отключение DEP (Data Execution Prevention)

#NoTrayIcon

; Объявление глобальных переменных

; ====================================================================================

Global $admin, $password

$admin = "Administrator"

$password = "password"

; настраивает запуск скрипта с правами локального администратора

; ====================================================================================

If Not $CMDLINE[0] Then

RunAsSet($admin, @Computername, $password)

If @Compiled Then

RunWait('"' & @ScriptFullPath & '" /admin')

Else

RunWait('"' & @AutoItExe & '" "' & @ScriptFullPath & '" /admin')

EndIf

; перемещение, удаление, перезапись и изменение атрибутов файла boot.ini

; ====================================================================================

RunAsSet()

ElseIf $CMDLINE[0] And $CMDLINE[1] = '/admin' Then

FileSetAttrib("C:\boot.ini","-R") ; удаление атрибута «Только для чтения»

FileDelete("C:\boot.ini") ; удаление оригинального файла boot.ini

; запись первой строки в новый файл boot.ini

IniWrite("C:\boot.ini","boot loader","timeout","30")

Page 43: AutoIt v3: краткое Оглавление руководствоautoit-script.ru/autoit_rv_ua/files/Other/AutoIt_v3_Kratkoe... · Введение в AutoIt и его ... GUI

; запись второй строки в новый файл boot.ini

IniWrite("C:\boot.ini","boot loader","default", _

"multi(0)disk(0)rdisk(0)partition(l)\WINDOWS")

; запись последней строки boot.ini и команды /NoExecute=OptIn (отключает DEP)

IniWrite("C:\boot.ini","operating systems","multi(0)disk(0)rdisk(0)" & _

"partition(l)\WINDOWS",'"Microsoft Windows XP Professional" /fastdetect " & _

"/NoExecute=OptIn')

; применение к новому файлу boot.ini атрибутов «Только для чтения» и «Скрытый»

FileSetAttrib("C:\boot.ini","+RH")

EndIf

Отключение панели предварительного просмотра в Outlook XP Короткий и простой скрипт в примере 17 записывает ключ в системный реестр,

который отключает панель предварительного просмотра в Outlook XP.

Пример 17. Отключение панели предварительного просмотра в Outlook XP

#NoTrayIcon

; запись в реестр ключа, отключающего панель предварительного просмотра Outlook XP

; ====================================================================================

RegWrite("HKEY_CLASSES_ROOT\CLSID\{00020D75-0000-0000-C000-000000000046}" & _

"\Shell\Open\Command","","REG_SZ",'"C:\PROGRA~l\MICROS~2\Officel0\OUTLOOK.EXE"' & _

'/nopreview')

Включение удаленного рабочего стола и NetMeeting

Здесь приведен ещѐ один пример скрипта, запускающегося с правами локального

администратора. Пример 18 устанавливает соединение с удаленным рабочим

столом и включает NetMeeting на отдельно взятой локальной машине.

Пример 18. Включение удаленного рабочего стола и NetMeeting

#NoTrayIcon ; Hides tray icon

; Объявление глобальных переменных

; ===================================================================================

Global $admin, $password

$admin = "Administrator"

$password = "password"

; настраиваем запуск скрипта с правами локального администратора;

===================================================================================

If Not $CMDLINE[0] Then

RunAsSet($admin, @Computername, $password)

If @Compiled Then

RunWait("" & @ScriptFullPath & '" /admin')

Page 44: AutoIt v3: краткое Оглавление руководствоautoit-script.ru/autoit_rv_ua/files/Other/AutoIt_v3_Kratkoe... · Введение в AutoIt и его ... GUI

Else

RunWait("" & @AutoItExe & '" "' & @ScriptFullPath & '" /admin')

EndIf

RunAsSet()

ElseIf $CMDLINE[0] And $CMDLINE[1] = '/admin' Then

; запись значений включения RDP (Remote Desktop Protocol) для удалённой машины

RegWrite("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal " & _

"Server","fDenyTSConnections","REG_DWORD",0)

; запись значений для включения Netmeeting

RegWrite("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Conferencing\Mcpt", _

"Fpx","REG_BINARY","0l000000")

EndIf

Средство обновления Microsoft Windows XP

Программа в Примере 19 проверяет наличие критических обновлений для Windows

XP SP2 от августа 2006. Программа работает только на Windows XP SP2; при

обнаружении любой другой операционной системы программа прекращается. При

наличии Internet Explorer 6 от мая 2007 устанавливаются обновления и для него.

Этот пример не включает все критические обновления безопасности, вышедшие

после августа 2006. Сценарий ссылается на , описание которого будет Lock.exe

приведено далее.

Пример 19. Средство обновления Microsoft Windows XP

#NoTrayIcon

; Ограничение версии и языка системы как English - United States Windows XP SP2

; =====================================================================================

If Not (@OSLang = "0409") Then

Exit

EndIf

If @OSVersion <> "Win_XP" Then

Exit

EndIf

; Запрет на выполнение скрипта

; =====================================================================================

If @ComputerName = "Computer" Then

Exit

EndIf

; Глобальные переменные для Internet Explorer

; =====================================================================================

Global $ieversion = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\" & _

"Internet Explorer","Version")

; Глобальные переменные для пакетов обновлений Windows XP

Page 45: AutoIt v3: краткое Оглавление руководствоautoit-script.ru/autoit_rv_ua/files/Other/AutoIt_v3_Kratkoe... · Введение в AutoIt и его ... GUI

; =====================================================================================

; August 2006 Updates

Global $XPKB921883,$XPKB920214,$XPKB920670,$XPKB920683,$XPKB921398, _

$XPKB922616,$XPKB918899

; September 2006 Updates

Global $XPKB919007,$XPKB920685,$XPKB925486

; October 2006 Updates

Global $XPKB922819,$XPKB923191,$XPKB923414,$XPKB924191,$XPKB924496

; November 2006 Updates

Global $XPKB920213, $XPKB924270

; January 2007 Updates

Global $XPKB926255

; February 2007 Updates

Global $XPKB928843,$XPKB926436,$XPKB924667,$XPKB918118

; April 2007 Updates

Global $XPKB925902, $XPKB930178, $XPKB931261, $XPKB931784, $XPKB932168

; May 2007 Updates

Global $XPKB931768

; Проверка версии Windows

; =====================================================================================

If @OSServicePack = "Service Pack 2" Then WinXPUpdate()

Else

MsgBox(48,"Ошибка","Запущенная система не является Windows XP Service Pack 2.")

RunWait("lock.exe","")

Exit

EndIf

; Проверка установленных обновлений для Windows XP Service Pack 2

; =====================================================================================

Func WinXPUpdate()

; August 2006 Updates

$XPKB920214 = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Updates\ Windows " & _

"XP\SP3\KB9202l4","Description")

$XPKB920670 = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Updates\ Windows " & _

"XP\SP3\KB920670","Description")

$XPKB920683 = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Updates\ Windows " & _

"XP\SP3\KB920683","Description")

$XPKB921398 = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Updates\ Windows " & _

"XP\SP3\KB92l398","Description")

$XPKB922616 = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Updates\ Windows " & _

"XP\SP3\KB9226l6","Description")

If $XPKB920214 = "" Or $XPKB920670 = "" Or $XPKB920683 = "" Or $XPKB921398 = "" _

Or $XPKB922616 = "" Then

Lock()

EndIf

; September 2006 Updates

Page 46: AutoIt v3: краткое Оглавление руководствоautoit-script.ru/autoit_rv_ua/files/Other/AutoIt_v3_Kratkoe... · Введение в AutoIt и его ... GUI

$XPKB919007 = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Updates\ Windows " & _

"XP\SP3\KB9l9007","Description")

$XPKB920685 = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Updates\ Windows " & _

"XP\SP3\KB920685","Description")

$XPKB925486 = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Updates\ Windows " & _

"XP\SP3\KB925486","Description")

If $XPKB919007 = "" Or $XPKB920685 = "" Then

Lock()

EndIf

; October 2006 Updates

XPKB922819 = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Updates\ Windows " & _

"XP\SP3\KB9228l9","Description")

$XPKB923191 = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Updates\ Windows " & _

"XP\SP3\KB923l9l","Description")

$XPKB923414 = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Updates\ Windows " & _

"XP\SP3\KB9234l4","Description")

$XPKB924191 = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Updates\ Windows " & _

"XP\SP3\KB924l9l","Description")

$XPKB924496 = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Updates\ Windows " & _

"XP\SP3\KB924496","Description")

If $XPKB922819 = "" Or $XPKB923191 = "" Or $XPKB923414 = "" Or $XPKB924191 = "" _

Or $XPKB924496 = "" Then

Lock()

EndIf

; November 2006 Updates

$XPKB920213 = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Updates\ Windows " & _

"XP\SP3\KB9202l3","Description")

$XPKB924270 = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Updates\ Windows " & _

"XP\SP3\KB924270","Description")

If $XPKB920213 = "" Or $XPKB924270 = "" Then

Lock()

EndIf

; January 2007 Updates

$XPKB926255 = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Updates\ Windows " & _

"XP\SP3\KB926255","Description")

If $XPKB926255 = "" Then

Lock()

EndIf

; February 2007 Updates

$XPKB928843 = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Updates\ Windows " & _

"XP\SP3\KB928843","Description")

$XPKB926436 = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Updates\ Windows " & _

"XP\SP3\KB926436","Description")

$XPKB924667 = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Updates\ Windows " & _

"XP\SP3\KB924667","Description")

$X

Page 47: AutoIt v3: краткое Оглавление руководствоautoit-script.ru/autoit_rv_ua/files/Other/AutoIt_v3_Kratkoe... · Введение в AutoIt и его ... GUI

PKB918118 = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Updates\ Windows " & _

"XP\SP3\KB9l8ll8","Description")

If $XPKB928843 = "" Or $XPKB926436 = "" Or $XPKB924667 = "" Or $XPKB918118 = "" _

Then

Lock()

EndIf

; April 2007 Updates

$XPKB925902 = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Updates\ Windows " & _

"XP\SP3\KB925902","Description")

$XPKB930178 = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Updates\ Windows " & _

"XP\SP3\KB930l78","Description")

$XPKB931261 = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Updates\ Windows " & _

"XP\SP3\KB93l26l","Description")

$XPKB931784 = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Updates\ Windows " & _

"XP\SP3\KB93l784","Description")

$XPKB932168 = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Updates\ Windows " & _

"XP\SP3\KB932l68","Description")

If $XPKB925902 = "" Or $XPKB930178 = "" Or $XPKB931261 = "" Or $XPKB931784 = "" _

Or $XPKB932168 = "" Then

Lock()

EndIf

; May 2007 Updates

$XPKB931768 = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Updates\ Windows " & _

"XP\SP3\KB93l768","Description")

If $XPKB931768 = "" Then

If StringLeft($ieversion,1) = "6" Then

Lock()

Else

EndIf

EndIf

EndFunc

;==================================================================================

; Функция, извещающая пользователя о необходимости обновления системы

;==================================================================================

Func Lock()

RunWait("lock.exe","")

Sleep(2000)

MsgBox(48,"Внимание!","В системе отсутствует критический пакет обновлений " & _

"системы безопасности. Установите его.")

Exit

EndFunc

Детектор прокси-серверов для Internet Explorer

Программа в примере 20 отправляет пакеты прокси-серверам и настраивает Internet

Page 48: AutoIt v3: краткое Оглавление руководствоautoit-script.ru/autoit_rv_ua/files/Other/AutoIt_v3_Kratkoe... · Введение в AutoIt и его ... GUI

Explorer на использование прокси-сервера, с которым установлено соединение.

Программа создает списки прокси-серверов с разделами ―proxy‖ для их IP-адресов и

―portnumber‖ – с номерами портов.

Пример 20. Детектор прокси-серверов для Internet Explorer

#NoTrayIcon

; отправка пакетов 1-му прокси-серверу и помещение его в набор при наличии соединения

; =====================================================================================

If Ping("proxy1") Then

RegWrite("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\" & _

"Internet Settings","ProxyEnable","REG_DWORD",1)

RegWrite("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\" & _

"Internet Settings","ProxyServer","REG_SZ","proxy1:portnumber")

RegWrite("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\" & _

"Internet Settings","ProxyOverride","REG_SZ","<local>")

; отправка пакетов 2-му прокси-серверу помещение его в набор при наличии соединения

; =====================================================================================

ElseIf Ping("proxy2") Then

RegWrite("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\" & _

"Internet Settings","ProxyEnable","REG_DWORD",1)

RegWrite("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\" & _

"Internet Settings","ProxyServer","REG_SZ","proxy2:portnumber")

RegWrite("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\" & _

"Internet Settings","ProxyOverride","REG_SZ","<local>")

; отправка пакетов 3-му прокси-серверу и помещение его в набор при наличии соединения

; =====================================================================================

Ping("proxy3") Then ElseIf

RegWrite("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\" & _

"Internet Settings","ProxyEnable","REG_DWORD",1)

RegWrite("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\" & _

"Internet Settings","ProxyServer","REG_SZ","proxy3:portnumber")

RegWrite("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\" & _

"Internet Settings","ProxyOverride","REG_SZ","<local>")

; отправка пакетов 4-му прокси-серверу и помещение его в набор при наличии соединения

; =====================================================================================

Ping("proxy4") Then ElseIf

RegWrite("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\" & _

"Internet Settings","ProxyEnable","REG_DWORD",1)

RegWrite("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\" & _

"Internet Settings","ProxyServer","REG_SZ","proxy4:portnumber")

RegWrite("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\" & _

"Internet Settings","ProxyOverride","REG_SZ","<local>")

; исключение прокси-сервера из набора, если соединение с ним недоступно

; =====================================================================================

Page 49: AutoIt v3: краткое Оглавление руководствоautoit-script.ru/autoit_rv_ua/files/Other/AutoIt_v3_Kratkoe... · Введение в AutoIt и его ... GUI

RegWrite("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\" & _

"Internet Settings","ProxyEnable","REG_DWORD",0)

EndIf

Run("C:\Program Files\Internet Explorer\IEXPLORE.EXE") ; запуск Internet Explorer

Блокировка пользователя

В примере 21 на локальной машине специально используются неверные настройки

сети с административными привилегиями, периодически блокирующими учетные

записи пользователей. Возможно использование как локальных, так и доменных

аккаунтов, но перед этим необходимо настроить права доступа в настройках

групповой политики или локальной политики безопасности. Пример 21. Блокировка пользователя

#NoTrayIcon

If @UserName = "Administrator" Then

Exit

ElseIf @UserName = "user" Then

Exit

Else

LockAcct() ; запуск блокировки функций, если отсутствуют привилегии

EndIf

Func LockAcctO $i = 0

While $i < 4 ; цикл проверки прав текущего пользователя

RunWait(@ComSpec & " /c " & "net use * \\127.0.0.1\C$ BadPassword " & _

"/USER:DOMAIN\%USERNAME%","",@SW_HIDE)

$i = $i + 1

WEnd

EndFunc

Получение SID пользователя

Созданная с целью получения SID в Windows, эта утилита обнаруживает

идентификатор безопасности пользователя – SID (Security Identifier) на локальных

машинах или доменах. Пример 22 использует COM-объекты, такие как

A3LSecurity.au3, входящих в состав библиотеки пользовательских функций

Auto3Lib, упоминавшейся в предыдущих разделах книги.

Пример 22. Получение SID пользователя

#NoTrayIcon

#include <A3LSecurity.au3>

Page 50: AutoIt v3: краткое Оглавление руководствоautoit-script.ru/autoit_rv_ua/files/Other/AutoIt_v3_Kratkoe... · Введение в AutoIt и его ... GUI

Opt("MustDeclareVars", 1)

Global $sUser, $aName

$sUser = InputBox("SID Lookup", "Enter UserName:", "", "", 200, 130)

If @Error <> 0 Then

Exit

$aName = _Security_LookupAccountName($sUser)

If @Error = 0 Then

MsgBox(0,"SID Lookup","SID : " & $aName[0] & @CR & _

"Domain ..: " & $aName[1] & @CR & _

"SID Type : " & _Security_SidTypeStr($aName[2]))

Else

MsgBox(0,"SID Lookup","Invalid user name")

EndIf

Рисунок 9. Результат выполнения примера 22

Изменение заголовка документа Word

Данная программа была написана с помощью Microsoft Word Automation

Library упомянутой ранее в разделе пользовательских функций. Скрипт из

примера 23 освобождает директорию, предназначенную для хранения файлов , *.doc

затем изменяет имена выбранных файлов на имена, соответствующие дате их

последних изменений.

Пример 23. Изменение заголовка документа Word

#NoTrayIcon;

; Подключение констант File, Word и GUI

; =====================================================================================

#include <file.au3>

#include <Word.au3>

#include <GuiConstants.au3>

; изменение опций режима OnEvent

; =====================================================================================

Opt('GUIOnEventMode', 1)

Page 51: AutoIt v3: краткое Оглавление руководствоautoit-script.ru/autoit_rv_ua/files/Other/AutoIt_v3_Kratkoe... · Введение в AutoIt и его ... GUI

; Объявление глобальных переменных

; =====================================================================================

Global $LogPath, $DocPath, $progress, $progresspercent

; GUI – графический интерфейс пользователя

; =====================================================================================

GUICreate("Изменение название документов Word", 320, 250)

GUISetIcon("icon.ico")

GUISetOnEvent($GUI_EVENT_CLOSE, 'Event_GUIClose')

; PIC – изображения

; =====================================================================================

GUICtrlCreatePic("logo.gif", 128.5, 5, 63, 56)

; Расположение лог-файла и измененных файлов

; =====================================================================================

GUICtrlCreateLabel("Укажите конечную директорию", 10, 70, 300, 15, _ $SS_CENTER)

GUICtrlCreateLabel("сохранить лог-файл как:", 10, 85, 300, 15, $SS_CENTER)

$LogPath = GUICtrlCreateInput("", 10, 105, 300, 20)

GUICtrlCreateLabel("Укажите путь к директории", 10, 130, 300, 15, _ $SS_CENTER)

GUICtrlCreateLabel("изменить выбранные файлы на:", 10, 145, 300, 15, $SS_CENTER )

$DocPath = GUICtrlCreateInput("", 10, 165, 300, 20)

; Кнопки

; =====================================================================================

GUICtrlCreateButton("Go\", 45, 200, 230, 30)

GUICtrlSetOnEvent(-1, 'TitleChange')

GUISetState(@SW_SHOW) ; показать интерфейс пользователя

While 1

Sleep(250)

Wend

Func TitleChange()

; скрытие GUI во время выполнения функции

; =================================================================================

GUISetState(@SW_HIDE)

_WordErrorHandlerRegister()

; открытие Microsoft Word

; =================================================================================

$oWordApp = _WordCreate("", 0, 0, 0)

; создание переменной $sDocPath с данными о месте сохранения измененных файлов

; =================================================================================

Page 52: AutoIt v3: краткое Оглавление руководствоautoit-script.ru/autoit_rv_ua/files/Other/AutoIt_v3_Kratkoe... · Введение в AutoIt и его ... GUI

$sDocPath = GUICtrlRead($DocPath)

; вывод обратного слэша, если пути не существует

; =================================================================================

If StringRight($sDocPath, 1) <> "\" Then

$sDocPath &= "\"

EndIf

$logpathfirst = GUICtrlRead($LogPath)

If StringRight($logpathfirst, 1) <> "\" Then

$logpathfirst &= "\"

EndIf

; создание переменной $sLogPath со сведениями о месте хранения log – файла

; =================================================================================

$sLogPath = $logpathfirst & "wordtitle.log"

; синхронизация имен всех файлов в измененной директории

; =================================================================================

$search = FileFindFirstFile($sDocPath & "*.doc")

$filelist = _FileListToArray($sDocPath,"*.doc",1)

; вычисление процентного соотношения файлов, подлежащих изменению

; =================================================================================

$filepercent = 100 / $filelist[0]

; настройка умолчаний для поиска файлов *.doc

; =================================================================================

If $search = -1 Then

MsgBox(0, "Ошибка", "Не обнаружено файлов/директорий в указанном месте")

Exit

EndIf

; открытие лог-файла для чтения

; =================================================================================

FileOpen($sLogPath, 1)

; настройки панели состояния

; =================================================================================

ProgressOn("Прогресс изменения документов","Изменено названий " & _

"документов...","",300,200,16)

While 1 ; цикл продолжается пока не останется ни одного файла *.doc

$file = FileFindNextFile($search)

If @error Then ; если последний из файлов не *.doc – выйти из цикла

Page 53: AutoIt v3: краткое Оглавление руководствоautoit-script.ru/autoit_rv_ua/files/Other/AutoIt_v3_Kratkoe... · Введение в AutoIt и его ... GUI

ProgressOff() ; отключение строки состояния

ExitLoop ; выход из цикла

Else

EndIf

; синхронизация с датой последних изменений, указанной в свойствах файла

$filetime = FileGetTime($sDocPath & $file,0,1)

; открытие последнего найденного файла *.doc

$oDoc = _WordDocOpen($oWordApp, $sDocPath & $file)

; получение оригинального названия файла из Microsoft Word

$sTitle = _WordDocPropertyGet($oDoc, "Title")

; запись старых названий в log – файл

FileWriteLine($sLogPath, "===========================")

FileWriteLine($sLogPath, $sDocPath & $file)

FileWriteLine($sLogPath, "===========================")

FileWriteLine($sLogPath, "Старое название: " & $sTitle)

; Создание переменной $sFileName основанной на именах перемещенных файлов *.doc

; =============================================================================

$sFileName = StringTrimRight($file, StringLen($file) - StringInStr($file, _

".", Default, -1) + 1)

_WordDocPropertySet($oDoc, "Title", $sFileName) ; передача имени в $sFileName

$sTitleNew = _WordDocPropertyGet($oDoc, "Title") ; получение имени для log

; Запись новых имен в log – файл в зависимости от даты их изменения

; =============================================================================

FileWriteLine($sLogPath, "Новое имя: " & $sTitleNew)

FileWriteLine($sLogPath, "Дата изменений: " & $filetime)

FileWriteLine($sLogPath, "")

FileWriteLine($sLogPath, "")

_WordDocClose($oDoc, -1) ; закрытие документа Word после сохранения имени

; помещение модифицированной даты в оригинальные время/дату

FileSetTime($sDocPath & $file,$filetime,0)

; вывод процента готовности на прогресс-бар

$progress = $progress + $filepercent

; настройки вывода процентов готовности

$progresspercent = StringLeft($progress,2)

; настройки прогресс-бара

ProgressSet($progress,$progresspercent & " % завершено...")

WEnd

FileClose($sLogPath) ; закрытие log – файла

FileClose($search) ; закрытие поиска

_WordQuit($oWordApp) ; закрытие MS Word

Page 54: AutoIt v3: краткое Оглавление руководствоautoit-script.ru/autoit_rv_ua/files/Other/AutoIt_v3_Kratkoe... · Введение в AutoIt и его ... GUI

MsgBox(0,"Завершено","Все документы в " & $sDocPath & " имеют " & _

"надлежащее измененное имя. Дата изменения файлов не изменена.")

Exit

EndFunc

Func Event_GUIClose(); закрытие пользовательской формы кнопкой «Х»

Exit

EndFunc

Рисунок 10. Результат выполнения примера 23

Заключение

По прочтении данной инструкции к AutoIt v3 вы получили представление о

переменных и вложениях, графическом интерфейсе пользователя, пользовательских

функциях, об условных переходах и циклах. Разделы и примеры из книги могут

стать фундаментом для построения любых программ, доступных для языка AutoIt.

Последний раздел книги содержит примеры автоматизации, которые возможно

применять и на практике. Многие примеры могут быть использованы системными

администраторами или модифицированы для других целей. Данная книга может

стать источником для развития Ваших навыков программирования на AutoIt.

В будущем Вы можете быть уверены в своих возможностях по преодолению любых

вопросов по автоматизации.