- Offizieller Beitrag
Um die Dateien eines Ordner auf Veränderungen zu überwachen (Neu, Löschen, Verändern) habe ich unter Verwendung von WMI ein Skript erstellt. Es funktioniert auch tadellos.
Einziger Makel: Um es Beenden zu können benötige ich vorher zwingend ein Ereignis. Ursache ist die Methode .NextEvent(). Wird diese aufgerufen verweilt der Programmablauf dort bis zum Eintreten eines Events, welches im festgelegten Intervall dort abgefragt wird.
Hat jemand von euch eine Idee, wie ich aus der Falle heraus komme?
Aus dem Skript heraus kann ich keinerlei Aktion ausführen, da ich in der Methode bin.
AutoIt
HotKeySet('^!c', '_Close') ; Ctrl+Alt+C
$iInterval = 2 ; polling in sec
$sDrive = "C:"
$sFolder = "\\TEST\\"
$sComputer = "."
$objWMIService = ObjGet( _
"winmgmts:{impersonationLevel=impersonate}!\\" & _
$sComputer & "\root\cimv2" _
)
$sQuery = "Select * From __InstanceOperationEvent" & _
" Within " & $iInterval & _
" Where Targetinstance Isa 'CIM_DataFile'" & _
" And TargetInstance.Drive='" & $sDrive & "'" & _
" And TargetInstance.Path='" & $sFolder & "'"
$colEvents = $objWMIService.ExecNotificationQuery($sQuery)
MsgBox(0, 'Monitoring File Events', 'Close with "Ctrl+Alt+C".')
While True
ConsoleWrite('before .NextEvent()' & @CRLF) ; Hier bleibt das Skript stehen und wartet auf NextEvent.
; Mein Hotkey zum Beenden kommt dadurch erst nach einem Event an.
; Somit brauche ich ein vorhergehendes Event um das Skript beenden zu können. :(
$objEvent = $colEvents.NextEvent()
ConsoleWrite('after .NextEvent()' & @CRLF)
$objTargetInst = $objEvent.TargetInstance
Switch $objEvent.Path_.Class
Case "__InstanceCreationEvent"
ConsoleWrite(_Time() & "Created: " & $objTargetInst.Name & @CRLF)
Case "__InstanceDeletionEvent"
ConsoleWrite(_Time() & "Deleted: " & $objTargetInst.Name & @CRLF)
Case "__InstanceModificationEvent"
ConsoleWrite(_Time() & "Modified: " & $objTargetInst.Name & @CRLF)
EndSwitch
WEnd
Func _Time()
Return StringFormat('[%s:%s:%s.%s] ', @HOUR, @MIN, @SEC, @MSEC)
EndFunc
Func _Close()
Exit
EndFunc
Alles anzeigen