kingspride
Goto Top

Ordnerüberwachung, Batchdatei aufrufen bei neuer Datei

Hallo,

bin jetzt schon seit gut 3 stunden im netz auf recherche, und komm nicht so recht voran.

eigentlich ist mein ziel recht simpel.
ich habe eine videowall, auf der im loop videos vom vlc angezeigt werden. das funktioniert auch soweit gut, mit systemstart.
der besitzer der videowall möchte allerdings gern von außen neue videos nachreichen können, damit diese dann in den loop integriert werden.

dazu habe ich mir die playlist m3u ausgesucht, da man diese recht einfach auch manuell schreiben kann.
geschrieben habe ich bereits 2 batchdateien, die die playlist datei anpassen, bzw erstellen sofern sie noch nicht vorhanden ist.

damit diese batch dateien funktionieren, müssen sie den dateinamen eines videofiles übergeben bekommen, in diesem fall als argument.

nun möchte ich den ordner überwachen, und immer wenn eine neue datei dort hinzukommt oder eine datei gelöscht wird, die passende batch datei mit dem passenden dateinamen aufrufen und füttern.

tja, und genau da komme ich nicht weiter.
kann mir jemand weiterhelfen?

mein bisheriger code:

create-plist.bat:

@echo off

if exist plist.m3u (goto anhang)
echo #EXTM3U > plist.m3u
echo Neue Playlist erstellt

timeout -t 3 -nobreak > nul

:anhang
echo #EXTINF:1,%1>> plist.m3u
echo W:\hardcoded-ordnerpfad\,%1>> plist.m3u
echo Video wurde der Playlist angehaengt

timeout -t 3 -nobreak > nul

exit

delete-plist.bat:

@echo off

"W:\hardcoded-ordnerpfad\plist.m3u" findstr -v %1 "W:\hardcoded-ordnerpfad\plist.m3u"  

echo Eintrag aus Playlist geloescht, Playlist neu erstellt
timeout -t 3 -nobreak > nul

exit

(die timeouts sind nur kosmetik, damit man ne chance hat zu lesen, was das batch so von sich gibt face-wink )

Vielen Dank schon mal!

Content-ID: 243603

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

Ausgedruckt am: 26.11.2024 um 09:11 Uhr

rubberman
rubberman 14.07.2014 um 21:59:33 Uhr
Goto Top
Hallo kingspride.

Die WMI ist ein geeignetes Mittel. Wäre ein VBScript für dich in Ordnung?

Grüße
rubberman
kingspride
kingspride 14.07.2014 um 22:09:11 Uhr
Goto Top
hey, vbs ginge auch, kenn mich damit halt nicht aus. wäre super, wenn du dazu dann noch ein zwei worte schreiben könntest, damit ich verstehe was du mir vorschlägst face-smile

danke auf jedenfall schon für die schnelle antwort! face-smile
Gersen
Gersen 14.07.2014 um 22:27:25 Uhr
Goto Top
Hallo,

falls Du Dich in der .NET-Welt auskennst:

http://msdn.microsoft.com/de-de/library/system.io.filesystemwatcher?cs- ...

Gruß,
Gersen
rubberman
Lösung rubberman 14.07.2014, aktualisiert am 16.07.2014 um 18:13:21 Uhr
Goto Top
Ungetestet etwa so:
Const strObserve = "C:\ordner\der\überwacht\werden\soll"  
Const strBatPath = "C:\pfad\deinedatei.bat"  
Const strSec = "10"  

Set objWSHShell = CreateObject("WScript.Shell")  
Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")  
Set colEvents = objWMIService.ExecNotificationQuery _
  ("SELECT * FROM __InstanceCreationEvent WITHIN " & strSec & " WHERE " _  
  & "TargetInstance ISA 'CIM_DirectoryContainsFile' AND " _  
  & "TargetInstance.GroupComponent = 'Win32_Directory.Name=""" _  
  & Replace(strObserve, "\", "\\\\") _  
  & """'")  

Do
  Set objEvent = colEvents.NextEvent()
  strFile = Replace(Replace(Split(objEvent.TargetInstance.PartComponent, "=")(1), "\\", "\"), """", "")  
  objWSHShell.Run "cmd /c """"" & strBatPath & """ """ & strFile & """"""  
Loop
Wenn's funktioniert wird alle 10s in Ordner strObserve nach einer neuen Datei gesucht (Trigger ist ein entsprechendes Event). Der komplette Pfad dieser Datei wird ermittelt und an deine Batchdatei übergeben.

Grüße
rubberman
kingspride
kingspride 14.07.2014 aktualisiert um 22:42:15 Uhr
Goto Top
vielen dank face-smile

teste es gleich.

noch eine frage: ordner mit leerstelle im namen dürfte kein problem darstellen, richtig? sind ja anführungszeichen da...

(und wenn du mir noch eine schreibst für das event, dass eine datei entfernt wird, wäre ich vollends glücklich face-smile)

edit: schade, funktioniert noch nicht. zeile 6, nicht analysierbare abfrage...
rubberman
rubberman 14.07.2014 aktualisiert um 23:07:10 Uhr
Goto Top
(und wenn du mir noch eine schreibst für das event, dass eine datei entfernt wird, wäre ich vollends glücklich face-smile)
Statt __InstanceCreationEvent ein __InstanceDeletionEvent in Zeile 8.

Grüße
rubberman
kingspride
kingspride 14.07.2014 um 22:44:12 Uhr
Goto Top
danke ! btw, meinte zeile 7, nicht 6.
rubberman
rubberman 14.07.2014 aktualisiert um 23:06:22 Uhr
Goto Top
Hmm, dann muss ich wohl doch selbst mal testen.

EDIT OK, Kleiner Schreibfehler. Hab's oben im Code geändert. (Kill ggf. das alte Script im Taskmanager wscript.exe)
rubberman
rubberman 14.07.2014 um 23:33:12 Uhr
Goto Top
Sorry, war noch ein Fehler drin...
kingspride
kingspride 15.07.2014 um 00:05:54 Uhr
Goto Top
hey, danke dir nochmals face-smile

allerdings scheint immernoch was nicht zu klappen face-sad
das script startet, bleibt im hintergrund laufen, aber es passiert einfach nix, wenn ich eine neue datei in den ordner kopiere?
kann es sein, dass ein leerzeichen im pfad das problem ist, oder müsste das gehen?

vielen dank nochmals, du hast mir schon irsinnig viel weitergeholfen.
rubberman
rubberman 15.07.2014 um 00:26:21 Uhr
Goto Top
Ich hab mit Leerzeichen im Pfad getestet, funktioniert bei mir.

Wenn's kein zu großes Geheimnis ist, poste doch mal wie die ersten 3 Zeilen bei dir in der Realität aussehen.
kingspride
kingspride 16.07.2014 um 17:31:58 Uhr
Goto Top
Const strObserve = "W:\Bibliotheken\Videos\videowall axel\"  
Const strBatPath = "W:\Bibliotheken\Videos\videowall axel\create-playlist.bat"  
Const strSec = "10"  

Set objWSHShell = CreateObject("WScript.Shell")   
Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")   
Set colEvents = objWMIService.ExecNotificationQuery _ 
	("SELECT * FROM __InstanceCreationEvent WITHIN " & strSec & " WHERE " _   
	& "TargetInstance ISA 'CIM_DirectoryContainsFile' AND " _   
	& "TargetInstance.GroupComponent = 'Win32_Directory.Name=""" _   
	& Replace(strObserve, "\", "\\\\") _   
	& """'")   

Do
	Set objEvent = colEvents.NextEvent() 
	strFile = Replace(Replace(Split(objEvent.TargetInstance.PartComponent, "=")(1), "\\", "\"), """", "")   
	objWSHShell.Run "cmd /c """"" & strBatPath & """ """ & strFile & """"""   
Loop

eigentlich nur kopiert...
rubberman
Lösung rubberman 16.07.2014 aktualisiert um 18:13:12 Uhr
Goto Top
eigentlich nur kopiert...
Joa, deshalb wollte ich ja auch wissen wie die ersten Zeilen bei dir aussehen, et voilà des Rätsels Lösung:
Wenn du den letzten Backslash hinter dem Pfad in strObserve mal entfernst, sollte es schon funktionieren (hatte ich dir auch anders vorgeturnt face-wink).

Ansonsten: Die Batchdateien erben das Arbeitsverzeichnis vom VBScript. Sollte das VBScript also in einem anderen Verzeichnis liegen, dann ergänze in den Batchcodes unter dem @echo off noch die Zeile
cd /d "%~dp0"

Grüße
rubberman
kingspride
kingspride 16.07.2014 um 18:06:28 Uhr
Goto Top
vielen dank, funktioniert jetzt!!

dass mit den slashes passiert mir leider ständig^^
jeder brauchts anders...

jetzt hab ich nur noch eine frage.

der pfad wird scheinbar mit anführungszeichen übergeben, kann ich das irgendwie loswerden?
m3u hat damit leider probleme. face-sad
rubberman
Lösung rubberman 16.07.2014 aktualisiert um 18:13:08 Uhr
Goto Top
Ja klar. %1 enthält den übergebenen Parameter so wie er ankommt.
Die Tilde in %~1 würde umschließende Anführungszeichen entfernen.

Grüße
rubberman
kingspride
kingspride 16.07.2014 um 18:13:03 Uhr
Goto Top
ahhh danke!

geht jetzt alles. face-smile