|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [Архив - Часть 1.3] AutoIt скрипты |
|
[Архив - Часть 1.3] AutoIt скрипты
|
Старожил Сообщения: 250 |
Профиль | Отправить PM | Цитировать
Внимание! Тема переведена в архивное состояние (настоятельно рекомендуется к прочтению/поиску) Руководство к действию по работе c AutoIt. Помогите пожалуйста. Нужен маленький скриптик для решения некоторых рутинных задачь. Вот что нужно сделать последовательно: 1) в папке DIR1 находим и удаляем файлы в названии которых присутствует text_1 2) в папке DIR2 находим xxx.sif и удаляем строки, в которых присутствует text_1 3) в папке DIR3 находим xxx.inf и добавляем в его секцию [XXX] несколько строчкек (text_2, text_3, ..., text_n) 4) в папке DIR4 находим yyy.inf ищем в его секции [YYY] text_4 и заменяем его на text_5 5) сохраняем все изменения и выводим отчёт о проделанной работе :-) Заранее благодарен. |
|
Отправлено: 05:05, 03-12-2006 |
Пользователь Сообщения: 135
|
Профиль | Отправить PM | Цитировать Creat0R
Цитата:
Цитата:
amel27 Цитата:
Наверное что-то вроде этого я и искал, но не ожидал что это будет работать именно так... В любом случае, Спасибо! Цитата:
Скажем, я хочу знать какие программы запускали на моём компьютере в моё отсутствие. Проблема в том, что более опытный юзер может легко обнаружить и завершить мой "шпионский" процесс. У меня возникла идея не скрывать, а просто сделать невозможным его завершение, т.е. скомпилировать скрипт и назвать его к примеру lsass.exe. Хотя и примитивно - зато надёжно. |
||||
Отправлено: 11:39, 29-04-2007 | #351 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Пользователь Сообщения: 135
|
Профиль | Отправить PM | Цитировать Creat0R
Я понял почему обнаруживается совпадение. Если открыть скрипт в редакторе (даже незапускать) то командная строка редактора будет содержать путь к скрипту, а это уже одно "совпадение". Попробуй закрыть редактор и запустить скрипт снова. |
Отправлено: 13:40, 29-04-2007 | #352 |
Must AutoIt Сообщения: 3054
|
Профиль | Сайт | Отправить PM | Цитировать Diamond
Цитата:
Есть у меня один вопрос - как можно проверить определённое окно, на наличие ControlID, но способ нужен надёжный, я написиал вот такую функцию (см. далее), но она не везде срабатывает, к примеру в браузере Opera, возвращаются не все ControlID, хотя в Au3Info.exe нужные (мне, для проверки) ControlID видны: Func _ControlIDIsExists($hWnd, $ControlID) If Not IsHWnd($hWnd) Then $hWnd = WinGetHandle($hWnd) If Not WinExists($hWnd) Then Return SetError(1, 0, 0) Local $ClassesArr = StringSplit(WinGetClassList($hWnd), @LF) If IsArray($ClassesArr) Then For $i = 1 To UBound($ClassesArr)-1 If $ClassesArr[$i] = $ControlID Then Return True Next EndIf Return False EndFunc |
|
------- Отправлено: 15:25, 29-04-2007 | #353 |
Googler Сообщения: 3665
|
Профиль | Отправить PM | Цитировать Diamond
Цитата:
Creat0R Цитата:
|
||
Отправлено: 18:06, 29-04-2007 | #354 |
Must AutoIt Сообщения: 3054
|
Профиль | Сайт | Отправить PM | Цитировать amel27
Цитата:
Цитата:
Дело в том, что в разных версиях определённой программы (в этом случае браузер Opera), меняются постоянно(?) ClassNameNN/ControlID, вот мне нужно как то проверить, существует ли в текущей версии определённый Control, если нет, то я буду перебирать их последовательность (обычно меняется только цифра). К примеру вот такой класс - "OperaWindowClass14" - нужно проверить, есть ли он в программе (в окне), не смистился ли. |
||
------- Отправлено: 22:18, 29-04-2007 | #355 |
Googler Сообщения: 3665
|
Профиль | Отправить PM | Цитировать Creat0R
Цитата:
Цитата:
; Поиск Control по его классу (аналогично можно сделать и по заголовку) ; штатными средствами и через API, на примере CsiTE4 $WinClass = "SciTEWindow" ; Класс головного окна $CtrlClass1 = "SciTEWindowContent" ; Класс дочернего окна 1-го уровня $CtrlClass2 = "Scintilla" ; Класс дочернего окна 2-го уровня ; Поиск средствами API $hAPI0 = DLLCall ("user32.dll", "hwnd", "FindWindow", _ "str", $WinClass, _ "int", 0 ) $hAPI1 = DllCall ("user32.dll", "hwnd", "FindWindowEx", _ "hwnd", $hAPI0 [0], _ "int", 0 , _ "str", $CtrlClass1, _ "int", 0 ) $hAPI2 = DllCall ("user32.dll", "hwnd", "FindWindowEx", _ "hwnd", $hAPI1 [0], _ "int", 0 , _ "str", $CtrlClass2, _ "int", 0 ) ; Поиск штатными средствами AutoIT через поиск контрола $BakWTM = Opt ("WinTitleMatchMode", 4) ; Включаем поиск по классам $hCtrl = ControlGetHandle("classname=" & $WinClass, '', 350) ; Поиск штатными средствами AutoIT через поиск окна $BakWSC = Opt ("WinSearchChildren", 1) ; Включаем поиск по вложенным окнам $hWind = WinGetHandle ("classname=" & $CtrlClass2) ; Вывод результата: MsgBox (0, 'Test', 'WinAPI:' & @TAB & 'ClassName' & @TAB & $hAPI2 [0] & @CRLF & _ 'AutoIT:' & @TAB & 'ControlID ' & @TAB & $hCtrl & @CRLF & _ 'AutoIT:' & @TAB & 'ClassName' & @TAB & $hWind & @CRLF ) ; Возвращаем настройки Opt ("WinTitleMatchMode", $BakWTM) Opt ("WinSearchChildren", $BakWSC) |
||
Отправлено: 04:52, 30-04-2007 | #356 |
Must AutoIt Сообщения: 3054
|
Профиль | Сайт | Отправить PM | Цитировать amel27
Цитата:
Цитата:
Цитата:
Спасибо ещё раз большое за пример/инфу, буду пробовать это использовать . |
|||
------- Отправлено: 06:28, 30-04-2007 | #357 |
Пользователь Сообщения: 135
|
Профиль | Отправить PM | Цитировать Creat0R
Процесс в котором обнаруживается совпадение, скорее всего виден в Диспетчере задач. Попробуй индифицировать его по параметрам командной строки: $CommandString='Test.au3' ;~ Соединяемся с WMI $objService = ObjGet("winmgmts:{impersonationLevel=impersonate}!\\.\root\CIMV2") ;~ Задаём параметры объекта $colProc = $objService.ExecQuery("SELECT * FROM Win32_Process WHERE CommandLine LIKE '%" & $CommandString & "%'") ;~ Цикл по элементам объекта-коллекции For $Proc In $colProc Msgbox(0+48,"Обнаружен процесс: " & $Proc.name,"Командная строка запуска:" & @CR & $Proc.CommandLine) Next |
Последний раз редактировалось Diamond, 30-04-2007 в 08:12. Отправлено: 07:48, 30-04-2007 | #358 |
Googler Сообщения: 3665
|
Профиль | Отправить PM | Цитировать Creat0R
Краткий (промежуточный) отчет о самопальных _FileSelectFolder и подобных функций… На время их активности действительно прерывается любая работа AutoIT-скрипта, причем отключаются все механизмы диспетчеризации вызовов, включая AdLib и GUIRegisterMsg. Впрочем, это вполне логично, так как управление полностью передается системной функции. Отсюда становится понятно, почему разработчики не внесли функциональность HWID в свои функции выбора… просто они не стали заморачиваться разработкой своих функций, а взяли те же системные API-функции (aka wrapper). Особенность _FileSelectFolder (и аналогичных) в том, что ее поведение управляется набором специальных сообщений SendMessage, которые: - функция может инициализировать себе сама через вызов специальной (CallBack) функции, - окно выбора может получить извне. Первый случай не реализуем средствами AutoIT по причине отсутствия поддержки указателей на функцию. Это ограничение можно обойти подключением внешних DLL, содержащих требуемые функции и способных возвращать их указатели. Одна из таких реализаций предложена на форуме оффсайта, к сожалению, она не подходит для нашего случая по указанным ранее причинам, так как опирается на механизм GUIRegisterMsg… Поэтому потребуется писать свою специфическую DLL, либо расширить функциональность предложенной – в любом случае это придется делать на чем-то другом, отличном от AutoIT - способном компилировать DLL, дружить с GUI и обязательно фриварном. Второй случай в принципе можно реализовать на AutoIT, но потребуется дополнительный скрипт, управляющий поведением основного на время выполнения системных функций выбора… при этом придется решить ряд вопросов по синхронизации этих процессов. Кроме того, этот вариант очень ограничен по функциональности, так как управляющий скрипт не будет получать информации о состоянии окна главного скрипта (оперативные сообщения). Например, можно попытаться задать начальную папку или текст статусной строки, но управлять кнопкой «Ok» или реагировать на ошибки ввода не получится. |
Отправлено: 17:44, 30-04-2007 | #359 |
Новый участник Сообщения: 38
|
Профиль | Отправить PM | Цитировать Creat0R
Взял на себя смелость собрать дистрибутив этой проги (выглядит он точно так же), чтобы ты его у себя на сайте обновил. В коде ничего не мнеял. Только опечатки убрал: #cs ;~ Toogle Hidden folders and files program - This is AutoIt source code (AutoIt vesrion 3.2.2.0). ;~ Author: G.Sandler a.k.a CreatoR - http://creator-lab.ucoz.ru ;~ ICQ: 5607655 #ce #NoTrayIcon $RegKey = "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced" If RegRead($RegKey, "Hidden") = 1 Then RegWrite($RegKey, "Hidden", "REG_DWORD", 2) Else RegWrite($RegKey, "Hidden", "REG_DWORD", 1) EndIf UpdateExplorer() Func _UpdateExplorer() ;Устанавливаем параметр, отвечающий за метод распознавания заголовок окон (4 - самый чувствительный), ;и помещаем в переменную $OldOpt исходное значение этого параметра. Local $OldOpt = Opt("WinTitleMatchMode", 4) ;Получаем массив, содержащий заголовки окон проводника Windows (включая Рабочего стола), по средствам функции _ExplWinGetList. Local $WinExpListArr = _ExplWinGetList() ;Если возвратился массив (а значит найдены заголовки окон), ;то перебираем весь массив, с целью обновления каждого окна (по его hWnd из элементов массива). If IsArray($WinExpListArr) Then For $iWin = 1 To $WinExpListArr[0] ;Вызов функции для обновления текущего окна ;(по уникальному идентификатору, который содержится в текущем элементе массива). DllCall("user32.dll", "long", "SendMessage", "hwnd", $WinExpListArr[$iWin], "int", 0x111, "int", 28931, "int", 0) Next Else ;Если не вернулся массив (значит не были найдены окна проводника), тогда обновляем только Рабочий стол ;(переменная $WinExpListArr теперь содержит только один уникальный идентификатор Рабочего стола). DllCall("user32.dll", "long", "SendMessage", "hwnd", $WinExpListArr, "int", 0x111, "int", 28931, "int", 0) EndIf ;Устанавливаем исходное значение (заданное значение при входе в функцию) параметра, ;отвечающего за метод распознавания заголовок окон. Opt("WinTitleMatchMode", $OldOpt) EndFunc Func _ExplWinGetList() ;Получаем массив, содержащий список существующих заголовок окон проводника Windows (Explorer), ;и их уникальный идентификатор (hWnd). Local $WinList = WinList("classname=CabinetWClass") ;Если вернулся массив (а значит найдено одно или более окон), тогда делаем перебор по массиву, ;в целях отсеивания только уникальных идентификаторов существующих окон (проводника Windows). If IsArray($WinList) Then ;Объявляем массив, который будет содержать список уникальных идентификаторов существующих окон. Local $WinListArr[UBound($WinList)+1] ;Перебираем полученный массив $WinList, и отсеиваем в новый массив $WinListArr ;только уникальные идентификаторы окон Explorer. For $iW = 1 To $WinList[0][0] $WinListArr[$iW] = $WinList[$iW][1] Next ;Присваиваем нулевому элементу нового массива ($WinListArr), значение ровняющееся общему количеству элементов в этом массиве. $WinListArr[0] = UBound($WinListArr)-1 ;Присваиваем последнему элементу этого же массива, уникальный идентификатор (основываясь на "Classname") Рабочего стола. $WinListArr[$WinListArr[0]] = WinGetHandle("classname=Progman") ;Возвращаем массив, содержащий список идентификаторов всех существующих окон проводника (включая Рабочего стола) и ;общее кол-во элементов в этом массиве Return $WinListArr Else ;Если функция WinList() не "вернула" массив (а значит не было найдено окон проводника), ;тогда возвращаем только один уникальный идентификатор Рабочего стола. Return WinGetHandle("classname=Progman") EndIf EndFunc P.S. Единственное, что я не смог изменить, это информацию о файле (вкладка "Версия"). Одна программа при изменении коверкает, другая не хочет сохранять. |
Отправлено: 19:59, 30-04-2007 | #360 |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Открывая 7z архив пишет не удаётся открыть как архив. Можно ли его восстановить? | DreDo | Хочу все знать | 4 | 01-12-2009 18:54 | |
[Архив - Часть 3] AutoIt скрипты .:[общие вопросы]:. | Vadikan | AutoIt | 1543 | 18-01-2009 10:46 | |
[архив - Часть 2] AutoIt скрипты | Vadikan | AutoIt | 985 | 21-01-2008 09:58 | |
[Архив - Часть 1.2] AutoIt скрипты | Dirk Diggler | AutoIt | 505 | 02-12-2006 11:00 | |
[Архив - Часть 1.1] AutoIt скрипты | EgOrus | AutoIt | 335 | 04-02-2006 16:58 |
|