|
Компьютерный форум 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 |
Must AutoIt Сообщения: 3054
|
Профиль | Сайт | Отправить PM | Цитировать Diamond
Ты как то спрашивал про то, как заставить гуи НЕ отображать системны стиль, так вот я нашел на офф. форуме решение этой задачки... Это простой скачивальщик (не знаю на сколько он полезен), при его запуске задаётся стиль как в старых/без стильных виндоус. Вот ссылка, я немного переделал, так как там не совсем весь гуи был таким стилем, я даже удивился, как окно от FileSelectFolder() приняло старый (не)стиль - видимо и всё остальное что будет использованно в гуи будет иметь подобный стиль. Я не разбирался как оно работает, но видимо там упорно используются Dll'овские штучки |
------- Отправлено: 22:52, 08-03-2007 | #261 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Must AutoIt Сообщения: 3054
|
Профиль | Сайт | Отправить PM | Цитировать amel27
Тоже на офф. форуме нашел функцию для слежения за бездельем юзера (немного переделал для примера) : Dim $i_LastActive = _LastActive() $TimeInit = TimerInit() While 1 If $i_LastActive <> _LastActive() Then ExitLoop Sleep(100) WEnd MsgBox(64, "Activity Test", "You was not active <" & Round(TimerDiff($TimeInit)/1000, 1) & "> second(s)") Func _LastActive($v_User32Dll = 'user32.dll') Local $str_LastInput = DllStructCreate('uint;dword') DllStructSetData($str_LastInput, 1, DllStructGetSize($str_LastInput)) DllCall($v_User32Dll, 'int', 'GetLastInputInfo', 'ptr', DllStructGetPtr($str_LastInput)) Return DllStructGetData($str_LastInput, 2) EndFunc |
------- Отправлено: 23:12, 08-03-2007 | #262 |
Googler Сообщения: 3665
|
Профиль | Отправить PM | Цитировать Creat0R
Цитата:
Цитата:
$a = _ProcessList ('') If IsArray ($a) Then For $i=0 To $a[0][0] ConsoleWrite (StringFormat('%4i', $a[$i][0]) & ' : ' & StringFormat('%02i', $a[$i][2]) & ' : ' & $a[$i][1] & @CRLF) Next EndIf Func _ProcessList ($name = '', $ticks = 1000) Local $arrWork[1][3] = [[0,0,0]], $arrMain[1][3] = [[0,'_Summary',0]] Local $i, $colItems, $objItem, $objWMIService = ObjGet("winmgmts:\\.\root\CIMV2"), $where = 'WHERE IDProcess>0' If $name <> '' Then $where &= ' AND Name=' & '"' & $name & '"' ; Считываем необходимые характеристики процессов - попытка №1 $colItems = $objWMIService.ExecQuery ("SELECT IDProcess,PercentProcessorTime,Timestamp_Sys100NS FROM Win32_PerfRawData_PerfProc_Process " & $where, "WQL", 0x30) For $objItem In $colItems $arrWork[0][0]+=1 ReDim $arrWork[$arrWork[0][0]+1][3] $arrWork[$arrWork[0][0]][0]=$objItem.IDProcess $arrWork[$arrWork[0][0]][1]=$objItem.PercentProcessorTime $arrWork[$arrWork[0][0]][2]=$objItem.Timestamp_Sys100NS Next If $arrWork[0][0]=0 Then Return '' ; Накапливаем статистику... Sleep ($ticks) ; Считываем необходимые характеристики процессов - попытка №2 $colItems = $objWMIService.ExecQuery ("SELECT IDProcess,PercentProcessorTime,Timestamp_Sys100NS FROM Win32_PerfRawData_PerfProc_Process " & $where, "WQL", 0x30) For $objItem In $colItems For $i=1 To $arrWork[0][0] If $arrWork[$i][0]=$objItem.IDProcess Then $arrMain[0][0]+=1 ReDim $arrMain[$arrMain[0][0]+1][3] $arrMain[$arrMain[0][0]][0]=$objItem.IDProcess $arrMain[$arrMain[0][0]][1]=$objItem.Name $arrMain[$arrMain[0][0]][2]=Round(100*($arrWork[$i][1]-$objItem.PercentProcessorTime)/($arrWork[$i][2]-$objItem.Timestamp_Sys100NS)) $arrMain[0][2]+=$arrMain[$arrMain[0][0]][2] EndIf Next Next If $arrMain[0][2]>100 Then $arrMain[0][2]=100 Return $arrMain EndFunc |
||
Отправлено: 03:06, 09-03-2007 | #263 |
Googler Сообщения: 3665
|
Профиль | Отправить PM | Цитировать Creat0R
Цитата:
#include <Date.au3> $IdleMinimum = 5000 ; допустимый период неактивности в миллисекундах While 1 $iIdle = _IdleWaitStart ($IdleMinimum) ConsoleWrite (_Now () & ' ' & @UserName & ' неактивен уже ' & _TickToTimeString ($iIdle) & @CRLF) $iIdle = _IdleWaitCommit($IdleMinimum) ConsoleWrite (_Now () & ' ' & @UserName & ' был неактивен ' & _TickToTimeString ($iIdle) & @CRLF) Wend ; Ожидание начала бездействия пользователя. ; Возвращает время неактивности (в тиках) ; $idlesec - минимальная длительность ожидаемой неактивности (в тиках) Func _IdleWaitStart ($idlesec) Local $aRet, $iSave, $iTick, $LastInputInfo = DllStructCreate ("uint;dword") DllStructSetData ($LastInputInfo, 1, DllStructGetSize ($LastInputInfo)) DllCall ("user32.dll", "int", "GetLastInputInfo", "ptr", DllStructGetPtr ($LastInputInfo)) Do Sleep(200) $iSave= DllStructGetData ($LastInputInfo, 2) DllCall ("user32.dll", "int", "GetLastInputInfo", "ptr", DllStructGetPtr ($LastInputInfo)) $aRet = DllCall ("kernel32.dll", "long", "GetTickCount") Until ($aRet[0] - DllStructGetData ($LastInputInfo, 2))> $idlesec Return $aRet[0] - DllStructGetData ($LastInputInfo, 2) EndFunc ; Ожидание окончания бездействия пользователя. ; Возвращает время неактивности в (тиках) ; $idlesec - минимальная длительность ожидаемой неактивности в (тиках) Func _IdleWaitCommit ($idlesec) Local $iSave, $LastInputInfo = DllStructCreate ("uint;dword") DllStructSetData ($LastInputInfo, 1, DllStructGetSize ($LastInputInfo)) DllCall ("user32.dll", "int", "GetLastInputInfo", "ptr", DllStructGetPtr ($LastInputInfo)) Do $iSave = DllStructGetData ($LastInputInfo, 2) Sleep(200) DllCall ("user32.dll", "int", "GetLastInputInfo", "ptr", DllStructGetPtr ($LastInputInfo)) Until (DllStructGetData ($LastInputInfo, 2)-$iSave) > $idlesec Return DllStructGetData ($LastInputInfo, 2)-$iSave EndFunc Func _TickToTimeString ($iTicks) Local $iHours, $iMins, $iSecs, $sText = '' _TicksToTime ($iTicks, $iHours, $iMins, $iSecs) If $iHours Then $sText = $iHours & ' часов ' If $iMins Then $sText = $sText & $iMins & ' минут ' If $iSecs Then $sText = $sText & $iSecs & ' секунд' If $sText = '' Then $sText = 'меньше секунды' Return $sText EndFunc |
|
Последний раз редактировалось amel27, 09-03-2007 в 04:04. Отправлено: 03:25, 09-03-2007 | #264 |
Must AutoIt Сообщения: 3054
|
Профиль | Сайт | Отправить PM | Цитировать amel27
Цитата:
Цитата:
Цитата:
|
|||
------- Отправлено: 21:17, 09-03-2007 | #265 |
Googler Сообщения: 3665
|
Профиль | Отправить PM | Цитировать Creat0R
Цитата:
Цитата:
Цитата:
#include <Date.au3> $IdleMinimum = 5000 ; Minimum inactivity in seconds Dim $arrUserActive[1][3]=[[0,0,0]] Dim $arrUserInactive[1][3]=[[0,0,0]] While 1 $arrUserActive[0][0]+=1 ReDim $arrUserActive[$arrUserActive[0][0]+1][3] $arrUserActive[$arrUserActive[0][0]][0]=_Now () $iIdle = _IdleWaitStart ($IdleMinimum) $arrUserActive[$arrUserActive[0][0]][1]=_Now () $arrUserActive[$arrUserActive[0][0]][2]=_TickToTimeString($iIdle) ConsoleWrite ("Записей активности: " & $arrUserActive[0][0] & @TAB & "Записей нективности: " & $arrUserInactive[0][0] & @CRLF) $arrUserInactive[0][0]+=1 ReDim $arrUserInactive[$arrUserInactive[0][0]+1][3] $arrUserInactive[$arrUserInactive[0][0]][0]=_Now () $iIdle = _IdleWaitCommit($IdleMinimum) $arrUserInactive[$arrUserInactive[0][0]][1]=_Now () $arrUserInactive[$arrUserInactive[0][0]][2]=_TickToTimeString($iIdle) ConsoleWrite ("Записей активности: " & $arrUserActive[0][0] & @TAB & "Записей нективности: " & $arrUserInactive[0][0] & @CRLF) Wend |
|||
Отправлено: 07:20, 11-03-2007 | #266 |
Must AutoIt Сообщения: 3054
|
Профиль | Сайт | Отправить PM | Цитировать amel27
Цитата:
Цитата:
Цитата:
Цитата:
Я пока остановлюсь на простеньком... я сделал типа юмористичесукую напоминалку для бездельника - вот код: HotKeySet("^e", "Quit") TraySetIcon("shell32.dll", 111) TraySetToolTip("Laziness Detecter (!)") $Idle = 0 $MinLaziness = 10 $MaxLaziness = 60 $LazyLimit = Random($MinLaziness, $MaxLaziness, 1) $TimeStamp = TimerInit() AdlibEnable("CheckLaziness", 10) While 1 $Idle = _IdleWaitCommit(0) TrayTip("", "", 0) $TimeStamp = TimerInit() $Idle = 0 WEnd Func CheckLaziness() $TimeDiff = Round(TimerDiff($TimeStamp)/1000) If $TimeDiff > $LazyLimit And $Idle = 0 Then TrayTip("You are lazy", "You are been lazy for a long time (" & _SecsToTime($TimeDiff, ":") & ")", 5, 1) $TimeStamp = TimerInit() $LazyLimit = Random($MinLaziness, $MaxLaziness, 1) EndIf If $TimeDiff >= ($LazyLimit/2) Then TrayTip("", "", 0) EndFunc Func _SecsToTime($iTicks, $Delim) If Number($iTicks) >= 0 Then $iHours = Int($iTicks / 3600) $iTicks = Mod($iTicks, 3600) $iMins = Int($iTicks / 60) $iSecs = Round(Mod($iTicks, 60)) If StringLen($iHours) = 1 Then $iHours = "0" & $iHours If StringLen($iMins) = 1 Then $iMins = "0" & $iMins If StringLen($iSecs) = 1 Then $iSecs = "0" & $iSecs $Time = $iHours & $Delim & $iMins & $Delim & $iSecs Return $Time Else SetError(1) Return 0 EndIf EndFunc Func _IdleWaitCommit($idlesec) Local $iSave, $LastInputInfo = DllStructCreate ("uint;dword") DllStructSetData ($LastInputInfo, 1, DllStructGetSize ($LastInputInfo)) DllCall ("user32.dll", "int", "GetLastInputInfo", "ptr", DllStructGetPtr ($LastInputInfo)) Do $iSave = DllStructGetData ($LastInputInfo, 2) Sleep(200) DllCall ("user32.dll", "int", "GetLastInputInfo", "ptr", DllStructGetPtr ($LastInputInfo)) Until (DllStructGetData ($LastInputInfo, 2)-$iSave) > $idlesec Return DllStructGetData ($LastInputInfo, 2)-$iSave EndFunc Func Quit() Exit EndFunc Будет перебираться случайный промежуток времени, и выскакивать треевская подсказака с напоминанием о том сколько времени пользователь ничего не делал. |
||||
------- Отправлено: 07:56, 11-03-2007 | #267 |
Googler Сообщения: 3665
|
Профиль | Отправить PM | Цитировать Creat0R
Цитата:
Цитата:
#include <array.au3> $b = _ProcessList () While 1 Sleep (1000) Dim $a = $b $b = _ProcessList () _CompProcList ($a, $b) Wend Func _CompProcList (ByRef $a, ByRef $b) Local $i Local $a1[$a[0][0]+1], $a2[$a[0][0]+1], $b1[$b[0][0]+1], $b2[$b[0][0]+1] If $a[0][0] Then ; индексируем массив $a For $i=1 To $a[0][0] $a1[$i]=$a[$i][0] & $a[$i][1] ; PID и имя процесса $a2[$i]=$a[$i][0] & $a[$i][1] & $a[$i][2] ; PID, имя процесса и ЦП Next ; индексируем массив $b For $i=1 To $b[0][0] $b1[$i]=$b[$i][0] & $b[$i][1] ; PID и имя процесса $b2[$i]=$b[$i][0] & $b[$i][1] & $b[$i][2] ; PID, имя процесса и ЦП Next ; Сравниваем новый массив ($b) со старым ($a) For $i=1 To $b[0][0] $f1 = _ArraySearch($a1, $b1[$i], 1) $f2 = _ArraySearch($a2, $b2[$i], 1) If $f1<0 Then ConsoleWrite('Новый процесс: ' & StringFormat ('%4.0i',$b[$i][0]) & ' : ' & $b[$i][1] & @CRLF) ElseIf $f1>0 And $f2<0 Then ConsoleWrite('Изменилась загрузка ЦП: ' & StringFormat ('%4.0i',$b[$i][0]) & ' : ' & StringFormat ('%02i',$a[$f1][2]) & ' > ' & StringFormat ('%02i',$b[$i][2]) & ' : ' & $b[$i][1] & @CRLF) EndIf Next ; Сравниваем старый массив ($a) с новым ($b) For $i=1 To $a[0][0] $f1 = _ArraySearch($b1, $a1[$i], 1) If $f1<0 Then ConsoleWrite('Исчез процесс: ' & StringFormat ('%4.0i',$a[$i][0]) & ' : ' & $a[$i][1] & @CRLF) EndIf Next EndIf EndFunc Цитата:
|
|||
Отправлено: 10:53, 11-03-2007 | #268 |
Must AutoIt Сообщения: 3054
|
Профиль | Сайт | Отправить PM | Цитировать amel27
Цитата:
Цитата:
Цитата:
Кстати, я вот ещё что придумал... заносим в массив (можно из файла) разные сообщения (с разной характеристикой и контекстом), и тоже случайным перебором выводим в TrayTip'е, а также можно занести в массив все файлы из папки мелодии Windows - C:\windows\media (можно даже свою папку с мелодиями указать), и тоже в момент вывода сообщения случайно (в смысле в случайном порядке ) их проигрывать... |
|||
------- Отправлено: 12:33, 11-03-2007 | #269 |
Must AutoIt Сообщения: 3054
|
Профиль | Сайт | Отправить PM | Цитировать Ура!!! я это сделал, немного помучался, но всё же сделал!
Вместо использования звуков системы, я использовал её персонажа - старый добрый волшебник “Merlin” ... Если в системе не найден персонаж, то выводится TrayTip. А и ещё, чтобы персонаж ещё и говорил, в системе должен быть установлен голосовой движёк. При простое более 5-ти секунд, иконка трея меняется на неактивного юзера, при активности иконка обратно меняется на что-то вроде юзера в движении (не смог в системе найти более походящей иконки). Также при простое в переменную $TotalTime накапливается общее время простоя (секунды), а при активности эта переменная сбрасывается на ноль (0)... Также удалось заносить в массив отдельные заготовки сообщении, если есть файл сообщении (LazyMessages.dat), то с него считываются строки, если его нет, то в скрипте уже заготовлены 10 сообщении (на английском)... Для выхода из скрипта в любое время, нужно нажать Ctrl E (при английской раскладке). В общем, на мой взгляд получилось довольно неплохо... правда есть пару моментов, например, как можно проверить закончил ли персонаж читать текст, и соответственно убить его? ... вот скрипт: HotKeySet("^e", "Quit") TraySetIcon("shell32.dll", 160) TraySetToolTip("Laziness Detecter (!)") Dim $MessagesArr[11] $MessagesArr[0] = 10 $MessagesArr[1] = "You are been lazy for a long time <%n>" $MessagesArr[2] = "This is enough, start doing something >:( - you are lazy to much (%n)" $MessagesArr[3] = "Hello!? Any one is home? why you are so lazy so long time? <%n> do somthing!" $MessagesArr[4] = "Hi! Don't you fill like cow? Laziness is reason number 1 of why people die" $MessagesArr[5] = "It's been over a <%n> time sense you touch your computer, touch it now!" $MessagesArr[6] = "I can not wait for you so long (%n), I am going to shutdown myself.... beep.. beeep.. beeeeeep" $MessagesArr[7] = "Hey man, are you forgot about me? Fine! I want to divorced" $MessagesArr[8] = "You have no check your email for <%n> time, maybe there something intersteing?" $MessagesArr[9] = "There is a virus on your computer! (it exists there for a long time <%n>) perform virus checking immediately!" $MessagesArr[10] = "Hi! What's up dog? Don't pay attention; I am just stupid character that doesn't need attention! >:(" $MessagesFile = "LazyMessages.dat" If FileExists($MessagesFile) And FileRead($MessagesFile) <> "" Then $MessagesArr = StringSplit(FileRead($MessagesFile), @LF) $Idle = 0 $TotalTime = 0 $MinLaziness = 10 $MaxLaziness = 60 $LazyLimit = Random($MinLaziness, $MaxLaziness, 1) $TimeStamp = TimerInit() AdlibEnable("CheckLaziness", 10) While 1 $Idle = _IdleWaitCommit(0) TraySetIcon("shell32.dll", 160) TrayTip("", "", 0) $TimeStamp = TimerInit() $Idle = 0 $TotalTime = 0 WEnd Func CheckLaziness() $TimeDiff = Round(TimerDiff($TimeStamp)/1000) If $TimeDiff > $LazyLimit And $Idle = 0 Then TraySetIcon("shell32.dll", 111) $TotalTime += $TimeDiff $LazyTime = _SecsToTime($TotalTime, ":") $TextToSay = StringReplace($MessagesArr[Random(1, $MessagesArr[0], 1)], "%n", $LazyTime) $SleepTime = Round((StringLen($TextToSay)/7)*1000) If StringLen($TextToSay) < 7 Then $SleepTime = 5000 CharacterMsg($TextToSay, Random(100, @DesktopWidth-100, 1), Random(10, @DesktopHeight-150, 1), $SleepTime) If @error Then TrayTip("You are lazy", $TextToSay, 5, 1) $LazyLimit = Random($MinLaziness, $MaxLaziness, 1) $TimeStamp = TimerInit() EndIf If $TimeDiff >= ($LazyLimit/2) Then TrayTip("", "", 0) If $TimeDiff >= 5 And $LazyLimit > 5 Then TraySetIcon("shell32.dll", 111) EndFunc Func _SecsToTime($iTicks, $Delim) If Number($iTicks) >= 0 Then $iHours = Int($iTicks / 3600) $iTicks = Mod($iTicks, 3600) $iMins = Int($iTicks / 60) $iSecs = Round(Mod($iTicks, 60)) If StringLen($iHours) = 1 Then $iHours = "0" & $iHours If StringLen($iMins) = 1 Then $iMins = "0" & $iMins If StringLen($iSecs) = 1 Then $iSecs = "0" & $iSecs $Time = $iHours & $Delim & $iMins & $Delim & $iSecs Return $Time Else SetError(1) Return 0 EndIf EndFunc Func _IdleWaitCommit($idlesec) Local $iSave, $LastInputInfo = DllStructCreate ("uint;dword") DllStructSetData ($LastInputInfo, 1, DllStructGetSize ($LastInputInfo)) DllCall ("user32.dll", "int", "GetLastInputInfo", "ptr", DllStructGetPtr ($LastInputInfo)) Do $iSave = DllStructGetData ($LastInputInfo, 2) Sleep(200) DllCall ("user32.dll", "int", "GetLastInputInfo", "ptr", DllStructGetPtr ($LastInputInfo)) Until (DllStructGetData ($LastInputInfo, 2)-$iSave) > $idlesec Return DllStructGetData ($LastInputInfo, 2)-$iSave EndFunc Func CharacterMsg($TextToSay, $MovexX=200, $MoveY=200, $Sleep=5000) $figure = "merlin" If $TextToSay = "" Then $TextToSay = "Oops! there was an Error!" $Path = @WindowsDir & "\MSAGENT\CHARS\merlin.acs" If Not FileExists($Path) Then Return SetError(1) $AgentControl = ObjCreate("Agent.Control.1") $SinkObject=ObjEvent($AgentControl, "event_") If Isobj($AgentControl) Then $AgentControl.Connected = True $AgentControl.Characters.Load($figure, $Path) $A = $AgentControl.Characters($figure) $A.MoveTo($MovexX, $MoveY, 0) $A.Show $A.Speak($TextToSay) $A.Play("Greet") $A.Play("RestPose") Sleep($Sleep) $A.Hide $A.StopAll $AgentControl.Characters.Unload($figure) EndFunc Func Quit() Exit EndFunc Скрипт чёрно-белый потому как в разукрашенном виде он занимает более 40-ка тысяч строк. |
------- Отправлено: 17:28, 11-03-2007 | #270 |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Открывая 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 |
|