Уважаемые Гуру! Помогите написать скрипт, который бы при запуске удалял бы в папке и ее подпапках файлы с определенным расширением (например avi, mp3, wav...) и временм создания более 3-х дней (опционально) от текущей даты. заранее благодарен.
» AutoIT
jupiter1976
Цитата:
Пример:
Код: #include <Date.au3>
_GetOldFiles("c:\Temp", "mp3")
Func _GetOldFiles($sPath, $sType)
Local $iSearch = FileFindFirstFile($sPath & "\*.*")
If $iSearch = -1 Then Return SetError(1, 0, 0)
Local $iFile, $iFullFile, $sRet
While 1
$iFile = FileFindNextFile($iSearch)
If @error Then ExitLoop
$iFullFile = $sPath & "\" & $iFile
If StringInStr(FileGetAttrib($iFullFile), "D") Then $sRet = _GetOldFiles($iFullFile, $sType)
If StringRight($iFullFile, 3) = $sType Then
_DelOldFiles($iFullFile)
EndIf
WEnd
FileClose($iSearch)
EndFunc
Func _DelOldFiles($sFile)
Local $iDate
Local $aCreateDate = FileGetTime($sFile, 1)
$iDate = $aCreateDate[0] & "/" & $aCreateDate[1] & "/" & $aCreateDate[2] & " " & _
$aCreateDate[3] & ":" & $aCreateDate[4] & ":" & $aCreateDate[4]
If _DateDiff("s", $iDate, _NowCalc()) >= 259200 Then ConsoleWrite($sFile & @LF)
EndFunc
Цитата:
Помогите написать скрипт
Пример:
Код: #include <Date.au3>
_GetOldFiles("c:\Temp", "mp3")
Func _GetOldFiles($sPath, $sType)
Local $iSearch = FileFindFirstFile($sPath & "\*.*")
If $iSearch = -1 Then Return SetError(1, 0, 0)
Local $iFile, $iFullFile, $sRet
While 1
$iFile = FileFindNextFile($iSearch)
If @error Then ExitLoop
$iFullFile = $sPath & "\" & $iFile
If StringInStr(FileGetAttrib($iFullFile), "D") Then $sRet = _GetOldFiles($iFullFile, $sType)
If StringRight($iFullFile, 3) = $sType Then
_DelOldFiles($iFullFile)
EndIf
WEnd
FileClose($iSearch)
EndFunc
Func _DelOldFiles($sFile)
Local $iDate
Local $aCreateDate = FileGetTime($sFile, 1)
$iDate = $aCreateDate[0] & "/" & $aCreateDate[1] & "/" & $aCreateDate[2] & " " & _
$aCreateDate[3] & ":" & $aCreateDate[4] & ":" & $aCreateDate[4]
If _DateDiff("s", $iDate, _NowCalc()) >= 259200 Then ConsoleWrite($sFile & @LF)
EndFunc
Maza Faka
Цитата:
с удовольствием
Цитата:
устраивает
с удовольствием
jupiter1976
Цитата:
Вот набросал на скорую руку, вроде работает:
Код: #include <GuiConstants.au3>
#include <GuiListView.au3>
#include <Date.au3>
Global $Age
$hGUI = GUICreate("Old files remover", 400, 300)
$hListView = _GUICtrlListView_Create($hGUI, "File|Date", 10, 10, 380, 170, BitOR($LVS_REPORT, $LVS_SINGLESEL), $WS_EX_CLIENTEDGE)
_GUICtrlListView_SetExtendedListViewStyle($hListView, BitOR($LVS_EX_GRIDLINES, $LVS_EX_CHECKBOXES, _
$LVS_EX_INFOTIP))
_GUICtrlListView_SetColumnWidth($hListView, 0, 260)
_GUICtrlListView_SetColumnWidth($hListView, 1, 116)
GUICtrlCreateLabel("File Type:", 10, 200, 50, 16)
$TypeInput = GUICtrlCreateInput("tmp;temp;bak", 97, 198, 150, 20)
GUICtrlCreateLabel("Age in day:", 280, 200, 55, 16)
$AgeInput = GUICtrlCreateInput("", 335, 198, 55, 20, $ES_NUMBER)
GUICtrlCreateLabel("Directory to Scan:", 10, 230, 90, 16)
$DirInput = GUICtrlCreateInput(@MyDocumentsDir, 97, 228, 265, 20, BitOR($ES_READONLY, $ES_AUTOHSCROLL))
$DirButton = GUICtrlCreateButton("", 365, 228, 25, 20, $BS_ICON)
GUICtrlSetImage(-1, "shell32.dll", 4, 0)
$ScanButton = GUICtrlCreateButton("Scan", 10, 265, 80, 23)
$CloseButton = GUICtrlCreateButton("Close", 315, 265, 80, 23)
$DelButton = GUICtrlCreateButton("Delete selected", 160, 265, 90, 23)
GUISetState()
While 1
$msg = GUIGetMsg()
Switch $msg
Case $GUI_EVENT_CLOSE, $CloseButton
ExitLoop
Case $DirButton
_SelectFolder()
Case $ScanButton
_Prepare()
Case $DelButton
_DeleteFiles()
EndSwitch
WEnd
Func _SelectFolder()
GUISetState(@SW_DISABLE, $hGUI)
Local $iSelectFolder = FileSelectFolder("Select a folder for scan", "", 0, @MyDocumentsDir)
GUISetState(@SW_ENABLE, $hGUI)
If $iSelectFolder = "" Then Return False
GUICtrlSetData($DirInput, $iSelectFolder)
EndFunc
Func _Prepare()
Local $aType = GUICtrlRead($TypeInput)
If $aType = "" Then
_MsgBox(48, "File Type", "Please enter a valide file type", $hGUI)
GUICtrlSetState($TypeInput, $GUI_FOCUS)
Return False
EndIf
Local $iAge = GUICtrlRead($AgeInput)
If $iAge = "" Then
_MsgBox(48, "File Type", "Please enter a valide age", $hGUI)
GUICtrlSetState($AgeInput, $GUI_FOCUS)
Return False
EndIf
$Age = ($iAge * 24 *60 *60)
ConsoleWrite($Age & @LF)
$aType = StringSplit($aType, "; |,")
_GUICtrlListView_DeleteAllItems($hListView)
_GetOldFiles(GUICtrlRead($DirInput), $aType)
Local $iCount = _GUICtrlListView_GetItemCount($hListView)
If $iCount < 1 Then
_MsgBox(48, "Result", "Required files not found", $hGUI)
Else
_MsgBox(64, "Result", "Found a " & $iCount & " files", $hGUI)
EndIf
EndFunc
Func _GetOldFiles($sPath, $sType)
Local $iSearch = FileFindFirstFile($sPath & "\*.*")
If $iSearch = -1 Then Return SetError(1, 0, 0)
Local $iFile, $iFullFile, $sRet, $i
While 1
$iFile = FileFindNextFile($iSearch)
If @error Then ExitLoop
$iFullFile = $sPath & "\" & $iFile
If StringInStr(FileGetAttrib($iFullFile), "D") Then $sRet = _GetOldFiles($iFullFile, $sType)
For $i = 1 To $sType[0]
If StringRight($iFullFile, 3) = $sType[$i] Then
_SetFilesInfo($iFullFile)
EndIf
Next
WEnd
FileClose($iSearch)
EndFunc
Func _SetFilesInfo($sFile)
Local $iDate, $iIndex
Local $aCreateDate = FileGetTime($sFile, 1)
$iDate = $aCreateDate[0] & "/" & $aCreateDate[1] & "/" & $aCreateDate[2] & " " & _
$aCreateDate[3] & ":" & $aCreateDate[4] & ":" & $aCreateDate[4]
If _DateDiff("s", $iDate, _NowCalc()) >= $Age Then
$iIndex = _GUICtrlListView_AddItem($hListView, $sFile)
_GUICtrlListView_AddSubItem($hListView, $iIndex, $iDate, 1)
EndIf
EndFunc
Func _DeleteFiles()
Local $iCount = _GUICtrlListView_GetItemCount($hListView)
If $iCount < 1 Then Return False
Local $i
For $i = 0 To $iCount - 1
If _GUICtrlListView_GetItemChecked($hListView, $i) = False Then ContinueLoop
FileDelete(_GUICtrlListView_GetItemText($hListView, $i))
_GUICtrlListView_DeleteItem($hListView, $i)
Next
EndFunc
Func _MsgBox($sFlag = 0, $sTitle = "", $sText = "", $hWnd = 0)
Local $DllRet = DllCall("user32.dll", "int", "MessageBox", "hwnd", $hWnd, "str", $sText, "str", $sTitle, "int", $sFlag)
Return $DllRet[0]
EndFunc ;==>_MsgBox
Цитата:
с удовольствием
Вот набросал на скорую руку, вроде работает:
Код: #include <GuiConstants.au3>
#include <GuiListView.au3>
#include <Date.au3>
Global $Age
$hGUI = GUICreate("Old files remover", 400, 300)
$hListView = _GUICtrlListView_Create($hGUI, "File|Date", 10, 10, 380, 170, BitOR($LVS_REPORT, $LVS_SINGLESEL), $WS_EX_CLIENTEDGE)
_GUICtrlListView_SetExtendedListViewStyle($hListView, BitOR($LVS_EX_GRIDLINES, $LVS_EX_CHECKBOXES, _
$LVS_EX_INFOTIP))
_GUICtrlListView_SetColumnWidth($hListView, 0, 260)
_GUICtrlListView_SetColumnWidth($hListView, 1, 116)
GUICtrlCreateLabel("File Type:", 10, 200, 50, 16)
$TypeInput = GUICtrlCreateInput("tmp;temp;bak", 97, 198, 150, 20)
GUICtrlCreateLabel("Age in day:", 280, 200, 55, 16)
$AgeInput = GUICtrlCreateInput("", 335, 198, 55, 20, $ES_NUMBER)
GUICtrlCreateLabel("Directory to Scan:", 10, 230, 90, 16)
$DirInput = GUICtrlCreateInput(@MyDocumentsDir, 97, 228, 265, 20, BitOR($ES_READONLY, $ES_AUTOHSCROLL))
$DirButton = GUICtrlCreateButton("", 365, 228, 25, 20, $BS_ICON)
GUICtrlSetImage(-1, "shell32.dll", 4, 0)
$ScanButton = GUICtrlCreateButton("Scan", 10, 265, 80, 23)
$CloseButton = GUICtrlCreateButton("Close", 315, 265, 80, 23)
$DelButton = GUICtrlCreateButton("Delete selected", 160, 265, 90, 23)
GUISetState()
While 1
$msg = GUIGetMsg()
Switch $msg
Case $GUI_EVENT_CLOSE, $CloseButton
ExitLoop
Case $DirButton
_SelectFolder()
Case $ScanButton
_Prepare()
Case $DelButton
_DeleteFiles()
EndSwitch
WEnd
Func _SelectFolder()
GUISetState(@SW_DISABLE, $hGUI)
Local $iSelectFolder = FileSelectFolder("Select a folder for scan", "", 0, @MyDocumentsDir)
GUISetState(@SW_ENABLE, $hGUI)
If $iSelectFolder = "" Then Return False
GUICtrlSetData($DirInput, $iSelectFolder)
EndFunc
Func _Prepare()
Local $aType = GUICtrlRead($TypeInput)
If $aType = "" Then
_MsgBox(48, "File Type", "Please enter a valide file type", $hGUI)
GUICtrlSetState($TypeInput, $GUI_FOCUS)
Return False
EndIf
Local $iAge = GUICtrlRead($AgeInput)
If $iAge = "" Then
_MsgBox(48, "File Type", "Please enter a valide age", $hGUI)
GUICtrlSetState($AgeInput, $GUI_FOCUS)
Return False
EndIf
$Age = ($iAge * 24 *60 *60)
ConsoleWrite($Age & @LF)
$aType = StringSplit($aType, "; |,")
_GUICtrlListView_DeleteAllItems($hListView)
_GetOldFiles(GUICtrlRead($DirInput), $aType)
Local $iCount = _GUICtrlListView_GetItemCount($hListView)
If $iCount < 1 Then
_MsgBox(48, "Result", "Required files not found", $hGUI)
Else
_MsgBox(64, "Result", "Found a " & $iCount & " files", $hGUI)
EndIf
EndFunc
Func _GetOldFiles($sPath, $sType)
Local $iSearch = FileFindFirstFile($sPath & "\*.*")
If $iSearch = -1 Then Return SetError(1, 0, 0)
Local $iFile, $iFullFile, $sRet, $i
While 1
$iFile = FileFindNextFile($iSearch)
If @error Then ExitLoop
$iFullFile = $sPath & "\" & $iFile
If StringInStr(FileGetAttrib($iFullFile), "D") Then $sRet = _GetOldFiles($iFullFile, $sType)
For $i = 1 To $sType[0]
If StringRight($iFullFile, 3) = $sType[$i] Then
_SetFilesInfo($iFullFile)
EndIf
Next
WEnd
FileClose($iSearch)
EndFunc
Func _SetFilesInfo($sFile)
Local $iDate, $iIndex
Local $aCreateDate = FileGetTime($sFile, 1)
$iDate = $aCreateDate[0] & "/" & $aCreateDate[1] & "/" & $aCreateDate[2] & " " & _
$aCreateDate[3] & ":" & $aCreateDate[4] & ":" & $aCreateDate[4]
If _DateDiff("s", $iDate, _NowCalc()) >= $Age Then
$iIndex = _GUICtrlListView_AddItem($hListView, $sFile)
_GUICtrlListView_AddSubItem($hListView, $iIndex, $iDate, 1)
EndIf
EndFunc
Func _DeleteFiles()
Local $iCount = _GUICtrlListView_GetItemCount($hListView)
If $iCount < 1 Then Return False
Local $i
For $i = 0 To $iCount - 1
If _GUICtrlListView_GetItemChecked($hListView, $i) = False Then ContinueLoop
FileDelete(_GUICtrlListView_GetItemText($hListView, $i))
_GUICtrlListView_DeleteItem($hListView, $i)
Next
EndFunc
Func _MsgBox($sFlag = 0, $sTitle = "", $sText = "", $hWnd = 0)
Local $DllRet = DllCall("user32.dll", "int", "MessageBox", "hwnd", $hWnd, "str", $sText, "str", $sTitle, "int", $sFlag)
Return $DllRet[0]
EndFunc ;==>_MsgBox
Цитата:
Потестируй
То что сразу - не хватает "Выделить все"
Добавлено:
очень хорошо отработало, спасибо. Вот бы еще прога автоматом самам удаляла, то что насканила по забитому шаблону, я б ее в планировщик и держись юзеры (сжирают место на обменнике в локалке ... )
jupiter1976
Цитата:
Сам не сможешь доделать? Если нет, то давай предложения в личку, не будем оффтопить.
Цитата:
То что сразу - не хватает "Выделить все"
Вот бы еще прога автоматом самам удаляла
Сам не сможешь доделать? Если нет, то давай предложения в личку, не будем оффтопить.
Помогите пожалуйста написать скрипт для решения интересной задачи.
Есть пользователи у которых на компьютерах имеется определённый список разрешённых программ.
Задача такая, отследить запуск чужих программ которые не в списке разрешонных админом и послать оповещение по net send на сервер о тревоге.
решение такое:
отслеживать событие в системе запуска нового процесса, имя которого будет сверятся с разрешонными именами из инишки, если такого имени процесса нет то посылается сообщение о тревоге.
ps не могу найти реализацию функции отслеживания события запуска нового процесса.
функция processlist не подходит, с функцией ProcessWait чёт не получилось
у кого есть какие соображения?
Есть пользователи у которых на компьютерах имеется определённый список разрешённых программ.
Задача такая, отследить запуск чужих программ которые не в списке разрешонных админом и послать оповещение по net send на сервер о тревоге.
решение такое:
отслеживать событие в системе запуска нового процесса, имя которого будет сверятся с разрешонными именами из инишки, если такого имени процесса нет то посылается сообщение о тревоге.
ps не могу найти реализацию функции отслеживания события запуска нового процесса.
функция processlist не подходит, с функцией ProcessWait чёт не получилось
у кого есть какие соображения?
asdfzxcv
А не проще указать список в реестре
Цитата:
А не проще указать список в реестре
Цитата:
Разрешить запуск приложений, кроме указанных в списке
HKEY_CURRENT_USER\SOFTWARE\Microsoft\ Windows\CurrentVerson\Policies\Explorer
DWORD DisallowRun, значение 1 - запрещает запуск приложений указанных в списке:
HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\DisallowRun
Параметры типа STRING - список запрещенных приложений.
"1" - "program.exe"
"2" - "thebat.exe"
"3" - "icq.exe"
Запретить запуск приложений, кроме указанных в списке *
HKEY_CURRENT_USER\SOFTWARE\Microsoft\ Windows\CurrentVerson\Policies\Explorer
DWORD RestrictRun, значение 1 - запрещает запуск всех приложений, кроме системных и приложений указанных в списке:
HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\RestrictRun
Параметры типа STRING - список разрешенных приложений.
не, это я знаю, но это ограничение легко обойти так как его явно видно.
а у меня задумка написать следящий монитор, тоесть пользователю всё можно как бы, но всё подконтрольно и обойти это слежение более сложнее так как непонятно по каким критерям ведётся оценка ситуации.
имхо конечно, может кому-то и первого способо с реестром будет достаточно, но мне интересно больше аповещение чем запрет.
а у меня задумка написать следящий монитор, тоесть пользователю всё можно как бы, но всё подконтрольно и обойти это слежение более сложнее так как непонятно по каким критерям ведётся оценка ситуации.
имхо конечно, может кому-то и первого способо с реестром будет достаточно, но мне интересно больше аповещение чем запрет.
asdfzxcv
Цитата:
А в чем проблема? Создается массив запущенных (processlist) процессов, с нужной периодичностью создается новый массив, массивы сравниваются, проверяются на запрещенные , старому массиву присваиваются значения нового.
Цитата:
ps не могу найти реализацию функции отслеживания события запуска нового процесса.
функция processlist не подходит,
А в чем проблема? Создается массив запущенных (processlist) процессов, с нужной периодичностью создается новый массив, массивы сравниваются, проверяются на запрещенные , старому массиву присваиваются значения нового.
а грузить проц не будет такое удавольствие? например раз в 30 сек?
Нет не будет
У меня все время в памяти висит скрипт который из ини-шки берет имена ехе-шников,
и если находит такой процесс понижает ему приоритет.
Я его запускаю и забываю.
Притом что у меня по современным меркам древниий комп - АХР2000+ с 512М оперативки.
(скрипт под себя занимает 440КБ оперативки)
Цитата:
Это нужно только если отслыживать И запуск И закрытие запрещенных процессов.
Если только запуск - с нужной периодичностью создается новый массив, и проверяется на запрещенные процессы.
ИМО можно смело ставить и 10 сек.
У меня все время в памяти висит скрипт который из ини-шки берет имена ехе-шников,
и если находит такой процесс понижает ему приоритет.
Я его запускаю и забываю.
Притом что у меня по современным меркам древниий комп - АХР2000+ с 512М оперативки.
(скрипт под себя занимает 440КБ оперативки)
Цитата:
с нужной периодичностью создается новый массив, массивы сравниваются, проверяются на запрещенные , старому массиву присваиваются значения нового.
Это нужно только если отслыживать И запуск И закрытие запрещенных процессов.
Если только запуск - с нужной периодичностью создается новый массив, и проверяется на запрещенные процессы.
ИМО можно смело ставить и 10 сек.
asdfzxcv
Цитата:
Sleep() практически не грузит процессор. Вполне допустим интервал 1 сек, это практически не нагрузит проц. (если, конечно, программа написана корректно, например, не читает ini файл каждый раз).
InferNO
Цитата:
И , при этом, с этой-же периодичностью слать сообщения об этих процессах ?
Цитата:
грузить проц не будет такое удавольствие? например раз в 30 сек?
Sleep() практически не грузит процессор. Вполне допустим интервал 1 сек, это практически не нагрузит проц. (если, конечно, программа написана корректно, например, не читает ini файл каждый раз).
InferNO
Цитата:
Если только запуск - с нужной периодичностью создается новый массив, и проверяется на запрещенные процессы.
И , при этом, с этой-же периодичностью слать сообщения об этих процессах ?
Спасибо, буду изучать как написать массив.
но мне кажется, как то муторно получается,
тоесть есть мы имеем массив со списком полученных процессов и я каждый процесс буду вынужден взять и прогнать по совпадению со списоком разрешонных которые лежат в файле txt мне кажется это займёт время процессора.
А вот как бы замутить что нибуть на подобие ProcessWait ("*.exe") тоесть когда скрипт загружен он просто ждёт любой новый появившейся процесс и только один сверяет со всем списком а не каждый раз все запущенные процессы со всем списком.
Но суть про массив я понял.
но мне кажется, как то муторно получается,
тоесть есть мы имеем массив со списком полученных процессов и я каждый процесс буду вынужден взять и прогнать по совпадению со списоком разрешонных которые лежат в файле txt мне кажется это займёт время процессора.
А вот как бы замутить что нибуть на подобие ProcessWait ("*.exe") тоесть когда скрипт загружен он просто ждёт любой новый появившейся процесс и только один сверяет со всем списком а не каждый раз все запущенные процессы со всем списком.
Но суть про массив я понял.
asdfzxcv
Цитата:
ProcessWait останавливает выполнение скрипта, он будет ждать только одного процесса. "замутить что нибуть" можно на основе " If ProcessExists("process.exe") Then ..." для каждого запрещенного процесса. По сути это будет тот-же ProcessList для запрещенных процессов. Но не думаю, что это будет значительно быстрее и проще. Все равно, нужно проверять, был-ли данный процесс уже запущен (помнить его предыдущее состояние), чтобы постоянно не слать уведомления.
Цитата:
Ерунда, главное - не читать этот txt файл каждый раз, а загрузить его сразу в массив. Работа с памятью занимает очень мало времени.
Цитата:
А вот как бы замутить что нибуть на подобие ProcessWait ("*.exe")
ProcessWait останавливает выполнение скрипта, он будет ждать только одного процесса. "замутить что нибуть" можно на основе " If ProcessExists("process.exe") Then ..." для каждого запрещенного процесса. По сути это будет тот-же ProcessList для запрещенных процессов. Но не думаю, что это будет значительно быстрее и проще. Все равно, нужно проверять, был-ли данный процесс уже запущен (помнить его предыдущее состояние), чтобы постоянно не слать уведомления.
Цитата:
тоесть есть мы имеем массив со списком полученных процессов и я каждый процесс буду вынужден взять и прогнать по совпадению со списоком разрешонных которые лежат в файле txt мне кажется это займёт время процессора.
Ерунда, главное - не читать этот txt файл каждый раз, а загрузить его сразу в массив. Работа с памятью занимает очень мало времени.
Цитата:
"замутить что нибуть" можно на основе " If ProcessExists("process.exe") Then ..." для каждого запрещенного процесса.
Да, интересно, но к сажалению для запрещённого процесса, а у меня все неизвестные процессы являются запрящёнными по этому и хотел *.exe
На счёт того что каждый раз будет отсылатся сообщение при новом цикле, это к стате очень острый момент. Я думаю его как то можно обойти, типа помещением тревожного процесса ещё в один список тревожных процессов по которым уже подавалось оповещение и повторно не оповещать пока не разберётся с этим администратор.
Вот пример скрипта на wmi который написал мне друг:
Суть его такая, что он как раз следит за событием появления процесса, но для wmi требуются права админа по этому этот вариант отпадает, темболее нужен конечный продукт exe
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2")
Set objEvents = objWMIService.ExecNotificationQuery _
("SELECT * FROM Win32_ProcessStartTrace")
Wscript.Echo "Waiting for events ..."
Do While(True)
Set objReceivedEvent = objEvents.NextEvent
'report an event
Wscript.Echo objReceivedEvent.ProcessName
Loop
asdfzxcv 22:05 08-05-2008
Цитата:
Хм, интересно бы почитать подробнее об этом, действительно ли это так, или может речь только о доступе к установке компонентов WMI?
По поводу ожидания процессов, можно сравнивать два массива, а список запрещённых процессов в строку поместить:
Код: HotKeySet("^q", "QuitApp")
Global $aTempProcArr, $sBlockProcFile = @ScriptDir & "\Processes.txt"
While 1
ProcessMonitor($sBlockProcFile, 5000)
WEnd
Func ProcessMonitor($sBlockProcFile, $iSleep=1000)
Local $aProcessesArr = ProcessList()
Local $sBlockProcList = "|" & StringReplace(StringStripCR(FileRead($sBlockProcFile)), @LF, "|") & "|"
If Not _Array2DIsIdentical($aProcessesArr, $aTempProcArr) Then
$aTempProcArr = $aProcessesArr
For $i = 1 To UBound($aProcessesArr)-1
If StringInStr($sBlockProcList, "|" & $aProcessesArr[$i][0] & "|") Or _
StringInStr($sBlockProcList, "|" & $aProcessesArr[$i][1] & "|") Then
$iAsk = MsgBox(262144+52, "Внимание!", _
StringFormat("Найден запрещённый процесс [%s: %d]\n\nУбить его?", $aProcessesArr[$i][0], $aProcessesArr[$i][1]))
If $iAsk = 6 Then ProcessClose($aProcessesArr[$i][1])
EndIf
Next
EndIf
Sleep($iSleep)
EndFunc
Func _Array2DIsIdentical($av2DArray_a, $av2DArray_b, $iLastElement=1)
If UBound($av2DArray_a) <> UBound($av2DArray_b) Then Return False
For $i = 0 To UBound($av2DArray_a)-1
For $j = 0 To $iLastElement
If $av2DArray_a[$i][$j] <> $av2DArray_b[$i][$j] Then Return False
Next
Next
Return True
EndFunc
Func QuitApp()
Exit
EndFunc
Цитата:
для wmi требуются права админа
Хм, интересно бы почитать подробнее об этом, действительно ли это так, или может речь только о доступе к установке компонентов WMI?
По поводу ожидания процессов, можно сравнивать два массива, а список запрещённых процессов в строку поместить:
Код: HotKeySet("^q", "QuitApp")
Global $aTempProcArr, $sBlockProcFile = @ScriptDir & "\Processes.txt"
While 1
ProcessMonitor($sBlockProcFile, 5000)
WEnd
Func ProcessMonitor($sBlockProcFile, $iSleep=1000)
Local $aProcessesArr = ProcessList()
Local $sBlockProcList = "|" & StringReplace(StringStripCR(FileRead($sBlockProcFile)), @LF, "|") & "|"
If Not _Array2DIsIdentical($aProcessesArr, $aTempProcArr) Then
$aTempProcArr = $aProcessesArr
For $i = 1 To UBound($aProcessesArr)-1
If StringInStr($sBlockProcList, "|" & $aProcessesArr[$i][0] & "|") Or _
StringInStr($sBlockProcList, "|" & $aProcessesArr[$i][1] & "|") Then
$iAsk = MsgBox(262144+52, "Внимание!", _
StringFormat("Найден запрещённый процесс [%s: %d]\n\nУбить его?", $aProcessesArr[$i][0], $aProcessesArr[$i][1]))
If $iAsk = 6 Then ProcessClose($aProcessesArr[$i][1])
EndIf
Next
EndIf
Sleep($iSleep)
EndFunc
Func _Array2DIsIdentical($av2DArray_a, $av2DArray_b, $iLastElement=1)
If UBound($av2DArray_a) <> UBound($av2DArray_b) Then Return False
For $i = 0 To UBound($av2DArray_a)-1
For $j = 0 To $iLastElement
If $av2DArray_a[$i][$j] <> $av2DArray_b[$i][$j] Then Return False
Next
Next
Return True
EndFunc
Func QuitApp()
Exit
EndFunc
Не могу сделать такую штуку. Есть текстовый файл с текстом. Нужно чтобы все слова в нем перемешались. Не знаю, как это сделать, помогите. И вообще возможно ли такое сделать на АутоИте?
ViSiToR
По поводу Winamp_Library :
Цитата:
1.Я не разобрался как внести в окно Winamp для проигрывания конкретный файл(ы) без открытия диалога выбора файлов и без открывающегося контекстного меню
2.Хотелось бы иметь ф-ию , подобную SoundPlay ( "filename" [,wait]) - с возможностью ожидания завершения проигрывания файла
По поводу Winamp_Library :
Цитата:
Жду комментариев, также хотелось бы знать каких ещё функции нехватает.
1.Я не разобрался как внести в окно Winamp для проигрывания конкретный файл(ы) без открытия диалога выбора файлов и без открывающегося контекстного меню
2.Хотелось бы иметь ф-ию , подобную SoundPlay ( "filename" [,wait]) - с возможностью ожидания завершения проигрывания файла
Mister_Che
Цитата:
Простейший пример перемешивания строк:
Код: #include <Array.au3>
#include <File.au3>
Dim $aRecord
$file = "c:\test.txt"
_FileReadToArray($file, $aRecord)
_ArrayDisplay($aRecord, "Previous order")
_ArraySort($aRecord, 0, 1)
_ArrayDisplay($aRecord, "After sorting")
$hFile = FileOpen($file, 2)
_FileWriteFromArray($hFile, $aRecord, 1)
FileClose($hFile)
Цитата:
Нужно чтобы все слова в нем перемешались
Простейший пример перемешивания строк:
Код: #include <Array.au3>
#include <File.au3>
Dim $aRecord
$file = "c:\test.txt"
_FileReadToArray($file, $aRecord)
_ArrayDisplay($aRecord, "Previous order")
_ArraySort($aRecord, 0, 1)
_ArrayDisplay($aRecord, "After sorting")
$hFile = FileOpen($file, 2)
_FileWriteFromArray($hFile, $aRecord, 1)
FileClose($hFile)
gregaz 22:55 09-05-2008
Цитата:
Поискал немного по оф. форуму и MSDN, у меня вроде что-то получилось:
Код: ;;;
Global Const $IPC_ENQUEUEFILE = 100 ;Adds File to PlayList
;;;
_Winamp_AddFile("D:\Astrix.mp3")
;===============================================================================
;
; Function Name: _Winamp_AddFile()
;
; Function Description: Add specific file path to Winamp's PlayList.
;
; Parameter(s): $sFilePath - Full file path to add to the playlist.
;
; Requirement(s): None.
;
; Return Value(s): On Success - Adds file to Winamp's PlayList and return 1.
; On Failure - Return 0 and set @error to:
; 1 - Unable to find Winamp window, probably winamp isn't runing.
; 2 - SendMessage fail.
;
; Author(s): G.Sandler (a.k.a CreatoR) - CreatoR's Lab (http://creator-lab.ucoz.ru)
;
;=====================================================================
Func _Winamp_AddFile($sFilePath)
Local $hWinamp = WinGetHandle($sWINAMP_CLASS)
If Not IsHWnd($hWinamp) Then Return SetError(1, 0, 0)
Local $iFilePathSize = StringLen($sFilePath) + 1
Local $stMem = DllStructCreate("char[" & $iFilePathSize & "]")
For $i = 0 To $iFilePathSize
DllStructSetData($stMem, 1, Asc(StringMid($sFilePath, $i, 1)), $i)
Next
DllStructSetData($stMem, 1, 0, $iFilePathSize)
;; Create the COPYDATASTRUCT ;;
Local $stCopyData = DllStructCreate("uint;uint;ptr")
DllStructSetData($stCopyData, 1, $IPC_ENQUEUEFILE) ;dwData = $IPC_ENQUEUEFILE = 100
DllStructSetData($stCopyData, 2, ($iFilePathSize * 2)) ;cbData = Size of the message
DllStructSetData($stCopyData, 3, DllStructGetPtr($stMem)) ;lpData = Pointer to the message
DllCall("user32.dll", "int", "SendMessage", "hwnd", $hWinamp, _
"int", $WM_COPYDATA, "int", 0, "ptr", DllStructGetPtr($stCopyData))
If @error Then Return SetError(2, 0, 0)
Return 1
EndFunc ;==>_Winamp_AddFile
Цитата:
как внести в окно Winamp для проигрывания конкретный файл(ы)
Поискал немного по оф. форуму и MSDN, у меня вроде что-то получилось:
Код: ;;;
Global Const $IPC_ENQUEUEFILE = 100 ;Adds File to PlayList
;;;
_Winamp_AddFile("D:\Astrix.mp3")
;===============================================================================
;
; Function Name: _Winamp_AddFile()
;
; Function Description: Add specific file path to Winamp's PlayList.
;
; Parameter(s): $sFilePath - Full file path to add to the playlist.
;
; Requirement(s): None.
;
; Return Value(s): On Success - Adds file to Winamp's PlayList and return 1.
; On Failure - Return 0 and set @error to:
; 1 - Unable to find Winamp window, probably winamp isn't runing.
; 2 - SendMessage fail.
;
; Author(s): G.Sandler (a.k.a CreatoR) - CreatoR's Lab (http://creator-lab.ucoz.ru)
;
;=====================================================================
Func _Winamp_AddFile($sFilePath)
Local $hWinamp = WinGetHandle($sWINAMP_CLASS)
If Not IsHWnd($hWinamp) Then Return SetError(1, 0, 0)
Local $iFilePathSize = StringLen($sFilePath) + 1
Local $stMem = DllStructCreate("char[" & $iFilePathSize & "]")
For $i = 0 To $iFilePathSize
DllStructSetData($stMem, 1, Asc(StringMid($sFilePath, $i, 1)), $i)
Next
DllStructSetData($stMem, 1, 0, $iFilePathSize)
;; Create the COPYDATASTRUCT ;;
Local $stCopyData = DllStructCreate("uint;uint;ptr")
DllStructSetData($stCopyData, 1, $IPC_ENQUEUEFILE) ;dwData = $IPC_ENQUEUEFILE = 100
DllStructSetData($stCopyData, 2, ($iFilePathSize * 2)) ;cbData = Size of the message
DllStructSetData($stCopyData, 3, DllStructGetPtr($stMem)) ;lpData = Pointer to the message
DllCall("user32.dll", "int", "SendMessage", "hwnd", $hWinamp, _
"int", $WM_COPYDATA, "int", 0, "ptr", DllStructGetPtr($stCopyData))
If @error Then Return SetError(2, 0, 0)
Return 1
EndFunc ;==>_Winamp_AddFile
ViSiToR
Спасибо за код на счёт мониторинга процессов, буду его изучать и попытаюсь адаптировать под свои нужды.
Если что получится то выложу сюда.
Спасибо за код на счёт мониторинга процессов, буду его изучать и попытаюсь адаптировать под свои нужды.
Если что получится то выложу сюда.
Maza Faka, спасибо! А "Array.au3" и "File.au3" это что?
А можно засунуть слова из моего текстового файла в массив (Dim), затем этот массив запузырить в Рандом и Послать?
Добавлено:
Или вообще в самой программе эти слова написать сразу.
Добавлено:
Почему он печатает шесть цифр вместо трех?
Цитата:
А можно засунуть слова из моего текстового файла в массив (Dim), затем этот массив запузырить в Рандом и Послать?
Добавлено:
Или вообще в самой программе эти слова написать сразу.
Добавлено:
Почему он печатает шесть цифр вместо трех?
Цитата:
while 1
MouseClick("left", 25, 123, 1)
MouseClick("left", 913, 431, 1)
Send ("{HOME}")
MouseClick("left", 332, 552, 1)
Send("#my script")
MouseClick("left", 668, 624, 1)
$sWord = ""
For $i = 1 To 3
$sWord &= Chr(Random(48, 57, 1))
Send($sWord)
Next
MouseClick("left", 663, 554, 1)
MouseClick("left", 203, 120, 1)
Sleep(1000 * 60 * 0,5)
WEnd
Mister_Che 03:08 11-05-2008
Цитата:
А кто ему сказал печатать 3? Там цикл который 3 раза повторяется, но каждый такой повтор посылает переменную $sWord, которая может содержать случайный символ с ASCII кодом от 48 до 57 и каждый повтор к этой переменной добавляется новый символ
Может так лучше:
Код: $sWord = ""
For $i = 1 To 3
$sWord &= Chr(Random(48, 57, 1))
Next
Send($sWord)
Цитата:
Почему он печатает шесть цифр вместо трех?
А кто ему сказал печатать 3? Там цикл который 3 раза повторяется, но каждый такой повтор посылает переменную $sWord, которая может содержать случайный символ с ASCII кодом от 48 до 57 и каждый повтор к этой переменной добавляется новый символ
Может так лучше:
Код: $sWord = ""
For $i = 1 To 3
$sWord &= Chr(Random(48, 57, 1))
Next
Send($sWord)
gregaz 22:55 09-05-2008
Цитата:
ViSiToR
Цитата:
Да , спасибо . Это именно то , что нужно
gregaz
Цитата:
ViSiToR
Цитата:
Да , похоже можно ( в списке)
Еще вопрос :
Как проиграть файл(не 1-й) с заданным индексом (из окна Winamp) ?
Цитата:
как внести в окно Winamp для проигрывания конкретный файл(ы)
ViSiToR
Цитата:
Поискал немного по оф. форуму и MSDN, у меня вроде что-то получилось:
Да , спасибо . Это именно то , что нужно
gregaz
Цитата:
Хотелось бы иметь ф-ию , подобную SoundPlay ( "filename" [,wait]) - с возможностью ожидания завершения проигрывания файла
ViSiToR
Цитата:
Это можно построить из уже имеющихся функции. Или имеется в виду проигрывание файла не в списке?
Да , похоже можно ( в списке)
Еще вопрос :
Как проиграть файл(не 1-й) с заданным индексом (из окна Winamp) ?
gregaz 08:22 11-05-2008
Цитата:
Вот переделал функцию _Winamp_Play():
Код: ;===============================================================================
;
; Function Name: _Winamp_Play()
;
; Function Description: Hits the "Play" button on the main controls window.
;
; Parameter(s): $iMode - If this parameter <> -1, instead of pressing the "Play" button,
; will popup a menu with few options (the same as right click on the button).
; $iTrack - [Optional] Sets playlist position before start playing.
; $iWait - [Optional] Determines if the function should wait for the sound to finish before continuing.
; 0 = Continue script, do not wait untill sound finishes playing (default)
; 1 = Function will wait untill the sound is finishes playing (status <> playing)
;
; Requirement(s): None.
;
; Return Value(s): On Success - Play specific (or current) track in PlayList and return 1.
; On Failure - Return 0 and set @error to:
; 1 - Unable to find Winamp window, probably winamp isn't runing.
; 2 - SendMessage fail.
;
; Author(s): G.Sandler (a.k.a CreatoR) - CreatoR's Lab (http://creator-lab.ucoz.ru)
;
;=====================================================================
Func _Winamp_Play($iMode = -1, $iTrack = -1, $iWait = 0)
Local $hWinamp = WinGetHandle($sWINAMP_CLASS)
If Not IsHWnd($hWinamp) Then Return SetError(1, 0, 0)
Local $iCurrent_Track = _Winamp_GetPLPosition()
Local $iPlayStatus = _Winamp_GetCurrentTrackPlayStatus()
If $iMode = -1 And $iPlayStatus = 1 And ($iTrack = $iCurrent_Track Or $iTrack = -1) Then Return 1
If $iTrack >= 0 Then
_Winamp_SetPLPosition($iTrack)
$iCurrent_Track = $iTrack
EndIf
Switch $iMode
Case -1
DllCall("user32.dll", "int", "SendMessage", "hwnd", $hWinamp, "int", $WM_COMMAND, "int", $WINAMP_BUTTON2, "int", 0)
Case Else
DllCall("user32.dll", "int", "SendMessage", _
"hwnd", $hWinamp, "int", $WM_WA_IPC, "int", 4, "int", $IPC_SPAWNBUTTONPOPUP)
EndSwitch
If @error Then Return SetError(2, 0, 0)
If $iWait Then
While 1
$iPlayStatus = _Winamp_GetCurrentTrackPlayStatus()
If $iPlayStatus = 0 Or _Winamp_GetPLPosition() <> $iCurrent_Track Then ExitLoop
Sleep(100)
WEnd
EndIf
Return 1
EndFunc ;==>_Winamp_Play
Цитата:
похоже можно ( в списке)
Вот переделал функцию _Winamp_Play():
Код: ;===============================================================================
;
; Function Name: _Winamp_Play()
;
; Function Description: Hits the "Play" button on the main controls window.
;
; Parameter(s): $iMode - If this parameter <> -1, instead of pressing the "Play" button,
; will popup a menu with few options (the same as right click on the button).
; $iTrack - [Optional] Sets playlist position before start playing.
; $iWait - [Optional] Determines if the function should wait for the sound to finish before continuing.
; 0 = Continue script, do not wait untill sound finishes playing (default)
; 1 = Function will wait untill the sound is finishes playing (status <> playing)
;
; Requirement(s): None.
;
; Return Value(s): On Success - Play specific (or current) track in PlayList and return 1.
; On Failure - Return 0 and set @error to:
; 1 - Unable to find Winamp window, probably winamp isn't runing.
; 2 - SendMessage fail.
;
; Author(s): G.Sandler (a.k.a CreatoR) - CreatoR's Lab (http://creator-lab.ucoz.ru)
;
;=====================================================================
Func _Winamp_Play($iMode = -1, $iTrack = -1, $iWait = 0)
Local $hWinamp = WinGetHandle($sWINAMP_CLASS)
If Not IsHWnd($hWinamp) Then Return SetError(1, 0, 0)
Local $iCurrent_Track = _Winamp_GetPLPosition()
Local $iPlayStatus = _Winamp_GetCurrentTrackPlayStatus()
If $iMode = -1 And $iPlayStatus = 1 And ($iTrack = $iCurrent_Track Or $iTrack = -1) Then Return 1
If $iTrack >= 0 Then
_Winamp_SetPLPosition($iTrack)
$iCurrent_Track = $iTrack
EndIf
Switch $iMode
Case -1
DllCall("user32.dll", "int", "SendMessage", "hwnd", $hWinamp, "int", $WM_COMMAND, "int", $WINAMP_BUTTON2, "int", 0)
Case Else
DllCall("user32.dll", "int", "SendMessage", _
"hwnd", $hWinamp, "int", $WM_WA_IPC, "int", 4, "int", $IPC_SPAWNBUTTONPOPUP)
EndSwitch
If @error Then Return SetError(2, 0, 0)
If $iWait Then
While 1
$iPlayStatus = _Winamp_GetCurrentTrackPlayStatus()
If $iPlayStatus = 0 Or _Winamp_GetPLPosition() <> $iCurrent_Track Then ExitLoop
Sleep(100)
WEnd
EndIf
Return 1
EndFunc ;==>_Winamp_Play
ViSiToR , спасибо
Ф-ия _Winamp_Play() стала богаче
А нельзя ли в ф-ии _Winamp_AddFile предусмотреть и возможность добавки файлов с предварительной очисткой окна ?
Извини , если сильно напрягаю
Ф-ия _Winamp_Play() стала богаче
А нельзя ли в ф-ии _Winamp_AddFile предусмотреть и возможность добавки файлов с предварительной очисткой окна ?
Извини , если сильно напрягаю
Возможно ли запись вот таких ошибок в фаил???
XpycTMD
Цитата:
AutoIt3.exe /ErrorStdOut позволяет выводить сообщения не в окно, а поток StdOut. Например, при запуске программы в SCITE вывод происходит в окно редактора.
Для вывода в файл:
Код: "c:\Program Files\AutoIt3\AutoIt3.exe" /ErrorStdOut Test.au3 >Eroor.txt
Цитата:
Возможно ли запись вот таких ошибок в фаил?
AutoIt3.exe /ErrorStdOut позволяет выводить сообщения не в окно, а поток StdOut. Например, при запуске программы в SCITE вывод происходит в окно редактора.
Для вывода в файл:
Код: "c:\Program Files\AutoIt3\AutoIt3.exe" /ErrorStdOut Test.au3 >Eroor.txt
gregaz
Цитата:
Google рулит
Код: Global Const $sWINAMP_CLASS = "[CLASS:Winamp v1.x]"
Global Const $WM_WA_IPC = 0x0400
Global Const $IPC_DELETE = 101
$hWinamp = WinGetHandle($sWINAMP_CLASS)
DllCall("user32.dll", "int", "SendMessage", "hwnd", $hWinamp, "int", $WM_WA_IPC, "int", 0, "int", $IPC_DELETE)
Цитата:
возможность добавки файлов с предварительной очисткой окна
Google рулит
Код: Global Const $sWINAMP_CLASS = "[CLASS:Winamp v1.x]"
Global Const $WM_WA_IPC = 0x0400
Global Const $IPC_DELETE = 101
$hWinamp = WinGetHandle($sWINAMP_CLASS)
DllCall("user32.dll", "int", "SendMessage", "hwnd", $hWinamp, "int", $WM_WA_IPC, "int", 0, "int", $IPC_DELETE)
Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
Предыдущая тема: Quintura Search
Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.