ghost-in-the-shell
Goto Top

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

Content-Key: 49613

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

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

Member: bastla
bastla Jan 23, 2007 at 19:53:15 (UTC)
Goto Top
Hallo Poke256 und willkommen im Forum!

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."  
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:
D:\Scripts\CheckUpdated.vbs "X:\Data\versörung.xls" 120000  
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
Member: Biber
Biber Jan 23, 2007 at 22:24:09 (UTC)
Goto Top
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...face-wink


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"  
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.
::--------------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  
[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 :
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
Member: bastla
bastla Jan 23, 2007 at 22:53:23 (UTC)
Goto Top
@Biber

Hattest Du überschüssige Vorschusslorbeeren? face-wink

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 ... face-wink
@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
Member: Biber
Biber Jan 23, 2007 at 23:24:16 (UTC)
Goto Top
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:
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
Member: bastla
bastla Jan 23, 2007 at 23:27:52 (UTC)
Goto Top
@Biber

Zum Thema "im-Speicher"
War ja nur Spass face-smile

Grüße
bastla
Member: Biber
Biber Jan 23, 2007 at 23:34:35 (UTC)
Goto Top
War ja nur Spass face-wink
...leider eine der wenigen Dinge, die ich nicht per Batch prüfen kann...
Wenn Du da eine VBS-Lösung für mich hättest..? face-wink
Member: bastla
bastla Jan 23, 2007 at 23:42:49 (UTC)
Goto Top
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 ... face-smile)

Grüße
bastla
Member: bastla
bastla Jan 24, 2007 at 07:48:27 (UTC)
Goto Top
Hallo Poke256!

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
Member: SilentTom
SilentTom Jul 18, 2012 at 14:32:45 (UTC)
Goto Top
Am Besten via Hashwert prüfen. Google mal nach "md5 file hasher". Das ist genau das was du suchst! Mit dem Programm kannst du alle XLS Dateien, egal ob neu erstellt, gelöscht oder geändert überwachen. Man muss halt den md5 file hasher installieren...