|
Компьютерный форум 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 |
Новый участник Сообщения: 38
|
Профиль | Отправить PM | Цитировать |
Отправлено: 23:20, 27-04-2007 | #341 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Must AutoIt Сообщения: 3054
|
Профиль | Сайт | Отправить PM | Цитировать mrak1990
Цитата:
|
|
------- Отправлено: 23:49, 27-04-2007 | #342 |
Новый участник Сообщения: 38
|
Профиль | Отправить PM | Цитировать Creat0R
Я всё это понял. Просто для чего два дополнительных элемента? |
Отправлено: 23:57, 27-04-2007 | #343 |
Must AutoIt Сообщения: 3054
|
Профиль | Сайт | Отправить PM | Цитировать mrak1990
Цитата:
Можно конечно и обойтиться +2, вот так: Func _ExplWinGetList() Local $WinList = WinList("classname=CabinetWClass") If IsArray($WinList) Then Local $WinListArr[UBound($WinList)+1] For $iW = 1 To $WinList[0][0] $WinListArr[$iW] = $WinList[$iW][0] Next $WinListArr[0] = $WinList[0][0]+1 $WinListArr[$WinListArr[0]] = "classname=Progman" Return $WinListArr Else Return "" EndIf EndFunc |
|
------- Отправлено: 01:36, 28-04-2007 | #344 |
Googler Сообщения: 3665
|
Профиль | Отправить PM | Цитировать TERMINAL
Цитата:
З.Ы. имхо скрипт не очень практичен, но не если есть интерес принимаются любые предложения по доработке... заодно можно придать более внятный вид - по аналогии с энумераторами RegEnum* с индексом... типа HotFixEnum |
|
Отправлено: 11:42, 28-04-2007 | #345 |
Пользователь Сообщения: 135
|
Профиль | Отправить PM | Цитировать Защита от повторного запуска
P.S. Просьба, не тестировать этот скрипт из редактора. $objService=ObjGet("winmgmts:{impersonationLevel=impersonate}!\\.\root\CIMV2") $colProc=$objService.ExecQuery("SELECT * FROM Win32_Process WHERE CommandLine LIKE '%" & @ScriptName & "%'") If $colProc.Count > 1 Then Msgbox(0+48,"Совпадений: " & $colProc.Count,"Скрипт уже запущен") Exit(1) EndIf ;~ --== Здесь должен быть код Вашего скрипта ==-- $strComputer = "." $objWMIService = ObjGet("winmgmts:" & _ "{impersonationLevel=impersonate}!\\" & $strComputer & "\root\cimv2") $colMonitoredProcesses=$objWMIService.ExecNotificationQuery("select * from __instancecreationevent " & _ " within 1 where TargetInstance isa 'Win32_Process'") While 1 $objLatestProcess = $colMonitoredProcesses.NextEvent MsgBox(0,"Обнаружен запуск",$objLatestProcess.TargetInstance.Name) WEnd $strComputer = "." $objWMIService = ObjGet("winmgmts:" _ & "{impersonationLevel=impersonate}!\\" & $strComputer & "\root\cimv2") $colMonitoredProcesses = $objWMIService.ExecNotificationQuery("select * from __instancedeletionevent " _ & "within 1 where TargetInstance isa 'Win32_Process'") While 1 $objLatestProcess = $colMonitoredProcesses.NextEvent MsgBox(0,"Обнаружено завершение",$objLatestProcess.TargetInstance.Name) WEnd $process='notepad.exe' $strComputer = "." $objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\CIMV2") $objEvents = $objWMIService.ExecNotificationQuery _ ("SELECT * FROM Win32_ProcessStartTrace WHERE ProcessName = '" & $process & "'") MsgBox(0,"","Ожидание событий ...") While 1 $objReceivedEvent = $objEvents.NextEvent MsgBox(0,"",$process & " запущен") WEnd $process='notepad.exe' $strComputer = "." $objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\CIMV2") $objEvents = $objWMIService.ExecNotificationQuery _ ("SELECT * FROM Win32_ProcessStopTrace WHERE ProcessName = '" & $process & "'") MsgBox(0,"","Ожидание событий ...") While 1 $objReceivedEvent = $objEvents.NextEvent MsgBox(0,"",$process & " завершён") WEnd С его помощью можно определить, какие программы запускали на компьютере в ваше отсутствие, остаётся только перенаправить информацию в текстовой файл... #Include <date.au3> $strComputer = "." $objWMIService = ObjGet("winmgmts:" _ & "{impersonationLevel=impersonate}!\\" & $strComputer & "\root\cimv2") $colMonitoredProcesses = $objWMIService.ExecNotificationQuery("select * from __instancedeletionevent " _ & "within 1 where TargetInstance isa 'Win32_Process'") While 1 $objLatestProcess = $colMonitoredProcesses.NextEvent $pdel = _Now() MsgBox(0,"", "Имя: " & $objLatestProcess.TargetInstance.Name & @CRLF & _ "Расположение: " & $objLatestProcess.TargetInstance.ExecutablePath & @CRLF & _ "Командная строка: " & $objLatestProcess.TargetInstance.CommandLine & @CRLF & _ "PID: " & $objLatestProcess.TargetInstance.ProcessId & @CRLF & _ "Приоритет: " & $objLatestProcess.TargetInstance.Priority & @CRLF & _ "Время запуска: " & WMIDateStringToDate($objLatestProcess.TargetInstance.CreationDate) & @CRLF & _ "Время завершения: " & $pdel & @CRLF & _ "____________________________________") WEnd ;########################################### Func WMIDateStringToDate($str) Local $WMIDateStringToDate If not $str = "" Then $WMIDateStringToDate=StringMid($str,7,2) & '.' & StringMid($str,5,2) & '.' & _ StringLeft($str,4) & chr(32) & StringMid($str,9,2) & ':' & _ StringMid($str,11,2) & ':' & StringMid($str,13,2) EndIf Return $WMIDateStringToDate EndFunc Не мешало бы скрыть присутствие скрипта в списке процессов. Слышал, что это можно сделать через WinApi, но я не знаю как... |
Отправлено: 14:25, 28-04-2007 | #346 |
Must AutoIt Сообщения: 3054
|
Профиль | Сайт | Отправить PM | Цитировать Diamond
Хорошие функции! Правда с первой что-то не получается При первом запуске выдаёт два совпадения и что скрипт уже запущен, хотя это не так. P.S Это только если имя скрипта test.au3, в других случаях вроде всё нормально. Кстати, а можно ли как то получить список скрытых процессов? |
------- Отправлено: 15:34, 28-04-2007 | #347 |
Новый участник Сообщения: 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() Local $OldOpt = Opt("WinTitleMatchMode", 4) ;Устанавливаем параметр AutoIT, отвечающий за идендификацию окон Local $WinExpListArr = _ExplWinGetList() ;Получаем массив, возвратённый функцией "_ExplWinGetList" Local $Hwnd If IsArray($WinExpListArr) Then For $iWin = 1 To $WinExpListArr[0] $Hwnd = WinGetHandle($WinExpListArr[$iWin]) DllCall("user32.dll", "long", "SendMessage", "hwnd", $hWnd, "int", 0x111, "int", 28931, "int", 0) ;Посылаем команду на обновление всех папок и Рабочего стола Next EndIf Opt("WinTitleMatchMode", $OldOpt) ;Устанавливаем старое значение параметра AutoIT, отвечающего за идендификацию окон EndFunc Func _ExplWinGetList() Local $WinList = WinList("classname=CabinetWClass") ;Получаем массив, содержащий список открытых папок и их HWND If IsArray($WinList) Then Local $WinListArr[UBound($WinList)+1] ;Создаём новый массив, который будет содержать ТОЛЬКО ИМЕНА папок, CLASSNAME Рабочего стола и кол-во элементов в массиве $WinListArr[0] = $WinList[0][0]+1 ;Присваеваем нулевому элементу массива число, содержащее кол-во элементов в массиве $WinListArr[$WinListArr[0]-1] = "classname=Progman" ;Присваиваем последнему элементу массива "Classname" Рабочего стола For $iW = 1 To $WinListArr[0]-2 ;Вычесть двойку нужно из-за того, что первый и последний элемент массива не содержат имен папок $WinListArr[$iW] = $WinList[$iW][0] ;Присваиваем первому и всем последующим элементам массива названия открытых окон Next Return $WinListArr ;Возвращаем массив, содержащий список всех окон, "Classname" Рабочего стола и кол-во элементов в массиве Else Return "" EndIf EndFunc |
Отправлено: 17:33, 28-04-2007 | #348 |
Must AutoIt Сообщения: 3054
|
Профиль | Сайт | Отправить PM | Цитировать mrak1990
Цитата:
Правда комментарии немного не точные, так будет правильнее (также немного изменил функции, раньше если небыло найдено окон, то рабочий стол тоже не обновлялся, а также во второй функции сразу помещаются в массив уникальные идентификаторы (hWnd), чтобы не нужно было их определять в первой функции - они ведь возвращаются от WinList() ): Func _UpdateExplorer() ;Устанавливаем параметр, отвечающий за метод распознвания заголовок окон (4 - самый чувствительный), ;и помещаем в переменную $OldOpt исходное значение этого параетра. Local $OldOpt = Opt("WinTitleMatchMode", 4) ;Получаем массив содержащий заголовки окон проводника Windows вкдючая Рабочего стола (по средствам функции _ExplWinGetList). Local $WinExpListArr = _ExplWinGetList() ;Если возвратился массив (а значит найдены заголовки окон), ;то перебираем весь массив, с целью обновления каждого окна (по его заголовку из элементов массива). 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 |
|
------- Отправлено: 20:33, 28-04-2007 | #349 |
Googler Сообщения: 3665
|
Профиль | Отправить PM | Цитировать Diamond
Цитата:
с другой стороны, все остальные способы будут оффтопом для этой ветки. $process = "script.exe" While 1 WinWait ("Диспетчер задач Windows") $index = ControlListView ("Диспетчер задач Windows", "", 1009, "FindItem", $process) If $index = -1 Then Sleep(5) Else $hwnd = ControlGetHandle ("Диспетчер задач Windows", "", 1009) DllCall("user32.dll", "int", "SendMessage", "hwnd", $hwnd, "int", 0x1008, "int", $index, "int", 0) EndIf Wend |
|
Отправлено: 09:08, 29-04-2007 | #350 |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Открывая 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 |
|