Batch: wie mehrzeilige log.xml schreiben und Umfang auf einen Monat begrenzen?
Hallo,
ich möchte mit einer Batch Datei eine Log.xml schreiben, welche aber immer nur die letzten 31 Tage beinhaltet und nicht immer weiter wächst.
Jedes mal wenn ich die Batch Datei starte soll diese beim passenden Datum einfach nur die aktuelle Uhrzeit eintragen. Pro Tag kann die Batch aber öfters gestartet werden, sprich die Batch muss für den Tag dann eine zweite, dritte usw. Uhrzeit eintragen ohne die alten Tageswerte zu löschen.
Die xml Tags lassen sich ja gut schreiben mit z.B:
echo ^<tag1^>%uhrzeiten%^</tag1^> >> %log%
Wie man Uhrzeit und Datum an sich abfragt ist mir bekannt. Aber wie mache ich es, das ich verschiedene Tage habe, die ältesten automatisch wegfallen und pro Tag unterschiedlich viele Uhrzeitseinträge sind?
Ich hab mir als erste Überlegung gedacht, der Textdatei/xml 31 Zeilen zu spendieren und je nach dem welcher Tag ist (1-31) schreibt die Batch in die entsprechende Zeile (falls das möglich ist). Bloß wenn ich diese frisch schreibe verliere ich ja die alten Inhalte Am Besten wär ich könnte die neue Zeit einfach hinten an die Zeile dran hängen aber das geht ja schon allein deshalb nicht, weil der XML Schlusstag dann dazwischen ist.
Wie kann ich das am besten lösen?
Gruß, maccoX
ich möchte mit einer Batch Datei eine Log.xml schreiben, welche aber immer nur die letzten 31 Tage beinhaltet und nicht immer weiter wächst.
Jedes mal wenn ich die Batch Datei starte soll diese beim passenden Datum einfach nur die aktuelle Uhrzeit eintragen. Pro Tag kann die Batch aber öfters gestartet werden, sprich die Batch muss für den Tag dann eine zweite, dritte usw. Uhrzeit eintragen ohne die alten Tageswerte zu löschen.
Die xml Tags lassen sich ja gut schreiben mit z.B:
echo ^<tag1^>%uhrzeiten%^</tag1^> >> %log%
Wie man Uhrzeit und Datum an sich abfragt ist mir bekannt. Aber wie mache ich es, das ich verschiedene Tage habe, die ältesten automatisch wegfallen und pro Tag unterschiedlich viele Uhrzeitseinträge sind?
Ich hab mir als erste Überlegung gedacht, der Textdatei/xml 31 Zeilen zu spendieren und je nach dem welcher Tag ist (1-31) schreibt die Batch in die entsprechende Zeile (falls das möglich ist). Bloß wenn ich diese frisch schreibe verliere ich ja die alten Inhalte Am Besten wär ich könnte die neue Zeit einfach hinten an die Zeile dran hängen aber das geht ja schon allein deshalb nicht, weil der XML Schlusstag dann dazwischen ist.
Wie kann ich das am besten lösen?
Gruß, maccoX
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 227381
Url: https://administrator.de/contentid/227381
Ausgedruckt am: 02.11.2024 um 22:11 Uhr
9 Kommentare
Neuester Kommentar
moin maccoX,
Eine Logdatei wird fortwährend geschrieben - immer unten dran. Bei einem dazwischen herumschreiben muss immer eine Datei komplett neu geschrieben werden.
Eine Alternative wäre für jeden Tag eine Log zu erstellen. Dateiname 1 -31 oder besser "%Datum%" - Dateien älter als 31 Tage lassen sich mit forfiles oder robocopy löschen.
Die Erstellung der XML sollte immer nach Aktualisierung von einem LOG erfolgen. Mit dir die LOG Dateien nach Alter sortieren lassen und die Inhalte in die XML eintragen.
Gruß Phil
Eine Logdatei wird fortwährend geschrieben - immer unten dran. Bei einem dazwischen herumschreiben muss immer eine Datei komplett neu geschrieben werden.
Eine Alternative wäre für jeden Tag eine Log zu erstellen. Dateiname 1 -31 oder besser "%Datum%" - Dateien älter als 31 Tage lassen sich mit forfiles oder robocopy löschen.
Die Erstellung der XML sollte immer nach Aktualisierung von einem LOG erfolgen. Mit dir die LOG Dateien nach Alter sortieren lassen und die Inhalte in die XML eintragen.
Gruß Phil
Hey,
ich hab das so verstanden, dass es keine LOG Dateien gibt sondern die XML das Log ist.
@maccoX kannst du das deutlicher erklären?
Gruss.
ich hab das so verstanden, dass es keine LOG Dateien gibt sondern die XML das Log ist.
@maccoX kannst du das deutlicher erklären?
Gruss.
Hey,
kannst du mal testen. Bei Datum und Zeit bin ich von normalem deutschen bzw. englischen Format ausgegangen.
Viele sagen, Batch sei zu primitiv für Arrays.
Gruss.
kannst du mal testen. Bei Datum und Zeit bin ich von normalem deutschen bzw. englischen Format ausgegangen.
@echo off &setlocal disableDelayedExpansion
set "LogFile=%UserProfile%\log.xml"
set /a MaxEntries=31
if exist "%LogFile%" for /f "tokens=1,2 delims=<>" %%a in ('
findstr /br "<[0-9][0-9][0-9][0-9]" "%LogFile%"') do set "day.%%a=%%b"
for /f "skip=%MaxEntries% delims==" %%a in ('set "day" 2^>nul^|sort /r') do set "%%a="
for /f "tokens=1,2 delims=./" %%a in ("%date%") do set "today=%%b%%a"
for /f "tokens=1,2 delims=:" %%a in ("%time%") do set "now=%%a%%b"
set "now=%now: =0%"
if defined day.%today% (call set "day.%today%=%%day.%today%%%, %now%") else set "day.%today%=%now%"
(
echo(^<log^>
for /f "tokens=2* delims==." %%a in ('set "day"') do echo(^<%%a^>%%b^</%%a^>
echo(^</log^>
)>"%LogFile%"
Gruss.
moin,
freu Dich auf Neujahr.
Zum Jahreswechsel benötigst Du noch die Jahreszahl sonst haut es Dir die Sortierung Durcheinander, der Dezember bleibt im Log stehen und zusätzlich steht noch das jüngste Datum in der XML drin - das geht so bis ende November. Der nächste Dezember würde dann wieder aktualisiert werden.
oder for Optionen anpassen sowie ^|findstr /n . noch in die erste Forschleife packen und nur bis Zeile 31 eindeutige Variablen setzen bzw gleich in einer Sub verarbeiten.
Gruß Phil
freu Dich auf Neujahr.
Zum Jahreswechsel benötigst Du noch die Jahreszahl sonst haut es Dir die Sortierung Durcheinander, der Dezember bleibt im Log stehen und zusätzlich steht noch das jüngste Datum in der XML drin - das geht so bis ende November. Der nächste Dezember würde dann wieder aktualisiert werden.
> (echo 0101&echo 0102&echo 1231&echo 1230)|sort/r
1231
1230
0102
0101
Gruß Phil
Intern ordne ich jedem Datum aus dem Log eine Jahreszahl zum Sortieren zu. Alle Monatstage die grösser als %today% sind erhalten das vergangene, der Rest das aktuelle Jahr. Zur Ausgabe wird das Jahr "entfernt". Das gibt dann Probleme, wenn das Log so selten erstellt wird, dass ein Jahr "überrundet" wird.
Assoziative Arrays sind flexibel.
Gruss.
@echo off &setlocal disableDelayedExpansion
set "LogFile=%UserProfile%\log.xml"
set /a MaxEntries=31
for /f "tokens=1-3 delims=./" %%a in ("%date%") do set "today=%%b%%a"&set "year=%%c"
for /f "tokens=1,2 delims=:" %%a in ("%time%") do set "now=%%a%%b"
set "now=%now: =0%"
set /a lastyear=year-1
if exist "%LogFile%" for /f "tokens=1,2 delims=<>" %%a in ('
findstr /br "<[0-9][0-9][0-9][0-9]" "%LogFile%"') do (
if "%%a" gtr "%today%" (set "day.%lastyear%.%%a=%%b") else set "day.%year%.%%a=%%b"
)
for /f "skip=%MaxEntries% delims==" %%a in ('set "day" 2^>nul^|sort /r') do set "%%a="
if defined day.%year%.%today% (call set "day.%year%.%today%=%%day.%year%.%today%%%, %now%") else set "day.%year%.%today%=%now%"
(
echo(^<log^>
for /f "tokens=3* delims==." %%a in ('set "day"') do echo(^<%%a^>%%b^</%%a^>
echo(^</log^>
)>"%LogFile%"
Gruss.