Einzelne Dateien auf Veränderung überwachen
Normalerweise gibt es ja dafür genug Programme. Leider ist mein Rechner so gesichert, dass nichts installiert werden kann.
Also, ich arbeite in einem Netzwerk. Ich teile mir mehrere Exceltabellen mit mehreren Kollegen. Sobald der Mitarbeiter Daten in die Exceltabelle eingestellt hat, muss ich diese weiter verarbeiten. Ich möchte aber nicht andauernd nachschauen müssen, ob eine Veränderung z.B. das aktualisierungs Datum der Datei stattgefunden hat.
Falls Möglich, sollte eine Batch Datei alle paar Minuten prüfen, ob die Exceldatei geändert wurde und dann ein beliebigen Befehl ausführen.
Ich habe es mit meinen bescheidenen Kenntnissen zwar mit folgender Batch geschafft.
Mir gefällt aber daran nicht, dass jedesmal auf das Laufwerk zugegriffen wird.
Kann die Prüfung auch im Speicher (ohne File und ohne Laufwerk) stattfinden?
Für eine Änderung der Batch oder für eine neue Batch wäre ich dankbar.
Vielleicht gibt es aber auch schon eine fertige Batch?
Eine der zu prüfenden Dateien heißt entsörung.xls
System ist Win 2000
x:
cd X:\data
:beginn
dir X:\data\ent*.xls /tw/a > dergebnis.txt
copy findergebnis.txt findergebnis1.txt
findstr "entsörung.xls" dergebnis.txt >findergebnis.txt
echo N|comp findergebnis.txt findergebnis1.txt
IF ERRORLEVEL 1 ECHO Datei ist die alte
pause
IF NOT ERRORLEVEL 1 GOTO beginn
else start cmd.exe
Also, ich arbeite in einem Netzwerk. Ich teile mir mehrere Exceltabellen mit mehreren Kollegen. Sobald der Mitarbeiter Daten in die Exceltabelle eingestellt hat, muss ich diese weiter verarbeiten. Ich möchte aber nicht andauernd nachschauen müssen, ob eine Veränderung z.B. das aktualisierungs Datum der Datei stattgefunden hat.
Falls Möglich, sollte eine Batch Datei alle paar Minuten prüfen, ob die Exceldatei geändert wurde und dann ein beliebigen Befehl ausführen.
Ich habe es mit meinen bescheidenen Kenntnissen zwar mit folgender Batch geschafft.
Mir gefällt aber daran nicht, dass jedesmal auf das Laufwerk zugegriffen wird.
Kann die Prüfung auch im Speicher (ohne File und ohne Laufwerk) stattfinden?
Für eine Änderung der Batch oder für eine neue Batch wäre ich dankbar.
Vielleicht gibt es aber auch schon eine fertige Batch?
Eine der zu prüfenden Dateien heißt entsörung.xls
System ist Win 2000
x:
cd X:\data
:beginn
dir X:\data\ent*.xls /tw/a > dergebnis.txt
copy findergebnis.txt findergebnis1.txt
findstr "entsörung.xls" dergebnis.txt >findergebnis.txt
echo N|comp findergebnis.txt findergebnis1.txt
IF ERRORLEVEL 1 ECHO Datei ist die alte
pause
IF NOT ERRORLEVEL 1 GOTO beginn
else start cmd.exe
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 49613
Url: https://administrator.de/forum/einzelne-dateien-auf-veraenderung-ueberwachen-49613.html
Ausgedruckt am: 22.04.2025 um 18:04 Uhr
9 Kommentare
Neuester Kommentar
Hallo Poke256 und willkommen im Forum!
Batch habe ich nicht anzubieten, aber vielleicht kannst Du ja folgende VBScript-Lösung verwenden:
Gebrauchsanweisung:
Passe die Defaultwerte für zu überwachende Datei und Intervall (in ms) an und speichere das Script zB in "D:\Scripts\CheckUpdated.vbs".
Wenn Du das Script durch Doppelklick auf die Datei "CheckUpdated.vbs" startest, werden die eingetragenen Werte verwendet.
Alternativ dazu (etwa um parallel eine zweite Datei zu überwachen) kannst Du am CMD-Prompt eingeben:
In diesem Beispiel würde die Datei "X:\Data\versörung.xls" nur alle 2 Minuten (120 s) überprüft.
Eine weitere Startmöglichkeit wäre eine Verknüpfung, wobei die dargestellte Zeile als Ziel einzutragen wäre.
Wenn die Datei neu gespeichert wurde, erfährst Du dies (spätestens nach Ablauf des Intervalls von zB 2 Min) durch eine MessageBox (mit Hinweis auf den Dateinamen und das Speicherdatum samt -zeit). In dieser MessageBox hast Du jetzt die Möglichkeit, die Überwachung weiter durchführen zu lassen ("OK"), oder Du wählst "Abbrechen".
Zum Beenden der Überwachung ohne die angesprochene MessageBox musst Du den "wscript.exe"-Prozess beenden (Register "Prozesse" im Task-Manager - Aufruf über Str-Alt-Entf).
HTH
bastla
Batch habe ich nicht anzubieten, aber vielleicht kannst Du ja folgende VBScript-Lösung verwenden:
'CheckUpdated.vbs
'Defaultwerte:
sFile = "X:\Data\entsörung.xls"
lInterv = 30000 '30 s
If WScript.Arguments.Count > 0 Then sFile = WScript.Arguments(0)
If WScript.Arguments.Count > 1 Then lInterv = WScript.Arguments(1)
MsgBox "Überwachung von " & sFile & vbCrLF & "gestartet, Intervall: " & lInterv / 1000 & " Sekunden"
Set fso = CreateObject("Scripting.FileSystemObject")
bRun = True
sTimeStamp = fso.GetFile(sFile).DateLastModified
Do While bRun
Do While fso.GetFile(sFile).DateLastModified = sTimeStamp
WScript.Sleep lInterv
Loop
sTimeStamp = fso.GetFile(sFile).DateLastModified
iRet = MsgBox("Datei " & sFile & " wurde geändert." , 65, sTimeStamp)
If iRet = vbCancel Then bRun = False
Loop
Msgbox "Überwachung von " & sFile & " beendet."
Passe die Defaultwerte für zu überwachende Datei und Intervall (in ms) an und speichere das Script zB in "D:\Scripts\CheckUpdated.vbs".
Wenn Du das Script durch Doppelklick auf die Datei "CheckUpdated.vbs" startest, werden die eingetragenen Werte verwendet.
Alternativ dazu (etwa um parallel eine zweite Datei zu überwachen) kannst Du am CMD-Prompt eingeben:
D:\Scripts\CheckUpdated.vbs "X:\Data\versörung.xls" 120000
Eine weitere Startmöglichkeit wäre eine Verknüpfung, wobei die dargestellte Zeile als Ziel einzutragen wäre.
Wenn die Datei neu gespeichert wurde, erfährst Du dies (spätestens nach Ablauf des Intervalls von zB 2 Min) durch eine MessageBox (mit Hinweis auf den Dateinamen und das Speicherdatum samt -zeit). In dieser MessageBox hast Du jetzt die Möglichkeit, die Überwachung weiter durchführen zu lassen ("OK"), oder Du wählst "Abbrechen".
Zum Beenden der Überwachung ohne die angesprochene MessageBox musst Du den "wscript.exe"-Prozess beenden (Register "Prozesse" im Task-Manager - Aufruf über Str-Alt-Entf).
HTH
bastla
Moin Poke256,
auch von mir ein Willkommen.
Ich war schon im Vorfeld ganz gespannt auf bastla's Lösung und wollte als ersten Satz schreiben:
"Eigentlich ist das nicht sinnvoll im Batch zu lösen, ich würde das mit VBS abfackeln und auf bastla warten."
Aber what shalls, zufällig habe ich ja gerade eine ähnliche Anforderung und ebenso zufällig auch meinen sportlichen Ehrgeiz...
Mein Szenario und meine Vorüberlegungen für eine Batch-Strategie:
Ich habe auf einem Serverlaufwerk Dokumentationen, die ich zusammen (aber räumlich getrennt) mit einem Kollegen bearbeite.
Diese Dateien werden sporadisch/unregelmäßig gepflegt, aber wenn es eine Änderung gibt, schaue ich es mir asap an.
Diese Dateien bei mir sind keine ".xls"-Dateien, sondern haben eine andere Extension.
Da ich den Batch variabel halten will, definiere ich (uns) eine %ext%-Variable.
Entsprechend auch eine für das Server-Share-Laufwerk (%share%).
Den aktuellsten Stand der Dateien speichere ich lokal (als gefilterten DIR-Output) in einem Pfad %compdir%.
Ähnlich wie Du, Poke256, nit Deiner Ergebnis.txt. Bei mir heißt die lastRead.txt.
Unterschied: ich starte meinen Schnipsel, nennen wir ihn CheckXLS.bat, dadurch, dass ich ihn ins Autostart-Verzeichnis lege.
Dann wird er morgens, wenn ich mich anmelde, gestartet. As is. Ohne Parameter.
Er tut, was ein Batch tun muss, und legt sich selbst bei dieser Gelegenheit nochmal für den Rest des Tages als AT-Job an.
Zu jeder folgenden (und der aktuellen) Stunde+30 Minuten.
Also, wenn ich mich morgens um 7:15 anmelde, lege ich mit dieser Zeile
gleich für 7:30, 8:30, 9:30.....23:30 ein paar Jobs an, die diesen Batch dann aufrufen.
Falls Du nicht bis 23:30 unterwegs bist, solltest Du das "in (%%i,1,23)" ändern in "in (%%i,1,17)" oder so.
Und wenn der Batch eine Meldung abgefeuert hat, dann wird der aktuelle Stand auf dem %share%-Verzeichnis wieder als neue Grundlage genommen.
Sprich: in die Datei %compDir%\lastRead.txt geschrieben.
[Flüchtig getestete Skizze]
Kernstück ist eigentlich die FOR-Anweisung, die den Vergleich macht.
Und zwar bei mir über alle Dateien in diesem %share%-Verzeichnis, nicht nur über eine.
Ist ja der gleiche Aufwand.
Alles andere ist nur Beiwerk.
Falls es KEIN AT-Job werden muss, sondern der Batch aus einem geöffneten CMD-Fenster gestartet wird:
Ersetze :
Und nochmal für Schnell-Leser und Copy&Paster:
So, wie der Schnipsel designed ist, legt er beim Aufgerufenwerden ohne Parameter ganz viele "Geplante Tasks" für den Rest des Tages an.
Also bitte beim Testen vom CMD-Prompt lieber x-beliebigen Parameter (z.b. "öalklklklklklkgüj") mitgeben.
Grüße
Biber
auch von mir ein Willkommen.
Ich war schon im Vorfeld ganz gespannt auf bastla's Lösung und wollte als ersten Satz schreiben:
"Eigentlich ist das nicht sinnvoll im Batch zu lösen, ich würde das mit VBS abfackeln und auf bastla warten."
Aber what shalls, zufällig habe ich ja gerade eine ähnliche Anforderung und ebenso zufällig auch meinen sportlichen Ehrgeiz...
Mein Szenario und meine Vorüberlegungen für eine Batch-Strategie:
Ich habe auf einem Serverlaufwerk Dokumentationen, die ich zusammen (aber räumlich getrennt) mit einem Kollegen bearbeite.
Diese Dateien werden sporadisch/unregelmäßig gepflegt, aber wenn es eine Änderung gibt, schaue ich es mir asap an.
Diese Dateien bei mir sind keine ".xls"-Dateien, sondern haben eine andere Extension.
Da ich den Batch variabel halten will, definiere ich (uns) eine %ext%-Variable.
Entsprechend auch eine für das Server-Share-Laufwerk (%share%).
Den aktuellsten Stand der Dateien speichere ich lokal (als gefilterten DIR-Output) in einem Pfad %compdir%.
Ähnlich wie Du, Poke256, nit Deiner Ergebnis.txt. Bei mir heißt die lastRead.txt.
Unterschied: ich starte meinen Schnipsel, nennen wir ihn CheckXLS.bat, dadurch, dass ich ihn ins Autostart-Verzeichnis lege.
Dann wird er morgens, wenn ich mich anmelde, gestartet. As is. Ohne Parameter.
Er tut, was ein Batch tun muss, und legt sich selbst bei dieser Gelegenheit nochmal für den Rest des Tages als AT-Job an.
Zu jeder folgenden (und der aktuellen) Stunde+30 Minuten.
Also, wenn ich mich morgens um 7:15 anmelde, lege ich mit dieser Zeile
if [%1]== for /f "delims=:" %%i in ("%time%") do @for /L %%x in (%%i,1,23) do echo At %%x:30 /interactive "%~dspnx0 Noinit"
Falls Du nicht bis 23:30 unterwegs bist, solltest Du das "in (%%i,1,23)" ändern in "in (%%i,1,17)" oder so.
Und wenn der Batch eine Meldung abgefeuert hat, dann wird der aktuelle Stand auf dem %share%-Verzeichnis wieder als neue Grundlage genommen.
Sprich: in die Datei %compDir%\lastRead.txt geschrieben.
::--------------snipp CheckXLS.bat--------Biber 2007
@echo off & setlocal
REM ==========Beginn von: Hier anpassen
<b>Set "ext=xls" & Set compdir=d:\temp\comp
Set "shared=\\xxServer00119\whatever\ABCD_Systeme\9 Teilprojekte\9.2 XX-Warehouse\ZZ-Integration\DB-Modell"</b>
REM ========== Ende von Hier anpassen
if not exist %compdir% md %compdir%
if not exist %compdir%\lastread.txt dir "%shared%\*.%ext%"|find /i ".%ext%">%compdir%\lastread.txt
for /f "tokens=1-3*" %%a in (%compdir%\lastread.txt) do @(
if exist "%shared%\%%~nxd" @for %%i in ("%shared%\%%~nxd") do @(
if "%%a %%b" NEQ "%%~ti" (
echo [%%d]-Datum ist anders.. [%%a %%b] ungleich [%%~ti]
pause
set MsgSent=jepp
)))
REM Achtung: beim Aufruf OHNE Parameter geht der Batch in die folgende Zeile!!!!
if [%1]== for /f "delims=:" %%i in ("%time%") do @for /L %%x in (%%i,1,23) do <b>ECHO</b> At %%x:30 /interactive "%~dspnx0 Noinit"
REM----------------- in der Zeile über dieser das <b>ECHO</b> entfernen zum AT-Jobs-Anlegen.
if not defined MsgSent goto :eof
dir "%shared%\*.%ext%"|find /i ".%ext%">%compdir%\lastread.txt
Kernstück ist eigentlich die FOR-Anweisung, die den Vergleich macht.
Und zwar bei mir über alle Dateien in diesem %share%-Verzeichnis, nicht nur über eine.
Ist ja der gleiche Aufwand.
Alles andere ist nur Beiwerk.
Falls es KEIN AT-Job werden muss, sondern der Batch aus einem geöffneten CMD-Fenster gestartet wird:
Ersetze :
echo [%%d]-Datum ist anders.. [%%a %%b] ungleich [%%~ti]
-durch-MSG %username% [%%d]-Datum ist anders.. [%%a %%b] ungleich [%%~ti]
- und streiche das "pause".Und nochmal für Schnell-Leser und Copy&Paster:
So, wie der Schnipsel designed ist, legt er beim Aufgerufenwerden ohne Parameter ganz viele "Geplante Tasks" für den Rest des Tages an.
Also bitte beim Testen vom CMD-Prompt lieber x-beliebigen Parameter (z.b. "öalklklklklklkgüj") mitgeben.
Grüße
Biber
@Biber
Hattest Du überschüssige Vorschusslorbeeren?
An AT-Jobs hatte ich auch gedacht (um den schweren Schönheitsfehler hinsichtlich des Beendens zu vermeiden), aber da ich nicht wusste, wie dringend die Weiterverarbeitung ("... alle paar Minuten ...") sein würde, hab ich's vorläufig zurückgestellt (obwohl ja auch eine dreistellige Anzahl eigentlich kein Problem sein dürfte - oder?).
Im übrigen musste ich auch fast das Script im Hintergrund weiterlaufen lassen, damit ich durch die Zwischenspeicherung in einer Variablen dem Wunsch nach weniger Dateizugriffen Rechnung tragen konnte ...
@poke256
Da Du eine Prüfung "im Speicher" angeregt hast: Habt Ihr eigentlich die Datei beide gleichzeitig geöffnet (arbeitet also mit "freigegebenen Arbeitsmappen"?
Grüße
bastla
Hattest Du überschüssige Vorschusslorbeeren?
An AT-Jobs hatte ich auch gedacht (um den schweren Schönheitsfehler hinsichtlich des Beendens zu vermeiden), aber da ich nicht wusste, wie dringend die Weiterverarbeitung ("... alle paar Minuten ...") sein würde, hab ich's vorläufig zurückgestellt (obwohl ja auch eine dreistellige Anzahl eigentlich kein Problem sein dürfte - oder?).
Im übrigen musste ich auch fast das Script im Hintergrund weiterlaufen lassen, damit ich durch die Zwischenspeicherung in einer Variablen dem Wunsch nach weniger Dateizugriffen Rechnung tragen konnte ...
@poke256
Da Du eine Prüfung "im Speicher" angeregt hast: Habt Ihr eigentlich die Datei beide gleichzeitig geöffnet (arbeitet also mit "freigegebenen Arbeitsmappen"?
Grüße
bastla
Na ja,
wo wir gerade von "kleinen Schönheitsfehlern" sprechen...
Ein Problem hab ich auch unter den Tisch gekehrt:
Wenn ich selber derjenige bin, der auf dem %Share% aktualisiert (und speichert)...
Dann bekomme ich auch diese Benachrichtigungen.
Würde sicherlich dazu führen, dass ich noch mal einen zweiten Oneliner schreiben muss, der alle AT-Jobs /DELETEd, die als gestartetes Programm diese CheckXls.bat haben.
Zum Thema "im-Speicher" statt mit Zwischendateien:
Das habe ich oben drin. Das ist nichts weiter als die direkte Auswertung des "Dir"-Befehls in einer FOR /F-Anweisung.
Zum Beispiel: Wenn ich die Dateien in zwei verschiedenen Verzeichnissen vergleichen wollte, könnte ich statt:
Die Zwischendatei lastread.txt macht ja nur Sinn, wenn und weil ein zeitlicher Prüf-Abstand von mehr als Hundertstel-Sekunden dazwischenliegt. Da halte ich eine stündliche Prüfung für ausreichend.
Wenn es dringlicher ist, dann würde ich ohnehin eine organisatorische Lösung erwägen:
- entweder der MA, der mit seiner Bearbeitung fertig ist, MUSS den nächsten per Mail informieren.
- oder in der Excel-Datei wird "Beim Speichern" automatisch eine Mail losgeschickt.
Gruß
Biber
wo wir gerade von "kleinen Schönheitsfehlern" sprechen...
Ein Problem hab ich auch unter den Tisch gekehrt:
Wenn ich selber derjenige bin, der auf dem %Share% aktualisiert (und speichert)...
Dann bekomme ich auch diese Benachrichtigungen.
Würde sicherlich dazu führen, dass ich noch mal einen zweiten Oneliner schreiben muss, der alle AT-Jobs /DELETEd, die als gestartetes Programm diese CheckXls.bat haben.
Zum Thema "im-Speicher" statt mit Zwischendateien:
Das habe ich oben drin. Das ist nichts weiter als die direkte Auswertung des "Dir"-Befehls in einer FOR /F-Anweisung.
Zum Beispiel: Wenn ich die Dateien in zwei verschiedenen Verzeichnissen vergleichen wollte, könnte ich statt:
for /f "tokens=1-3*" %%a in (%compdir%\lastread.txt) do...
ja schreiben...for /f "tokens=1-3*" %%a in ('dir W:\oAuchImmer\*.xls^|find /i ".xls"') do...
Die Zwischendatei lastread.txt macht ja nur Sinn, wenn und weil ein zeitlicher Prüf-Abstand von mehr als Hundertstel-Sekunden dazwischenliegt. Da halte ich eine stündliche Prüfung für ausreichend.
Wenn es dringlicher ist, dann würde ich ohnehin eine organisatorische Lösung erwägen:
- entweder der MA, der mit seiner Bearbeitung fertig ist, MUSS den nächsten per Mail informieren.
- oder in der Excel-Datei wird "Beim Speichern" automatisch eine Mail losgeschickt.
Gruß
Biber
Jetzt hast Du mich auf dem falschen Fuß erwischt - mein "SpassFaktorBestimmungsAlgorithmus" ist mir irgendwie beim Portieren von Sinclair-Basic über PowerBasic nach VBS abhanden gekommen *schäm* - jetzt schätz' ich einfach ... (obwohl - Spass habe ich eigentlich eh immer schon sehr geschätzt ...
)
Grüße
bastla
Grüße
bastla
Hallo Poke256!
Grüße
bastla
Kann an diesen Code auch in ein Access VBA einfügen?
Grundsätzlich ja, aber nicht ohne Anpassungen im Detail - oder, anders formuliert, die Lösung lässt sich auch aus Office (VBA) heraus realisieren. Wenn Du allerdings VB-Script verwenden darfst, würde ich (trotz der etwas unorthodoxen Art der Beendigung per Task-Manager) bei dieser Variante bleiben.Grüße
bastla