goodbytes
Goto Top

Ordner-Überwachung per Skript

Hallo,
hat jemand zufällig eine schnelle Lösung per vbs oder Batch parat, mit der ich überwachen kann, dass bestimmte Dateitypen nicht länger als eine maximale Zeit (z.B. 15 Minuten) in einem Ordner liegen bleiben. (Ist der temporäre Ordner eines POP3-Connectors, in dem die *.msg-Dateien kurz landen. Wenn sie länger darin liegen bleiben stimmt etwas nicht. Hier geht`s aber um Fristen.)

Torsten


[Edit Biber] 14.5.2008
Der Beitrag ist mittlerweile "fertig" und als gelöst markiert.
So, wie er sich entwickelt hat, verschiebe ich ihn mal von "Betriebssysteme" mach "Batch & Shell" zu den anderen Skripting-Lösungen und ändere den Titel in "Ordner-Überwachung per Skript".
[/Edit]

Content-Key: 87283

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

Printed on: April 19, 2024 at 00:04 o'clock

Member: Superschaf
Superschaf May 09, 2008 at 06:09:19 (UTC)
Goto Top
Es gibt seit Server 2003 R2 eine Dateiserver-Funktion, da kannst du Dateitypen verbieten.
Member: Iwan
Iwan May 09, 2008 at 06:44:49 (UTC)
Goto Top
lese Beitrag -> denke drüber nach -> if FrageVerstanden = True then Antworten Else: Close

Torsten möchte nicht wissen, wie man Dateitypen verbietet, sondern wie man einen Ordner überwacht

@Torsten
welcher Pop3-Connector ist es denn? hat der vielleicht noch zusätzliuche Funktionen, die man zur Überwachung nutzen könnte?
Member: goodbytes
goodbytes May 09, 2008 at 08:18:57 (UTC)
Goto Top
Hallo,
richtig, um das Verbieten bestimmter Dateitypen ging`s nun wirklich nicht.
Ich nutze "POPcon" (www.popcon.de). Leider habe ich da keine Möglichkeiten zu sowas.
Hab auch noch mal in meinem Batch/Script-Ordner gekramt und bin tatsächlich auf was gestossen.
In diesem Fall hatte ich alle 15min (mittels Taskplaner) einen Ordner überwacht, ob neue Dateien

Anfang !!!

' Ordnerüberwachung:

' Art der verwendeten Logbucheinträge, 0 = Success, 1 = Error, 2 = Warning, 4 = Information
NEWEVENT = 1
DELEVENT = 2

' Verzeichnis, in dem die Dateien protokolliert werden sollen
LOGDIR = "C:\Programme\POPcon\"
' Dateien, die gesucht werden sollen
FILEMASK = "*.msg"

' Art der verwendeten Logbucheinträge, 0 = Success, 1 = Error, 2 = Warning, 4 = Information
NEWEVENT = 1
DELEVENT = 2

' Diese temporäre Datei wird für den Vergleich benötigt. Das Script muss im verwendeten Verzeichnis Schreibrechte haben.
DIRFILE = "C:\Programme\POPcon\Log.txt"

' NewDel = 1: Alle Unterschiede protokollieren
' NewDel = 0: Nur neu hinzugekommene Dateien protokollieren
NewDel = 1

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objShell = CreateObject("WScript.Shell")

'Alte Liste aus DIRFILE in Array Zeile0() einlesen
If objFSO.FileExists(DIRFILE) Then 'DIRFILE vorhanden
Set objDirFile = objFSO.OpenTextFile(DIRFILE, 1)
If Not objDirFile.AtEndOfStream Then 'DIRFILE nicht leer
strZeile0 = objDirFile.ReadAll
Zeile0 = Split(strZeile0, vbCrLF)
Else
Zeile0 = Array("")
End If 'DIRFILE nicht leer
Else
Zeile0 = Array("")
End If 'DIRFILE vorhanden

' Alle Err-Dateien aus dem Ordner sortiert in das Array Zeile1() einlesen
strCMD = objShell.ExpandEnvironmentStrings("%ComSpec%") & " /c dir " & LOGDIR & "\" & FILEMASK & " /b /od /a-d 2>nul"
strZeile1 = objShell.Exec(strCMD).StdOut.ReadAll
Zeile1 = Split(strZeile1, vbCrLF)

' Am Ende der Ausführung aktuelle Dateiliste in DIRFILE speichern
objFSO.OpenTextFile(DIRFILE, 2, True).Write strZeile1

' *
' Dateivergleich zwischen Content.txt (Zeile0) und aktueller Liste (Zeile1)
' *

If LCase(Trim(strZeile0)) <> LCase(Trim(strZeile1)) Then 'Dateiliste hat sich verändert

' Hinzugekommene Dateien in "Hinzu1" schreiben
Hinzu1 = ""
For i = 0 To UBound(Zeile1)
Hinzu = Filter(Zeile0, Zeile1(i), True)
If UBound(Hinzu) = -1 Then Hinzu1 = Hinzu1 & vbCrLF & Zeile1(i)
Next

If Hinzu1 <> "" Then 'Es sind Dateien hinzugekommen
' Event für hinzugekommene Dateien in das Logbuch schreiben
EventStr = "Neu hinzugekommene Dateien vom Typ " & FILEMASK & " :"
EventStr = EventStr & Hinzu1
' objShell.LogEvent NEWEVENT, EventStr
'WScript.Echo("EventHinzu: " & EventStr & vbCrLF) 'zu Demozwecken Ausgabe anstatt Event-Eintrag
Set WSHShell = WScript.CreateObject("WScript.Shell") 'Batch-Datei an Eingabeaufforderung übergeben
WSHShell.Run("cmd.exe /c Batch.cmd"), 0, True
End If 'Es sind Dateien hinzugekommen

Else
'WScript.Echo "Keine Unterschiede gefunden!" 'Ausgabe zu Demozwecken
End If

Ende !!!

Nun müsste ich es noch so umstricken, dass bei einer Übereinstimmung mindestens eines Dateinamens das Ereignis ausgelöst wird.
Naja, mal sehen.

Torsten
Member: bastla
bastla May 09, 2008 at 13:20:18 (UTC)
Goto Top
Hallo TorstenB!

Versuch es damit:
' Ordnerüberwachung:  

' Verzeichnis, in dem die Dateien protokolliert werden sollen  
LOGDIR = "C:\Programme\POPcon\"  
' Dateien, die gesucht werden sollen  
FILEMASK = "*.msg"  
' Diese temporäre Datei wird für den Vergleich benötigt. Das Script muss im verwendeten Verzeichnis Schreibrechte haben.  
DIRFILE = "C:\Programme\POPcon\Log.txt"  
'Diesen Batch ausführen, wenn mindesten eine alte Datei gefunden wird  
BATCH = "C:\Batch.cmd"  

Set objFSO = CreateObject("Scripting.FileSystemObject")  
Set objShell = CreateObject("WScript.Shell")  

'Alte Liste aus DIRFILE in Array Zeile0() einlesen  
If objFSO.FileExists(DIRFILE) Then 'DIRFILE vorhanden  
	Set objDirFile = objFSO.OpenTextFile(DIRFILE, 1)
	If Not objDirFile.AtEndOfStream Then 'DIRFILE nicht leer  
		strZeile0 = objDirFile.ReadAll
	Else
		strZeile0 = ""  
	End If 'DIRFILE nicht leer  
Else
	strZeile0 = ""  
End If 'DIRFILE vorhanden  

' Alle Dateien aus dem Ordner sortiert in das Array Zeile1() einlesen  
strCMD = objShell.ExpandEnvironmentStrings("%ComSpec%") & " /c dir " & LOGDIR & "\" & FILEMASK & " /b /od /a-d 2>nul"  
strZeile1 = objShell.Exec(strCMD).StdOut.ReadAll
Zeile1 = Split(strZeile1, vbCrLF)

' Am Ende der Ausführung aktuelle Dateiliste in DIRFILE speichern  
objFSO.OpenTextFile(DIRFILE, 2, True).Write strZeile1

' *  
' Dateivergleich zwischen Content.txt (Zeile0) und aktueller Liste (Zeile1)  
' *  

If LCase(Trim(strZeile0)) <> LCase(Trim(strZeile1)) Then 'Dateiliste hat sich verändert  
	strZeile0 = vbCrLF & strZeile0 'jeder Eintrag ist jetzt von vbCrLF umgeben und kann entsprechend gesucht werden  
	For i = 0 To UBound(Zeile1)
		If InStr(1, strZeile0, vbCrLF & Zeile1(i) & vbCrLF, vbTextCompare) Then
			'noch vorhanden  
			'Batch-Datei an Eingabeaufforderung übergeben  
			objShell.Run "cmd.exe /c " & BATCH , 0, True  
			'weitere Überprüfung nicht erforderlich  
			Exit For
		End If
	Next
Else 'Dateiliste unverändert  
	'Batch-Datei an Eingabeaufforderung übergeben  
	objShell.Run "cmd.exe /c " & BATCH , 0, True  
End If
Den Pfad für die auszuführende Batchdatei habe ich aus Gründen der Übersichtlichkeit ebenfalls (am Anfang des Scripts) einer Variablen zugewiesen.

Grüße
bastla

P.S.: Wenn Du das nächste Mal ein Script postest, bitte anstelle von "Anfang !!!" und "Ende !!!" < code> und < /code> (natürlich ohne Leerzeichen) verwenden ...
Member: goodbytes
goodbytes May 13, 2008 at 07:53:56 (UTC)
Goto Top
Hallo bastla,
ich hab`s mal ausprobiert. Der Ordnerinhalt wird auch sauber in die Logdatei geschrieben. Allerdings schlägt offenbar der Vergleich fehl.
Die Testdatei habe ich drin liegen gelassen. Beim zweiten Aufruf des Scripts hätte der Vergleich eigentlich positiv ausfallen müssen und die Batch ausgeführt werden müssen.
Ging aber nicht. Woran könnte das noch liegen?

Torsten
Member: bastla
bastla May 13, 2008 at 08:25:36 (UTC)
Goto Top
Hallo TorstenB!

Füge testweise die Zeilen
WScript.Echo "Alt (" & Len(Trim(strZeile0)) & "): " & vbCrLF & strZeile0  
WScript.Echo "Neu (" & Len(Trim(strZeile1)) & "): " & vbCrLF & strZeile1  
vor "If LCase ..." ein und starte das Script von der Kommandozeile mit
cscript //nologo "PfadZuDeinemScript" 
Die Zahl nach "Alt" bzw "Neu" gibt die Zeichenanzahl der beiden Inhaltsverzeichnisse an und sollte bei zweimaligem Durchlauf den selben Wert haben; ebenso müssten die angezeigten Dateilisten übereinstimmen.

Zusätzlich kannst Du noch den Batchstart mit folgender Zeile (jeweils unmittelbar vor "objShell.Run..." platzieren) dokumentieren:
WScript.Echo "Starte """ & BATCH & """"  

Grüße
bastla
Member: goodbytes
goodbytes May 13, 2008 at 10:48:28 (UTC)
Goto Top
Hallo bastla,
mmm, nun es wurde sauber angezeigt und hat auch funktioniert.
Ich habe ja mittlerweile hin- und herprobiert; offenbar hatte ich irgendwo einen Tippfehler drin.
So ist es also auf jeden Fall lauffähig.
Eine Frage hab ich da noch. Im Normalfall sollte sich ja immer keine msg-Datei darin befinden, nur ganz kurz mal. In den meisten Fällen wird in der Logdatei immer nichts stehen. Wie kann ich nun noch abfangen, dass die Batch gestartet wird wenn bei zwei Aufrufen beides Mal die Logdatei leer ist? In diesem Fall startet momentan ja auch die Batch, da der Inhalt der Logdatei identisch ist.

Torsten
Member: bastla
bastla May 13, 2008 at 11:25:07 (UTC)
Goto Top
Hallo TorstenB!

Einfach in den letzten Teil noch eine Abfrage rein:
Else 'Dateiliste unverändert  
	'Batch-Datei an Eingabeaufforderung übergeben  
	If Trim(strZeile1) <> "" Then objShell.Run "cmd.exe /c " & BATCH , 0, True  
End If
Alternativ dazu könntest Du auch schon vor dem If LCase ... mit
If Trim(strZeile1) = "" Then WScript.Quit  
bei aktuell leerem Ordner gleich das Script beenden.

Grüß
bastla
Member: goodbytes
goodbytes May 13, 2008 at 12:34:17 (UTC)
Goto Top
Hallo bastla,
klappt prima; ich hab mich für die zweite Variante entschieden, da das Script ja nicht unnötig weiter ablaufen muss wenn der Ordner ohnehin leer ist.

Vielen Dank für die schnelle Hilfe !!! face-smile

Torsten
Member: bastla
bastla May 13, 2008, updated at Oct 18, 2012 at 16:35:42 (UTC)
Goto Top
Hallo TorstenB!

Vielleicht könntest Du dann noch Deinen hier geposteten Parallelbeitrag in einen Hinweis auf diesen Thread verwandeln ...

Grüße
bastla
Member: goodbytes
goodbytes May 14, 2008 at 05:19:15 (UTC)
Goto Top
Alles klar, hab ich gemacht.

Torsten