knuefi
Goto Top

Per Script Ordner überwachen und Prog. ausfühern

Hallo und einen schönen Sonntag zusammen,

ich würde gerne einen oder- besser noch drei Ordner überwachen lassen und bei auftauchen einer Datei sollen zwei Programme starten. Zudem soll, nachdem die Programme gestartet sind, ein weitere andere Ordner überwacht werden und bei auftauchen einer Datei ein Script gestartet werden. Nachdem das letzte Script beendet ist sollen die Programme und die Scripts zur Überwachungen beendet werden.
Beispiel:
Ich habe diese Ordner:
A, B, C und D.
Zudem Programme
XL und XXL
und ein Script:
Test
Ordner A, B und C werden per Script überwacht (alle 5 - 15 Sek. ) und bei auftauchen einer Datei wird Programm XL, XXL und das Script zur Überwachung des Ordner D gestartet. Das Programm XXL erzeugt eine neu Datei und legt diese in Ordner D ab. Jetzt wird vom Script, das Ordner D überwacht, ein weiteres Script (Test) gestartet. Ist Script Test beendet sollen alle Programme und Überwachung Script beendet werden.
Ist das Möglich?, ich hoffe ihr könnt mir helfen.
Gruß

Content-ID: 302123

Url: https://administrator.de/contentid/302123

Ausgedruckt am: 22.11.2024 um 05:11 Uhr

114757
114757 17.04.2016 aktualisiert um 17:14:48 Uhr
Goto Top
Knuefi
Knuefi 17.04.2016 um 18:51:30 Uhr
Goto Top
Ich versuche erstmal nur ein Ordner überwacht wird und nur ein Programm soll gestartet werden, leider startet das Programm nicht.

Const strPath = "C:\Users\Mustermann\Desktop\Test\LK\frage"  
Const intInterval = "5"  
'------------------------------  
strDrive = Split(strPath,"\")(0)  
strFolder = Replace(Split(strPath,":")(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 & "'"  

Set colEvents = objWMIService.ExecNotificationQuery (strQuery) 

Do 
start "C:\Program Files (x86)\Adobe\Acrobat Reader DC\Reader\AcroRd32.exe"	  
End If  

Loop
114757
114757 17.04.2016 aktualisiert um 19:01:49 Uhr
Goto Top
Fehlt ja die Hälfte face-wink und das ist kein Batch sondern VBS :-P

'Pfad der zu überwachen ist  
Const strPath = "C:\Users\Mustermann\Desktop\Test\LK\frage"  
'Überwachungs-Interval in Sekunden  
Const intInterval = "2"  
'------------------------------  
strDrive = Split(strPath,"\")(0)  
strFolder = Replace(Split(strPath,":")(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 & "'"  

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
Knuefi
Knuefi 17.04.2016 um 19:38:35 Uhr
Goto Top
Danke erstmal, ich habe natürlich erst mit "C:\Program Files (x86)\Adobe\Acrobat Reader DC\Reader\AcroRd32.exe" und anschließend mit versucht C:"\Program Files (x86)\Adobe\Acrobat Reader DC\Reader"\AcroRd32.exe" versucht, beides ohne Erfolg. Warum ist mir jetzt dank deiner Hilfe deutlich geworden. Leider habe ich den Unterschied bzw. die Auswirkung nicht verstanden. Warum muss drei mal das ", kannst du mir das bitte erklären?
114757
114757 17.04.2016 aktualisiert um 19:48:04 Uhr
Goto Top
Zitat von @Knuefi:
Warum muss drei mal das ", kannst du mir das bitte erklären?
Weil Leerzeichen im Pfad sind muss der Pfad zur EXE in zusätzliche Anführungszeichen eingeschlossen werden... und da die Zeichenfolge schon selbst mit einem " Eingeschlossen ist muss man um ein einzelnes " im String selbst zu erhalten, es verdoppeln (escapen), so einfach ist das ...
Stell dir vor du müsstest die EXE auf der Kommandozeile ausführen, da musst du bei einem Pfad mit Leerzeichen auch Anführungszeichen um den Pfad legen.
Knuefi
Knuefi 17.04.2016 um 20:11:42 Uhr
Goto Top
Super, so habe ich es verstanden. Kannst du mir bitte noch folgende Fragen beantworten:
Wie kann ich die Überwachung auf noch zwei Ordner erweitern?
Const strPath = "C:\Users\Mustermann\Desktop\Test\LK\frage"   
Wie kann ich ein weiteres Prog starten lassen?
objShell.Run """C:\Program Files (x86)\Adobe\Acrobat Reader DC\Reader\AcroRd32.exe"""  
Was muss hier verändert werden, damit statt ein ein Prog. ein Script gestartet wird?
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
Ich werde anschließend versuchen das von mir gewünschte Endprodukt zusammen zu bauen.
114757
114757 17.04.2016, aktualisiert am 20.04.2016 um 17:00:56 Uhr
Goto Top
Alle Antworten findest du im Code.
Zum starten einer Batch habe ich zwei Varianten drin die du je nach Einsatzzweck verwenden kannst, siehe Kommentare zum Programmablauf.
'Pfad der zu überwachen ist  
Const strPath = "C:\Users\Mustermann\Desktop\Test\LK\frage"  

Const strPath2 = "C:\Users\Mustermann\Desktop\Test\LK\frage2"  

'Überwachungs-Interval in Sekunden  
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"  
            ' Batch Skript starten, Variante 1 ohne warten auf das Ende  
            objShell.Run "cmd /c ""C:\Pfad\script.cmd"""  
            ' Batch Skript starten, Variante 2 mit warten auf das Ende   
            objShell.Run "cmd /c ""C:\Pfad\script.cmd""",0,True  
    End Select 
Loop
Knuefi
Knuefi 20.04.2016 um 16:52:52 Uhr
Goto Top
Hallo jodel32,

leider bin ich erst heute zum ausprobieren gekommen. Ich bekommen folgende Fehler Meldung, leider finde ich den Fehler nicht face-sad
fehlermeldung
114757
Lösung 114757 20.04.2016 um 17:01:22 Uhr
Goto Top
Kleiner Typo in der WMI-Query ... ist oben korrigiert.