lfs1993
Goto Top

Abfrage nach Änderungszeitpunkt einer Datei

Hallo zusammen!

Tja, ich stehe mal wieder vor einem Rätsel, folgendes würde benötigt werden:

In einem Verzeichnis liegt eine Datei, eine einzige!
Diese wird irgendwann einer Änderung unterzogen (überschrieben durch Update), wodurch mindestens Zeit, möglicherweise auch Datum der Datei, verändert werden.
In diesem Fall, also wenn sich etwas an der Datei tut, würde ich gerne ein Textfile kreieren lassen und evtl., wenn irgendwie machbar, auch die Datei (neu, alt wurde ja überschrieben...) woanders hinkopieren, um den Inhalt und somit die Änderungen prüfen zu können.
Wenn man die auch noch per BAT automatisch ausgeben lassen kann, wäre es natürlich ein Traum!!!

Da steht in etwa folgendes drinnen, immer in gleicher Grundform:

#
#Wed May 13 11:25:35 CEST 2009
A=XYZ
B=egal
C=irgendwas
D=völlig egal
E=ZYX
F=vollkommen egal
G=ABC
H=auch egal
I=egal


Interessant wären rüf mich also nur die Zeilen 3 (XYZ), 7 (ZYX) und eventuell 9 (ABC), in denen sich die Angaben ändern.
Der Rest ist relativ egal und ändert sich eh kaum...

Tja, wer hätte denn Rat für mich und hilft mir aus der Misere?!?

Ich danke Euch schon im Voraus,

LFS1993

Content-Key: 115971

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

Printed on: April 24, 2024 at 12:04 o'clock

Member: Biber
Biber May 13, 2009 at 11:34:07 (UTC)
Goto Top
Moin LFS1993,

zwei Rückfragen dazu.

1) für mich sind ja zwei "Änderungsdatum"-Werte erkennbar. Zum einen die Zeile 1 des Dateiinhalts (also ein Datum IN der Datei und das Änderungsdatum außen AN der Datei. Ich würde nahelegen, den Status "geänderte Datei" am Datum IN der Datei zu prüfen. Denn falls aus irgendwelche Gründen eine [inhaltlich identische] Datei mehrfach gesendet/kopiert wird, hast Du unnötigen Aufwand.

2) ich würde als Strategie eher empfehlen, den Inhalt der Datei jeweils komplett in eine neue Datei "updateChronik.log" in einem anderen Verzeichnis anzuhängen, wenn sich dieses erwähnte Zeile-1-Datum ändert.

Dazu müsstest Du Du eigentlich nur eine Datei "updatechronik.log" irgendwo einmalig anlegen und mit
Findstr.exe wahlweise die Zeile 1 oder die Zeile mit dem String " CEST " rausfiltern und genau diese in der "updatechronik.log" suchen.
Wenn gefunden --- okay, kennst Du schon.
Wenn nicht --> komplette aktuelle Update.log dort anhängen.

Grüße
Biber
Member: LFS1993
LFS1993 May 13, 2009 at 15:30:30 (UTC)
Goto Top
Hi Biber!

Tja, so einfach ist es leider nicht, die erste Zeile mit dem Datum IN der Datei wird nur bei Erstellung gefüllt, nicht bei Änderungen...
In dieser Datei werden nur Inhalte verändert, somit ändert sich das Datum AN der Datei, weshalb dieses abgefragt werden müßte!

Von daher wäre es mir im Endeffekt sogar egal ob man die Inhalte irgendwie weitermelden kann oder nicht, wichtig wäre das textfile oder eine Mail, in der mitgeteilt wird, daß sich etwas an der Datei geändert hat.

Ist so etwas machbar?!?

Gruß, LFS1993
Member: Biber
Biber May 13, 2009 at 16:22:46 (UTC)
Goto Top
Moin LFS1993,

na ja, machbar ist es natürlich.
Nur kommt es dann wieder darauf an, ob Du
  • diese Dateiänderung wirklich "überwachen" willst -- Änderung um 18:12:03 löst SOFORT zu diesem Zeitpunkt welche Reaktion auch immer aus
  • oder ob Du es "nur" alle 15 Minuten oder 3x täglich (oder 3x wöchentlich oder am 1. jeden Monats) prüfen willst per Task

Für die erste beschriebene Variante gibt es einige Tools zur [Suchmaschinen-Stichwort] "Ordnerüberwachung"

Für die zweite (regelmäßig prüfen) brauchst Du eigentlich nur einen Batch, der eine in einer Hilfsdatei gespeicherte DIR-Ausgabezeile (Referenzwerte der Ausgangsdatei) mit dem aktuellen Stand vergleicht.

Beispiel/Demo am CMD-Prompt mit einer Datei sysinfo.txt
>dir sysinfo.txt|findstr /i sysinfo.txt
06.04.09  21:31             2.174 sysinfo.txt
Wenn die eine hier erzeugte Referenzzeile in eine Datei "\einverzeichnis\Update.ref" umgeleitet wird mit ">" dann kannst Du diese Zeile jederzeit mit der aktuellen DIR/Findstr-Ausgabe vergleichen und reagieren, wenn sich was-auch-immer geändert hat.

Grüße
Biber
Member: LFS1993
LFS1993 May 14, 2009 at 10:44:19 (UTC)
Goto Top
Hi Biber.

Also, es reicht aus jede Stunde oder sogar nur alle 3-6 Stunden mal zu prüfen, Echzeitprüfung muß nicht sein!

Ich hab versucht was mit dem Änderungsdatum der Datei A zu machen, die gegen das Original_A geprüft wird, sieht so aus, klappt aber nicht, leider:

for %%f in ("D:\Original_A.txt") do @for /f %%f in ("%%~tf") do set %time0%
for %%f in ("D:\A.txt") do @for /f %%f in ("%%~tf") do set %time1%

if "%time0%"=="%time1%" (
echo Alles unverändert.
)>"D:\NotChanged.txt" else (
echo Es ist eine Änderung erfolgt!!!!
)>"D:\WasChanged.txt"


Leider klappt irgendwas mit den Variablen nicht, oder der ganze Ansatz is falsch, oder ich steh wieder mal völlig aufm Schlauch...

Wäre nett, wenn mir jemand sagen könnte, ob ich da auf einem machbaren Weg bin oder nicht und wie ich den zu Ende gehen könnte, herzlichen Dank schonmal!!!

Gruß, LFS1993
Member: LFS1993
LFS1993 May 19, 2009 at 08:07:54 (UTC)
Goto Top
Also, leider hat sich ja bisher keiner mehr zu Wort gemeldet, liegt es daran, daß ich da was vollkommen falsches versucht hab?!?
Sagt mir das doch bitte, ich kenn mich wie schonmal erwähnt einfach zu wenig mit BAT aus, um da wirklich den Plan zu haben, ich nutze sie gerne, veränder gern etwas, aber kann definitiv keine erstellen oder gar die wirklichen Hintergründe erkennen, leider!
Falls noch jemand ne Idee zu dem Thema hat wäre ich sehr dankbar,

Gruß, LFS1993
Member: Biber
Biber May 19, 2009 at 21:09:56 (UTC)
Goto Top
Moin LFS1993,

sorry, ich habe deinen Beitrag etwas aus dem Auge verloren (Werder Bremen steht im Moment in so vielen Finalrunden, da kostet das Feiern so viel Zeit).

Ich denke, die Umleitung innerhalb der ") ELSE (" -Zeile macht die Probleme.

for %%f in ("D:\Original_A.txt") do @for /f %%f in ("%%~tf") do set %time0%  
for %%f in ("D:\A.txt") do @for /f %%f in ("%%~tf") do set %time1%  

if "%time0%"=="%time1%" (   
       echo Alles unverändert. >"D:\NotChanged.txt"  
 ) else ( 
echo Es ist eine Änderung erfolgt!!!! >"D:\WasChanged.txt"  
)

So sollte die IF ... ) ELSE ( ...)"- Konstruktion eher funktionieren.
[mehr habe ich nicht ernsthaft angeschaut oder getestet]

Grüße
Biber
Member: LFS1993
LFS1993 May 20, 2009 at 10:02:56 (UTC)
Goto Top
Hallo Biber!

Tja, daran lag es dann wohl eher doch nicht, ich bekomme immer die Ausgabe "Alles unverändert.", auch wenn ich zwei Dateien völlig unterschiedlichen Datums und Uhrzeit vergleichen lasse...

Scheinbar hab ich da wieder irgendwas mit den Variablen verschleudert, eine teilweise Ausgabe sieht so aus:

ALLUSERSPROFILE=C:\Documents and Settings\All Users
APPDATA=C:\Documents and Settings\hierkönnteihrnamestehen\Application Data
CLIENTNAME=XXX
ClusterLog=C:\WINDOWS\Cluster\cluster.log
CommonProgramFiles=C:\Program Files\Common Files
COMPUTERNAME=YYY
ComSpec=C:\WINDOWS\system32\cmd.exe
FP_NO_HOST_CHECK=NO
HOMEDRIVE=C:
HOMEPATH=\Documents and Settings\hierkönnteihrnamestehen
LOGONSERVER=\\YYY
NUMBER_OF_PROCESSORS=2
OS=Windows_NT
Path=C:\Program Files\Windows Resource Kits\Tools\;C:\WINDOWS\system32;C:\WINDOW
S;C:\WINDOWS\System32\Wbem
PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH
PROCESSOR_ARCHITECTURE=x86
PROCESSOR_IDENTIFIER=x86 Family 15 Model 3 Stepping 4, GenuineIntel
PROCESSOR_LEVEL=15
PROCESSOR_REVISION=0304
ProgramFiles=C:\Program Files
PROMPT=$P$G
SESSIONNAME=RDP-Tcp#19
SystemDrive=C:
SystemRoot=C:\WINDOWS
TEMP=C:\DOCUME~1\CTI_AD~1\LOCALS~1\Temp\1
TMP=C:\DOCUME~1\CTI_AD~1\LOCALS~1\Temp\1
USERDOMAIN=YYY
USERNAME=hierkönnteihrnamestehen
USERPROFILE=C:\Documents and Settings\hierkönnteihrnamestehen
windir=C:\WINDOWS
ALLUSERSPROFILE=C:\Documents and Settings\All Users
APPDATA=C:\Documents and Settings\hierkönnteihrnamestehen\Application Data
CLIENTNAME=XXX
ClusterLog=C:\WINDOWS\Cluster\cluster.log
CommonProgramFiles=C:\Program Files\Common Files
COMPUTERNAME=YYY
ComSpec=C:\WINDOWS\system32\cmd.exe
FP_NO_HOST_CHECK=NO
HOMEDRIVE=C:
HOMEPATH=\Documents and Settings\hierkönnteihrnamestehen
LOGONSERVER=\\YYY
NUMBER_OF_PROCESSORS=2
OS=Windows_NT
Path=C:\Program Files\Windows Resource Kits\Tools\;C:\WINDOWS\system32;C:\WINDOW
S;C:\WINDOWS\System32\Wbem
PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH
PROCESSOR_ARCHITECTURE=x86
PROCESSOR_IDENTIFIER=x86 Family 15 Model 3 Stepping 4, GenuineIntel
PROCESSOR_LEVEL=15
PROCESSOR_REVISION=0304
ProgramFiles=C:\Program Files
PROMPT=$P$G
SESSIONNAME=RDP-Tcp#19
SystemDrive=C:
SystemRoot=C:\WINDOWS
TEMP=C:\DOCUME~1\CTI_AD~1\LOCALS~1\Temp\1
TMP=C:\DOCUME~1\CTI_AD~1\LOCALS~1\Temp\1
USERDOMAIN=YYY
USERNAME=hierkönnteihrnamestehen
USERPROFILE=C:\Documents and Settings\hierkönnteihrnamestehen
windir=C:\WINDOWS

Scheinbar irgendwas mit Userprofilen, kann ich mir nicht erklären?!?
Stimmen denn die von mir verwendeten Bezeichnungen %%f und der DO @for-befehl mit dem &&tf danach?!?

Ich komm damit nicht klar und erflehe Deine gütige Hilfe!!!

Danke, LFS1993
Member: Biber
Biber May 20, 2009 at 13:28:12 (UTC)
Goto Top
Moin LFS1993,

sorry, ich war gestern wirklich etwas in Eile und habe da unnötigerweise eine schnelle Antwort hingepfuscht, weil ich eigentlich schon längst an einem Ort sein wollte, der noch netter ist als dieses Forum..

So, jetzt mal ein etwas zielführenderer Ansatz, wenn auch mit viel Copy/paste und Democode:
::--------- snipp chkChanged.cmd ----
@echo off & setlocal
Set "Testing=BesserIsDas"  

If defined testing (
   Set "ChangedOut=Con:"  
   Set "notChangedOut=Con:"  
) ELSE (
   Set "ChangedOut=D:\Changed.txt"  
   Set "notChangedOut=D:\NotChanged.txt"  
)
for %%f in ("D:\temp\temp.txt") do echo set "time0=%%~tf"  
for %%f in ("D:\temp\text.txt") do echo set "time1=%%~tf"  
for %%f in ("D:\temp\temp.txt") do set "time0=%%~tf"  
for %%f in ("D:\temp\text.txt") do set "time1=%%~tf"  

if "%time0%"=="%time1%" (   
       echo Alles unverändert. >%notChangedOut%
 ) else ( 
echo Es ist eine Änderung erfolgt t0[%time0%] t1[%time1%]!!!! >%changedOut%
)
::----- snapp -------

Dieser Demo-Schnipsel, der (festverdrahtet) zwei bestimmte Dateien prüft, die auch beide existieren [keinerlei Prüfung!] bringt:
>e:\schnipsel\chkchanged.bat
set "time0=05.03.09 13:44"
set "time1=07.07.08 13:04"
Es ist eine Änderung erfolgt t0[05.03.09 13:44] t1[07.07.08 13:04]


Die wesentliche Änderung -- die SETterei der Zeitvariablen ist jetzt richtiger.
Und ich habe oben eine weitere IF-Bedingung eingebaut, die -solange die Zeile "set testing=whatever" nicht gelöscht wird, die Ausgaben in beiden Fällen auf den Bildschirm statt in eine Datei ausgibt.

Grüße
Biber
Member: LFS1993
LFS1993 May 20, 2009 at 14:07:42 (UTC)
Goto Top
Biber, Hut ab!!!!!

Genau so etwas hab ich gesucht!
Und nachdem Du die richtige Lösung aufgezeigt hats, konnte ich die sogar reibungslos an meine Bedürfnisse anpassen, es läuft wie geschmiert!!!

Ich danke aufs allerherzlichste und bin wieder was schuldig!!
Solltest Du mal in der südlichen Region Deutschlands sein, wär es mir ein großes Vergnügen, Dich auf nen Drink einzuladen!

Gruß, LFS1993