Per VBS Prog. beenden wenn Ordner leer
Hallo zusammen,
ich habe ein Script das zwei Ordner überwacht und bei Eingang einer Datei ein Programm startet., das läuft soweit perfekt. Nun soll das Script noch erweitert werden. Nachdem die überwachten Ordner wieder leer sind, soll das Programm (das Script soll weiter laufen) wieder beendet werden und eine Meldung (Msgbox) "wieder Leer...." soll erscheinen. Ist das möglich, kann mir jemand helfen?.
Gruß und Danke in voraus
ich habe ein Script das zwei Ordner überwacht und bei Eingang einer Datei ein Programm startet., das läuft soweit perfekt. Nun soll das Script noch erweitert werden. Nachdem die überwachten Ordner wieder leer sind, soll das Programm (das Script soll weiter laufen) wieder beendet werden und eine Meldung (Msgbox) "wieder Leer...." soll erscheinen. Ist das möglich, kann mir jemand helfen?.
'
Const strPath = "C:\Users\Max\Desktop\Test1"
Const strPath2 = "C:\Users\Max\Desktop\Test2"
Const intInterval = "2"
'------------------------------
strDrive = Split(strPath,"\")(0)
strFolder = Replace(Split(strPath,":")(1),"\","\\") & "\\"
strDrive2 = Split(strPath2,"\")(0)
strFolder2 = Replace(Split(strPath2,":")(1),"\","\\") & "\\"
Set fso = WScript.CreateObject("Scripting.Filesystemobject")
Set objShell = CreateObject("Wscript.Shell")
Set objWMIService = GetObject( "winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2" )
strQuery = "Select * From __InstanceOperationEvent" _
& " Within " & intInterval _
& " Where Targetinstance Isa 'CIM_DataFile'" _
& " And ((TargetInstance.Drive='" & strDrive & "'"_
& " And TargetInstance.Path='" & strFolder & "') or "_
& "(TargetInstance.Drive='" & strDrive2 & "'"_
& " And TargetInstance.Path='" & strFolder2 & "'))"
Set colEvents = objWMIService.ExecNotificationQuery (strQuery)
Do
Set objEvent = colEvents.NextEvent()
Set objTargetInst = objEvent.TargetInstance
Select Case objEvent.Path_.Class
Case "__InstanceCreationEvent"
objShell.Run """C:\Program Files (x86)\Adobe\Acrobat Reader DC\Reader\AcroRd32.exe"""
End Select
Loop
Gruß und Danke in voraus
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 305140
Url: https://administrator.de/contentid/305140
Ausgedruckt am: 25.11.2024 um 04:11 Uhr
17 Kommentare
Neuester Kommentar
if fso.GetFolder(strPath).Files.Count = 0 then
Set ProcessList = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2").ExecQuery("SELECT * FROM Win32_Process WHERE Name = 'AcroRd32.exe'")
For Each objProcess In ProcessList
objProcess.Terminate
Next
Msgbox "Ordner leer"
End if
Zitat von @Knuefi:
Hallo skybird,
erstmal Danke für deine schnelle Antwort. Wenn ich das richtig verstehe, ist das ein separates Script oder?.
öhm nö, les mal Zeile 1, wo hätte ich sonst die Variablen strPath und fso her ???Hallo skybird,
erstmal Danke für deine schnelle Antwort. Wenn ich das richtig verstehe, ist das ein separates Script oder?.
Kann ich es in den vorhandenen Sript einbinden?
Ja
Uups da war ich noch im VBA Modus, das objProcess in der Next-Zeile darf da nicht stehen.
Aber die Platzierung des Codes solltest du dir noch mal ansehen der wird sonst so an der Stelle nie ausgeführt, außer du springst aus dem Loop.
Ich frage mich ernsthaft ob du diesen Code wirklich selber geschrieben hast ?? Wenn du so hilflos daher kommst.
Wenn ich schon Code irgendwo her kopiere klatsche ich zumindest eine Quellenangabe dran!! Deswegen poste ich auch meist keinen fremden Code.
Etwas Hirn einschalten sollte man in einem Admin-Forum eigentlich voraussetzen können
Aber die Platzierung des Codes solltest du dir noch mal ansehen der wird sonst so an der Stelle nie ausgeführt, außer du springst aus dem Loop.
Ich frage mich ernsthaft ob du diesen Code wirklich selber geschrieben hast ?? Wenn du so hilflos daher kommst.
Wenn ich schon Code irgendwo her kopiere klatsche ich zumindest eine Quellenangabe dran!! Deswegen poste ich auch meist keinen fremden Code.
Etwas Hirn einschalten sollte man in einem Admin-Forum eigentlich voraussetzen können
Was ja auch klar ist wenn du das ganze in das Switch-Statement mit Case "__InstanceCreationEvent" einfügst. Denn dann wird es ja nur ausgeführt wenn eine Datei im Ordner angelegt wird! Und dann kann das IF-Ergebnis ja auch nicht positiv sein da ja Dateien im Ordner sind. Du musst also schon was mit diesen neuen Dateien tun (verschieben/löschen) damit der Ordner leer wird.
Du startest nur den Acrobat und tust sonst nichts ??? Wie soll der Ordner davon dann leer werden ??
Mir scheint du verstehst dein eigenes Skript überhaupt nicht ????
Das Skript überwacht ja Ordner auf neue Dateien und blockiert dementsprechend so lange den Loop bis neue Dateien im Ordner sind.
Ich bin hier raus.Nur Code kopieren macht noch keinen Programmierer... Für Grundlagen gibt es Bücher.
Ciao skybird
Du startest nur den Acrobat und tust sonst nichts ??? Wie soll der Ordner davon dann leer werden ??
Mir scheint du verstehst dein eigenes Skript überhaupt nicht ????
Das Skript überwacht ja Ordner auf neue Dateien und blockiert dementsprechend so lange den Loop bis neue Dateien im Ordner sind.
Ich bin hier raus.Nur Code kopieren macht noch keinen Programmierer... Für Grundlagen gibt es Bücher.
Ciao skybird
__InstanceDeletionEvent
Dann sollte es nun endgültig Klick machen.
BTW. Schau mal hier:
PDF via Powershell drucken - Reader nach druck schließen
Siehe letztes Kommentar, falsches Event!!
Case "__InstanceCreationEvent" feuert nur wenn neue Dateien im Ordner erstellt werden. Also __InstanceDeletionEvent hinzufügen.
Case "__InstanceCreationEvent" feuert nur wenn neue Dateien im Ordner erstellt werden. Also __InstanceDeletionEvent hinzufügen.
Const strPath = "C:\Users\Max\Desktop\test1"
Const strPath2 = "C:\Users\Max\Desktop\test2"
Const intInterval = 2
strDrive = Split(strPath,"\")(0)
strFolder = Replace(Split(strPath,":")(1),"\","\\") & "\\"
strDrive2 = Split(strPath2,"\")(0)
strFolder2 = Replace(Split(strPath2,":")(1),"\","\\") & "\\"
Set fso = WScript.CreateObject("Scripting.Filesystemobject")
Set objShell = CreateObject("Wscript.Shell")
Set objWMIService = GetObject( "winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2" )
strQuery = "Select * From __InstanceOperationEvent" _
& " Within " & intInterval _
& " Where Targetinstance Isa 'CIM_DataFile'" _
& " And ((TargetInstance.Drive='" & strDrive & "'"_
& " And TargetInstance.Path='" & strFolder & "') or "_
& "(TargetInstance.Drive='" & strDrive2 & "'"_
& " And TargetInstance.Path='" & strFolder2 & "'))"
Set colEvents = objWMIService.ExecNotificationQuery (strQuery)
Do
Set objEvent = colEvents.NextEvent()
Set objTargetInst = objEvent.TargetInstance
Select Case objEvent.Path_.Class
Case "__InstanceCreationEvent" 'Event wenn eine neue Datei im Ordner erstellt wird
' Testweise Taschenrechner starten
objShell.Run "calc.exe"
Case "__InstanceDeletionEvent" 'Event tritt auf wenn eine Datei aus einem Ordner entfernt oder verschoben wird
' Wenn beide Ordner leer sind:
if fso.GetFolder(strPath).Files.Count = 0 And fso.GetFolder(strPath2).Files.Count = 0 then
'Suche den Prozess und beende ihn (Demo: Alle Taschenrechner werden beendet)
Set ProcessList = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2").ExecQuery("SELECT * FROM Win32_Process WHERE Name = 'calc.exe'")
For Each objProcess In ProcessList
objProcess.Terminate
Next
' Nur eine Meldung ausgeben wenn mindestens eine Instanz des Programms beendet wurde
If ProcessList.Count > 0 Then
Msgbox "Beide Ordner leer, Programm wurde beendet."
End If
End if
End Select
loop
Wat nu ? , s.o. ...