dercolonel
Goto Top

Meldung bei neuen Dateien in einem System von Unterordnern

Hallo zusammen,

ich habe eine Ordnerstruktur in der einkommende Aufträge einsortiert werden.
Genauer: Insgesamt gibt es vier Produktgruppen mit jeweils mehreren Jahren, in denen nach Monaten unterteilt die Aufträge sortiert werden.

\Aufträge\Produktgruppe\Eingang2013\012013\Auftrag12345.pdf

Es kommt also in jedem Monat ein Unterordner im aktuellen Jahr in jeder Produktgruppe hinzu. Ich bin nun auf der Suche nach einem Meldesystem, am liebsten in VBS vergleichbar mit diesem:
Meldung bei hinzufügen einer Datei in den Ordner come

Es sollen abweichend vom o.g. Beispiel die gesamte Ordnerstrruktur unterhalb des Ordners Aufträge durchsucht werden und bei einer neuen Datei in einem Unterordner eine MessageBox erscheinen.

Meine Programmierkenntnisse reichen leider nicht mal bis zur Haustür, so dass ich allein nicht zu einer Lösung komme. Beispiele im Netz, die ich gefunden habe, beschränken sich nur auf einen Ordner. Ich bin also für jede Hilfe dankbar.

Gruß vom Colonel

Content-Key: 201340

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

Printed on: April 20, 2024 at 06:04 o'clock

Member: DerWoWusste
DerWoWusste Feb 06, 2013 at 12:44:50 (UTC)
Goto Top
Moin.

Es ist natürlich die Frage, was Du bezweckst, was also die Messagebox anzeigen soll. Wenn es nur darum geht zu sagen "Hallo, in der Ordnerstruktur wurde irgendwo eine neue Datei erstellt", dann hätte ich eine Lösung.
Member: DerColonel
DerColonel Feb 06, 2013 at 12:47:15 (UTC)
Goto Top
Das wäre schon eine starke Verbesserung der Situation. Wenn nun in der Messagebox noch stehen würde in welcher Produktgruppe sich was getan hat wäre es natürlich noch besser face-smile
Member: DerWoWusste
DerWoWusste Feb 06, 2013 at 13:02:59 (UTC)
Goto Top
Das ginge, wäre aber recht aufwändig.
Du kannst auf der Ordnerstruktur die NTFS-Überwachung aktivieren. Stell sie so ein, dass auch create/write überwacht werden und schon laufen diese Vorgänge im Eventlog auf, und zwar im Sicherheitsprotokoll. Wenn Du sie dort siehst, kannst Du per Kontextmenü Eventtriggers anheften, so dass beliebige Aktionen ausgeführt werden - zum Beispiel lokale order remote Popups oder Mails.

Wenn jedoch der Inhalt der Popups oder Mails nun noch sagen soll, was genau wo kreiert wurde, dann wird's schwierig, denn Du müsstest dafür aus dem Eventlog exportieren und das auch noch aufbereiten. Es ginge, aber nicht so ganz leicht wie der Rest.
Member: DerColonel
DerColonel Feb 06, 2013 at 13:36:19 (UTC)
Goto Top
Diese Lösung fällt flach, da es ein Firmennetzwerk ist und ich solche Einstellungen nicht vornehmen kann. Eine Lösung mit VB wäre mir ganz recht, da ich das ohne Probleme umsetzten kann.
Member: DerWoWusste
DerWoWusste Feb 06, 2013 at 13:40:36 (UTC)
Goto Top
Ok, dann sag mal kurz für mich und andere, wie weit Du denn den Rechner mit der Freigabe beeinflussen kannst, wenn Du dort nicht Admin bist.
Member: colinardo
colinardo Feb 06, 2013 updated at 14:29:20 (UTC)
Goto Top
Dann wäre dies ein Ansatz:
Das Script checkt alle 10 Sekunden nach neu hinzugefügten Dateien und meldet dann per Msgbox. Der Pfad ist in Zeile 10 anzugeben(Hinweis: Du musst WQL Syntax benutzen, d.h. Pfadangaben werden mit doppelbackslash angegeben und die jeweils "gequoted" also für ein Backslash sind "\\\\" nötig). Der Server-Name wird in der ersten Zeile angegeben.
Wenn du es startest passiert erst mal nix, das Script läuft aber im Hintergrund weiter und meldet sich erst wenn etwas im angegebenen Ordner erstellt wird...

strComputer = "."  
Set objWMIService = GetObject("winmgmts:" _  
    & "{impersonationLevel=impersonate}!\\" & _  
        strComputer & "\root\cimv2")  

Set colMonitoredEvents = objWMIService.ExecNotificationQuery _
    ("SELECT * FROM __InstanceCreationEvent WITHIN 10 WHERE " _  
        & "Targetinstance ISA 'CIM_DirectoryContainsFile' and " _  
            & "TargetInstance.GroupComponent= " _  
                & "'Win32_Directory.Name=""d:\\\\Aufträge\\\\Produktgruppe""'")  

Do
    Set objLatestEvent = colMonitoredEvents.NextEvent
    WScript.Echo objLatestEvent.TargetInstance.PartComponent
Loop

Noch als Hinweis, das Polling der Events sollte nicht zu häufig geschehen da es viele Resourcen verbraucht (s. Zeile 7 WITHIN 10).

Grüße Uwe
Member: DerColonel
DerColonel Feb 06, 2013 at 16:31:18 (UTC)
Goto Top
Danke Uwe für den Vorschlag. Diese Lösung ist in etwa die, die im Link genannt ist. Sie gibt Meldung, wenn in einem ganz bestimmten Ordner etwas passiert, hier im Ordner Produktgruppe.

Leider werden Unterordner im Ordner Produktgruppe nicht berücksichtigt. Ich möchte nicht die Pfadangaben in jedem Monat in vier Programmen ändern müssen, daher mein Wunsch die Funktion auf beliebeige Unterordner zu erweitern.

Sowas funktioniert leider nicht:
& "'Win32_Directory.Name=""d:\\\\Aufträge\\\\Produktgruppe\\\\*""'")
Member: DerWoWusste
DerWoWusste Feb 06, 2013 at 21:02:58 (UTC)
Goto Top
Noch eine Antwort auf meine Frage parat?
Member: TsukiSan
TsukiSan Feb 07, 2013 at 06:46:56 (UTC)
Goto Top
Hallo DerColonel,

eventuell hilft dir dieses Script ja weiter.
Du musst den Hauptpfad für deine Bedürfnisse anpassen und die Zykluszeit.
Das Script läuft endlos vor sich hin!
Beim Starten des Scriptes werden alle Dateien in allen Ordnern /Unterordnern als Referenz eingelesen. Wenn dann neue Dateien hinzukommen, gibt es eine Meldung und nach der Meldung wird auch diese neue Datei mit in die "Referenzliste" hinzugefügt.
Wenn eine Datei gelöscht wird, hat das keinerlei Einfluss.
Hier der Code:
Dim Pfad
Dim AktuelleDaten, DatenVergleichen
Dim FSO
Dim KeinTreffer

Set FSO = CreateObject("Scripting.FileSystemObject")  
Pfad = "C:\Auftraege\"  

'Beim Start des Scriptes alle Dateien einlesen  
ListOrdnerStart (Pfad)

'Ab hier die Ordner ueberwachen alle 20Sekunden  
For i = 0 to 1
	DatenVergleichen = Split(AktuelleDaten,vbcrlf)
	KeinTreffer = 0
	ListOrdnerPruefen (Pfad)
	Wscript.Sleep 10000 'alle 10Sekunden  
	i = 0
Next


Sub ListOrdnerStart(ordner)

	Set ordner = FSO.GetFolder(ordner)

	For Each file In ordner.files
		Pfadangabe =File.Path
		AktuelleDaten = AktuelleDaten & Pfadangabe & vbcrlf
	Next

	For Each Unterordner In Ordner.subfolders
		Pfadangabe = unterordner.path
		ListOrdnerStart Unterordner
	next
End Sub

Sub ListOrdnerPruefen(ordner)

	Set ordner = FSO.GetFolder(ordner)

	For Each file In ordner.files
		Pfadangabe =File.Path
		For j = 0 to (Ubound(DatenVergleichen) - 1)
			If DatenVergleichen(j) = Pfadangabe Then 
				KeinTreffer = 1
				j = Ubound(DatenVergleichen) - 1
			End If
		Next
		IF  KeinTreffer = 0 then
			Msgbox Pfadangabe & " ist neu erstellt!"  
			AktuelleDaten = AktuelleDaten & Pfadangabe & vbcrlf
		End If
		KeinTreffer = 0
	Next

	For Each Unterordner In Ordner.subfolders
		Pfadangabe = unterordner.path
		ListOrdnerPruefen Unterordner
	next

End Sub

Set FSO = Nothing

Gruss
Tsuki
Member: DerColonel
DerColonel Feb 07, 2013 at 07:13:48 (UTC)
Goto Top
Hallo Tsuki,
alles was ich bis jetzt mit Deinem Script probiert habe funktioniert genaus so wie ich es mir vorgestellt habe und durch Deine Kommentierung am Anfang kann ich das auch alles gut nachvollziehen.

Vielen herzlichen Dank.
Member: TsukiSan
TsukiSan Feb 07, 2013 at 07:37:45 (UTC)
Goto Top
Hallo DerColonel,

dann freue ich mich, wenn's funktioniert!

Viel Spass damit und eventuell ist das ja ein Anfang, sich mit VBS auseinanderzusetzen.

Viele Grüsse

Tsuki