{"id":14271,"url":"\/distributions\/14271\/click?bit=1&hash=51917511656265921c5b13ff3eb9d4e048e0aaeb67fc3977400bb43652cdbd32","title":"\u0420\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u043d\u0430\u0442\u0438\u0432\u043e\u043a \u0438 \u0441\u043f\u0435\u0446\u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u0432 vc.ru \u2014 \u043d\u0430\u0439\u0434\u0438\u0441\u044c!","buttonText":"","imageUuid":""}

Доступно об AutoIt

AutoIt — это BASIC’овидный язык программирования, на котором можно создавать боты (имитация действия пользователя) для автоматизации таких работ, т.е управлять другими приложениями (запускать их, нажимать в них кнопки, менюшки…).

AutoIt умеет:

— Симулировать нажатия комбинаций клавиатуры (поддерживается основная масса раскладок клавиатуры);

— Симулировать перемещения указателя мыши и нажатия на ее кнопки;

— Перемещать, менять размер и управлять параметрами отображения окон;

— Непосредственно взаимодействовать с «управляющими элементами» (controls) окна (получать/менять надпись, перемещать, отключать, и т.п. действия);

— Работать с буфером обмена для пересылки его текстового содержания;

— Читать, менять и создавать ключи и значения реестра.

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

И самым знаменательным является тот факт, что AutoIt остается бесплатным.

Какой софт нужен для работы с AutoIt? (практический опыт использования одного из наших коллег)

Нужный софт можно скачать с официального сайта AutoIt. Мне поступило задание выгрузить полный пакет документов по заданному пулу клиентов из автоматизированной системы (АС). Данная выгрузка была очень трудозатратной для пользователя, т.к. приходилось обрабатывать каждого клиента, т.е. проделывать множество раз одни и те же операции. Для написания и редактирования скриптов (расширение au3) я использовал специальный редактор SciTE, который входит в пакет Autoit. В Редакторе удобно проверять правильность синтаксиса и кодировку au3-файла, осуществлять отладку по шагам, компиляцию (Ctrl+F5 — проверка синтаксиса, F4 — переход к следующей ошибке, Ctrl+F7 – компиляция и др..). Так же в состав пакета входят уже готовые функции для работы с определенными объектами (Excel, Word, Массивы, файлы, окна и др.) Подключить необходимые функции можно с помощью #include… , например, какие я использовал в своем скрипте:

#include <Excel.au3> #include <MsgBoxConstants.au3> #include <File.au3> #include <Array.au3> #include <WinAPISys.au3> #include <WinAPIEx.au3>

Большой выбор функций конечно же можно найти в интернете.

Т.к. работа по выгрузке документов могла выполняться на мониторах с разным типом разрешения, то необходимо было занести данные по разрешениям мониторов, которые используются в организации, в специальный настроечный файл. Для этого я использовал INI-файл. Autoit работает с данным типом файлов и для этих целей есть пять функций:

IniDelete(«filename»,»section»[,»key»]) — удалить секцию или значение из ini-файла.
IniRead(«filename»,»section»,»key»,»default») — считать значение из ini-файла.
IniReadSection(«filename»,»section») — считать все пары секция/значение из ini-файла.
IniReadSectionNames(«filename») — считать имена всех секций из ini-файла.
IniWrite(«filename»,»section»,»key»,»value») — записать значение в ini-файл.

;--------------------------------------------------- ;----- координаты по разрешениям экрана------------- ;---------------------------------------------------
[1920x1080] x1=40 y1=40 x2_1=770 y2_1=561 x2_2=770 y2_2=561 [1600x900] x1=46 y1=36 x2_1=609 y2_1=472 x2_2=609 y2_2=472 [1680x1050 x1=44 y1=37 x2_1=649 y2_1=546 x2_2=649 y2_2=546

В начале работы определяется разрешение монитора:

Global $_Widtw=@DesktopWidth, $_Height=@DesktopHeight,

И в зависимости от разрешения считываются координаты из настроечного INI-файла.

$_x1=IniRead($f_ini,$_ekran, "x1", "Значение по умолчанию") $_y1=IniRead($f_ini,$_ekran, "y1", "Значение по умолчанию")

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

$iServer=IniRead($f_ini,"Server", "Key", "Значение по умолчанию"); $iLogin=IniRead($f_ini,"Login", "Key", "Значение по умолчанию") $iPassword="" ;;IniRead($f_ini,"Password", "Key", "Значение по умолчанию") $iURL=IniRead($f_ini,"Path_out", "Key", @ScriptDir) $ipath_inn = IniRead($f_ini,"xls_inn", "Key", "Значение по умолчанию") $_tipDOC = IniRead($f_ini,"TipDoc", "Key", "") ;-- ;if $iServer="Значение по умолчанию" then $iServer=InputBox("Запрос", "Введите httP сервер АС:", $iServer) ;'http://10.67.251.16/eks/api' ;EndIf if $iServer="" or $iServer="Значение по умолчанию" Then MsgBox(4096, "Внимание","Вы не ввели Сервер! Выходим.",30) Exit EndIf $Login=InputBox("Запрос", "Введите ЛОГИН пользователя АС:", StringUpper(StringRegExpReplace($ilogin," ",""))) ; if $Login="" Then MsgBox(4096, "Внимание","Вы не ввели Логин! Выходим.",30) Exit EndIf $Login=StringUpper(StringRegExpReplace($Login," ","")) $URL = FileSelectFolder("Выберите\Создайте Папку для выгрузки документов KSB ):", '', 3, $iURL) $URL = $URL & "\" if $URL = "\" Then MsgBox(4096, "Внимание","Вы не выбрали Папку для выгрузки документов KSB ! Выходим.",30) Exit EndIf $_tipDOC=InputBox("Запрос", "Введите ТИП документа (часть наименования) которые вы хотите ввыгрузить из AC ( <*> - все документы) :", StringUpper($_tipDOC)) if StringRegExpReplace($_tipDOC," ","")="" Then MsgBox(4096, "Внимание","Вы не ввели ТИП документа ! Выходим.",30) Exit EndIf

И отражение данных в INI-файле:

;--------------------------------------------------------------------------- ;- Сервер, логин, пути Выгрузки и расположения XLS файла с Клиентами ;--------------------------------------------------------------------------- [Server] ; сервер URL key=http://99.99.999.99/akva/api [Login] ; Логин текущего пользователя AС key=SIDOROV [path_out] ; путь для выгружаемых документов key=C:\Users\SIDOROV\Documents\ [xls_inn] ; где расположен файл с данными по клиентам key=C:\Users\SIDOROV\Documents\KLIENT.xlsx

Данные по клиентам считываем из. XLSX файла:

Local $oExcel=_Excel_Open(False) If @error Then Exit MsgBox(4096, "Ошибка", "Excel не открылся!") Local $WorkBook=_Excel_BookOpen($oExcel,$path_inn,False,False) If @error Then Exit MsgBox(4096, "Ошибка", "Книга не открыта. Проверь путь. Проверьте наличие файла.",30) $aRange = _Excel_RangeRead($WorkBook) ;DirRemove($URL,1) _Excel_BookClose($WorkBook,False) ; закрытие ;_Excel_Close($oExcel)

Получив данные для выгрузки, начинаем работать с АС, т.е. организуем цикл по количеству клиентов и непосредственную выгрузку документов. В каждой АС есть определенные пункты меню, к которым можно получим доступ по определенным сочетаниям клавиш, например: Alt+F1, Alt+1, Ctrl+t, Ctrl+n… либо за сочетанием клавиш закреплены определенные действия в АС: проваливание в список, вывод на экран информации, формирование отчетов.

Далее организуем цикл по количеству клиентов, считанных из входного XLSX-файла:

For $Shet=1 to UBound($aRange) -1 $_inn_ini=IniRead($load_ini,$aRange[$Shet], "Key", "no") if $_inn_ini<>'YES' And $aRange[$Shet]<> "" then IniWrite($load_ini,$aRange[$Shet], "Key", "no") WinActivate($title) Send("{ALT}") ; !!!!!!!!!! ALT !!!!!!!!!!!!!! Sleep(500) далее множественные операторы обработки ….. …………………………….. Next; конец цикла

Ниже представлен блок на обработку установки фильтра по типу документов:

Send("!3") $Spisok_PD = WinWait("Полный список","",20) If WinActive($Spisok_PD) Then ;----------------------------- Sleep(300) Send("{PGUP}") Send("{ENTER}") $tipD = WinWait('Тип документа',"",30) Sleep(300) If WinActivate($tipD) Then $_ftd="" if $_tipDOC="*" Then $_ftd="" Else $_ftd="%"&$_tipDOC EndIf ControlSetText('Тип документа',"",'[CLASS:Edit; INSTANCE:1]', $_ftd ) ControlClick("Тип документа","",'[CLASS:Button; INSTANCE:2]') EndIf

Для определения координат окон, кнопок на экране, или их цвета (если это необходимо) используется приложение Autoit Window Info, которое входит в состав пакета.

Статистика выгрузки документов заносится в отдельный INI-фал, по каждому клиенту и типу документов, что выручает нас при аварийном завершении (например, зависание АС). Процесс выгрузки начинается с того клиента, на котором произошел сбой.

;---------- запись в INI файл инфы по дог и кол.договоров IniWrite($load_ini,$iSection, "INN", $aRange[$Shet]) ;$aRange[$Shet] IniWrite($load_ini,$iSection, "Dogovor", $_Dogr) ;$aRange[$Shet] IniWrite($load_ini,$iSection, "TipDoc",$_tipDOC) IniWrite($load_ini,$iSection, "Key1", $Num2) ;$aRange[$Shet] IniWrite($load_ini,$iSection, "Key2", $posa-1) ;$aRange[$Shet] $_DtTm=@MDAY&'.'&@MON&'.'&@YEAR&'-'&@HOUR&':'&@MIN&':'&@SEC IniWrite($load_ini,$iSection, "DateTime", $_DtTm) ; запись значения в секцию счета

Если по какой-то причине не прошла выгрузка документа, например, очень долгий ответ от АС или зависание АС, то в INI-файл пишется информация о невыгруженном файле и времени записи в INI-файл:

IniWrite($load_ini,$iSection, "НЕ ВЫГРУЖЕН (" & $_DtTm &") ", ""&$KodDoc&"\"&$_File) ;

Также интересен блок по обработке (т.е. выгрузке) файлов большого объема (более ~100 МБ), т.к. сохранение файлов такого объема из АС может занимать относительно значительное время. В данном случае работает цикл по считываю объема сохраняемого файла и сравнивается с реальным размером файла:

$_rasm=0 if $_Doubl=0 Then $_puf=$_Dir&"\"&$_File ;MsgBox(4096,"путь-файл->",$_puf) $loopwait=0 $loopmax=99 $goot=False $_razm_new=0 $_razm_old=0 While $goot=False and $loopwait < $loopmax Sleep(1500) $_razm_new=FileGetSize($_puf) MsgBox(4096,"Ждем...","Идет сохранение файла -> "&$_File&" ... "&String($_razm_new),0.5) ; размер в КБ if $_razm_new = $_razm_old and $_razm_new<>0 and $_razm_old<>0 Then $goot=True $loopwait=$loopmax EndIF $loopwait=$loopwait+1 $_razm_old=$_razm_new WEnd EndIf

Я привел вашему вниманию основные блоки по обработке задачи, которая стояла перед скриптом Autolt.

В завершении, мне удалось автоматизировать процесс выгрузки требуемого пакета документов из АС с использованием AutoIt, что помогло разгрузить пользователя от однообразной и рутинной работы.

Программное обеспечение можно использовать для выполнения аналогичных повторяющихся задач. Спасибо за внимание.

0
2 комментария
Oleg Garvin

Зачем, если есть python?

Ответить
Развернуть ветку
NTA
Автор

Да, Python может помочь решить практически все задачи. Как волшебная таблетка)
В AutoIt, которую в статье рассматривает - тоже плюсов.

Ответить
Развернуть ветку
-1 комментариев
Раскрывать всегда