Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [Архив - Часть 1.3] AutoIt скрипты

Закрытая тема
Настройки темы
[Архив - Часть 1.3] AutoIt скрипты

Старожил


Сообщения: 250
Благодарности: 16

Профиль | Отправить PM | Цитировать


Изменения
Автор: Vadikan
Дата: 25-01-2008
Внимание!
Тема переведена в архивное состояние





(настоятельно рекомендуется к прочтению/поиску)


Руководство к действию по работе 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
Благодарности: 2

Профиль | Отправить PM | Цитировать


Creat0R
Разобрался наконец с твоим скриптом. Но остался один маленький вопросик:
Код: Выделить весь код
Local $WinListArr[$WinList[0][0]+2]
В скриптах AutoIT нужно при объявлении массива указывать в квадратных скобках число элементов? Если так, то почему ты приписываешь "+2", а не "+1"?

Отправлено: 23:20, 27-04-2007 | #341



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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


Аватара для Creat0R

Must AutoIt


Сообщения: 3054
Благодарности: 1009

Профиль | Сайт | Отправить PM | Цитировать


mrak1990
Цитата:
почему ты приписываешь "+2", а не "+1"?
Функция WinList возвращает массив заголовок окон, но в этом массиве нет заголовка для рабочего стола, поэтому при объявлении массива требуется увеличить его на один элемент, в момент обработки массива он остаётся пустым, но в конце функции я задаю этому пустому элементу значение ровняющееся заголовку рабочего стола ($WinListArr[$WinListArr[0]] = "classname=Progman"), чтобы в родительской функции ( UpdateExplorer() ) небыло необходимости в определении заголовка для рабочего стола, он будет браться их возвращённого массива (последний элемент).

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community


Отправлено: 23:49, 27-04-2007 | #342


Новый участник


Сообщения: 38
Благодарности: 2

Профиль | Отправить PM | Цитировать


Creat0R
Я всё это понял. Просто для чего два дополнительных элемента?

Отправлено: 23:57, 27-04-2007 | #343


Аватара для Creat0R

Must AutoIt


Сообщения: 3054
Благодарности: 1009

Профиль | Сайт | Отправить PM | Цитировать


mrak1990
Цитата:
для чего два дополнительных элемента?
Когда объявляем массив, нужно добавлять ещё один элемент, который будет содержать общее число элементов, в данном случае, нужно два (т.е тоже число элемнтов как и у массива возвращённого от WinList, плюс один элемент (WinList[0][0] содержит общее число элементов этого массива)), а дополнительный для того чтобы поместить в него ещё один заголовок окна (рабочего стола)...

Можно конечно и обойтиться +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
В этом случае Ubound($WinList) ровняется WinList[0][0]+1 (нуливой элемент содержащий общее количество элементов, и все остальные элементы), поэтому мы добавляем только +1.

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community


Отправлено: 01:36, 28-04-2007 | #344


Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


TERMINAL
Цитата:
А возможно чтобы обновления записывальсь в текстовый файл?
где изменения сделать?
подправил скрипт для случая файла и исправил один недочет в скрипте...

З.Ы. имхо скрипт не очень практичен, но не если есть интерес принимаются любые предложения по доработке... заодно можно придать более внятный вид - по аналогии с энумераторами RegEnum* с индексом... типа HotFixEnum

Отправлено: 11:42, 28-04-2007 | #345


Пользователь


Сообщения: 135
Благодарности: 32

Профиль | Отправить 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
А этот скрипт я как-то писал для отслеживания вируса по его PID (долгая история...)
С его помощью можно определить, какие программы запускали на компьютере в ваше отсутствие,
остаётся только перенаправить информацию в текстовой файл...
Код: Выделить весь код
#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


Аватара для Creat0R

Must AutoIt


Сообщения: 3054
Благодарности: 1009

Профиль | Сайт | Отправить PM | Цитировать


Diamond
Хорошие функции!

Правда с первой что-то не получается
При первом запуске выдаёт два совпадения и что скрипт уже запущен, хотя это не так.

P.S
Это только если имя скрипта test.au3, в других случаях вроде всё нормально.

Кстати, а можно ли как то получить список скрытых процессов?

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community


Отправлено: 15:34, 28-04-2007 | #347


Новый участник


Сообщения: 38
Благодарности: 2

Профиль | Отправить 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


Аватара для Creat0R

Must AutoIt


Сообщения: 3054
Благодарности: 1009

Профиль | Сайт | Отправить 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

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community


Отправлено: 20:33, 28-04-2007 | #349


Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


Diamond
Цитата:
Не мешало бы скрыть присутствие скрипта в списке процессов.
Слышал, что это можно сделать через WinApi, но я не знаю как...
вот вариант на основе скрипта с оффсайта, к сожалению он полезен только в учебных целях...
с другой стороны, все остальные способы будут оффтопом для этой ветки.
Код: Выделить весь код
$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



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [Архив - Часть 1.3] AutoIt скрипты

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Открывая 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




 
Переход