Top-Themen

Aktuelle Themen (A bis Z)

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

Frage Entwicklung Batch & Shell

GELÖST

Batch: wie mehrzeilige log.xml schreiben und Umfang auf einen Monat begrenzen?

Mitglied: maccoX

maccoX (Level 1) - Jetzt verbinden

22.01.2014, aktualisiert 23.01.2014, 1500 Aufrufe, 9 Kommentare, 2 Danke

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
Mitglied: pieh-ejdsch
22.01.2014 um 11:15 Uhr
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
Bitte warten ..
Mitglied: Endoro
22.01.2014, aktualisiert um 14:06 Uhr
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.
Bitte warten ..
Mitglied: maccoX
22.01.2014 um 14:20 Uhr
Danke euch Zwei!

Ja, es gibt keine LOG, die bat erstellt die log Datei die im xml Format ist und eben nicht zu groß werden soll.

Für jeden Tag eine eigene LOG Datei schreiben wär zu aufwendig bei nachträglicher Einsicht und zu viel Dateimüll, es soll schon alles in eine Datei. So viel ist es ja auch nicht.


Ich versuch es nochmal zu erklären was die Anforderungen sind:
Ich brauche eine Batch Datei die mir allein durch den Aufruf (mehrmals täglich) eine kleine log Datei im xml Format schreibt (log.xml) - was ja nichts anderes als eine Textdatei mit xml Tags ist (<tag>inhalt</tag>).

Darin muss die Batch das Datum notieren (Tag, und eventuell Monat langt) und für jeden Tag die Uhrzeit vom Aufruf der Batch Datei. Sprich am 22.1. starte ich die Batch um 9 Uhr, 15 Uhr und 20 Uhr, dann brauche ich genau diese Daten in der Batch. Für den nächsten Tag das gleiche Spiel usw. Blos sollen nicht irgendwann ewig viele Tage mit den Uhrzeiten drin stehen sondern es soll am Besten auf 31 Tage begrenzt sein.

Struktur der erstellten xml Datei sollte dann so ähnlich aussehen:

<log>
<0122>0900, 1500, 2000</0122>
<0121>1000, 1500, 1626, 1710</0121>
<0120>0900, 1900</0120>
</log>

wobei die Reihenfolge der Sortierung egal ist, das ist nur ein Beispiel wie es aussehen könnte!

Ich hoffe jetzt ist es klarer!

Gruß, maccoX
Bitte warten ..
Mitglied: Endoro
LÖSUNG 22.01.2014, aktualisiert 23.01.2014
Hey,

kannst du mal testen. Bei Datum und Zeit bin ich von normalem deutschen bzw. englischen Format ausgegangen.
01.
@echo off &setlocal disableDelayedExpansion 
02.
set "LogFile=%UserProfile%\log.xml" 
03.
set /a MaxEntries=31 
04.
 
05.
if exist "%LogFile%" for /f "tokens=1,2 delims=<>" %%a in (' 
06.
	findstr /br "<[0-9][0-9][0-9][0-9]" "%LogFile%"') do set "day.%%a=%%b" 
07.
for /f "skip=%MaxEntries% delims==" %%a in ('set "day" 2^>nul^|sort /r') do set "%%a=" 
08.
for /f "tokens=1,2 delims=./" %%a in ("%date%") do set "today=%%b%%a" 
09.
for /f "tokens=1,2 delims=:" %%a in ("%time%") do set "now=%%a%%b" 
10.
set "now=%now: =0%" 
11.
if defined day.%today% (call set "day.%today%=%%day.%today%%%, %now%") else set "day.%today%=%now%" 
12.
13.
echo(^<log^> 
14.
for /f "tokens=2* delims==." %%a in ('set "day"') do echo(^<%%a^>%%b^</%%a^> 
15.
echo(^</log^> 
16.
)>"%LogFile%"
Viele sagen, Batch sei zu primitiv für Arrays.

Gruss.
Bitte warten ..
Mitglied: maccoX
23.01.2014, aktualisiert um 11:07 Uhr
Hey Endoro,

vielen Dank - das ist ja perfekt!

Da kommt tatsächlich eine xml raus die genau so aussieht wie oben in meinem Beispiel
Funktioniert wunderbar, Datum- und Uhrzeitformat ist perfekt und es werden immer neue Uhrzeiten passend zum Tag eingetragen. Hab mein Datum am Computer auch 1, 2 mal verstellt und die Batch hat dann entsprechend Einträge für die neuen Tage erstellt, funktioniert also 1a! - aber das muss ich dir ja nicht sagen ;)

Nur das nach 31 Tagen nicht noch mehr Tage drin landen konnte ich so jetzt nicht testen aber da sonst alles top klappt vertrau ich dir da!

Vielen, vielen Dank, du hasts echt drauf!

Gruß, maccoX
Bitte warten ..
Mitglied: pieh-ejdsch
LÖSUNG 23.01.2014, aktualisiert um 16:50 Uhr
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.
> (echo 0101&echo 0102&echo 1231&echo 1230)|sort/r 
1231 
1230 
0102 
0101
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
Bitte warten ..
Mitglied: Endoro
23.01.2014 um 12:55 Uhr
Hey Phil,

stimmt. Man könnte das Jahr mit in die XML übernehmen, an den Dateinamen anhängen und jeweils nach Silvester neu erstellen (log14.xml), intern mit Jahren rechnen (am besten) oder das Log mit gemischten 01/12-Monatsdaten löschen. Danke für den Hinweis.
Gruss.
Bitte warten ..
Mitglied: Endoro
LÖSUNG 23.01.2014, aktualisiert um 16:50 Uhr
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.
01.
@echo off &setlocal disableDelayedExpansion 
02.
set "LogFile=%UserProfile%\log.xml" 
03.
set /a MaxEntries=31 
04.
 
05.
for /f "tokens=1-3 delims=./" %%a in ("%date%") do set "today=%%b%%a"&set "year=%%c" 
06.
for /f "tokens=1,2 delims=:" %%a in ("%time%") do set "now=%%a%%b" 
07.
set "now=%now: =0%" 
08.
set /a lastyear=year-1 
09.
 
10.
if exist "%LogFile%" for /f "tokens=1,2 delims=<>" %%a in (' 
11.
 findstr /br "<[0-9][0-9][0-9][0-9]" "%LogFile%"') do ( 
12.
	if "%%a" gtr "%today%" (set "day.%lastyear%.%%a=%%b") else set "day.%year%.%%a=%%b" 
13.
14.
for /f "skip=%MaxEntries% delims==" %%a in ('set "day" 2^>nul^|sort /r') do set "%%a=" 
15.
if defined day.%year%.%today% (call set "day.%year%.%today%=%%day.%year%.%today%%%, %now%") else set "day.%year%.%today%=%now%" 
16.
17.
echo(^<log^> 
18.
for /f "tokens=3* delims==." %%a in ('set "day"') do echo(^<%%a^>%%b^</%%a^> 
19.
echo(^</log^> 
20.
)>"%LogFile%"
Assoziative Arrays sind flexibel.

Gruss.
Bitte warten ..
Mitglied: maccoX
23.01.2014 um 16:53 Uhr
Hey, danke!

Ein Jahr wird nicht übersprungen, somit ist die Lösung prima
Unglaublich was man mit Batch so alles machen kann!

Gruß, maccoX
Bitte warten ..
Ähnliche Inhalte
Batch & Shell
Batch Datei - Mehrzeilige Textdatei
gelöst Frage von SchmakusBatch & Shell5 Kommentare

Hallo Zusammen, ich möchte mit einer Batch Datei eine Textdatei erstellen. Ich verwende 2 Variablen (%1, %2). Die Textdatei ...

Batch & Shell
Mehrzeiligen Powershell-Befehl mit Batch ausführen
gelöst Frage von 133202Batch & Shell3 Kommentare

Hallo Ihr, Mehrzeiligen Powershell-Befehl mit Batch ausführen, geht das überhaupt? Ich wollte nachfolgenden Code (Powershell-Befehl) über eine Batch mit ...

Batch & Shell
Die Zeichenfolge hat kein Abschlusszeichen - Batch mit mehrzeiligem Powershellbefehl
gelöst Frage von freshman2017Batch & Shell11 Kommentare

Hallo, leider finde ich hier den Fehler nicht, in der Doku finde ich auch nichts. Wer kann mir auf ...

Batch & Shell
Batch: Mehrzeiligen Text in eine Text-Datei schreiben (Win7 64)
gelöst Frage von mobby83Batch & Shell5 Kommentare

Hallo zusammen, ich habe eine ältere Batch, die eine Ordnerstruktur erstellt. Dieses Batch soll nun zusätzlich eine "DirInfo.txt" erstellen. ...

Neue Wissensbeiträge
Linux

Meltdown und Spectre: Linux Update

Information von Frank vor 12 StundenLinux1 Kommentar

Meltdown (Variante 3 des Prozessorfehlers) Der Kernel 4.14.13 mit den Page-Table-Isolation-Code (PTI) ist nun für Fedora freigegeben worden. Er ...

Tipps & Tricks

Solutio Charly Updater Fehlermeldung: Das Abgleichen der Dateien in -Pfad- mit dem Datenobject ist fehlgeschlagen

Tipp von StefanKittel vor 1 TagTipps & Tricks

Hallo, hier einmal als Tipp für alle unter Euch die mit der Zahnarztabrechnungssoftware Charly von Solutio zu tun haben. ...

Sicherheit

Meltdown und Spectre: Wir brauchen eine "Abwrackprämie", die die CPU-Hersteller bezahlen

Information von Frank vor 1 TagSicherheit12 Kommentare

Zum aktuellen Thema Meltdown und Spectre: Ich wünsche mir von den CPU-Herstellern wie Intel, AMD oder ARM eine Art ...

Sicherheit

Meltdown und Spectre: Realitätscheck

Information von Frank vor 1 TagSicherheit9 Kommentare

Die unangenehme Realität Der Prozessorfehler mit seinen Varianten Meltdown und Spectre ist seit Juni 2017 bekannt. Trotzdem sind immer ...

Heiß diskutierte Inhalte
Sicherheit
Meltdown und Spectre: Die machen uns alle was vor
Information von FrankSicherheit24 Kommentare

Aktuell sieht es in den Medien so aus, als hätten die Hersteller wie Intel, Microsoft und Co den aktuellen ...

Ubuntu
Ubuntu - Starter für nicht vertrauenswürdige Anwendungen
Frage von adm2015Ubuntu17 Kommentare

Hallo zusammen, Ich verwende derzeit die Ubuntu Versionen 17.10 bzw. im Test 18.04. Ich habe mehrere .desktop Dateien in ...

Netzwerke
Packet loss bei "InternetLeitungsvollauslastung"
gelöst Frage von Freak-On-SiliconNetzwerke17 Kommentare

Servus; Ja der Titel klingt komisch, is aber so. Wenn die Internetleitung voll ausgelastet ist, hab ich extreme packet ...

Windows 10
Automatische daten kopieren, USB zu USB unter Win10 im Hintergrund
Frage von DerEisigeWindows 1016 Kommentare

Hallo Leute, ich bin auf der Suche nach einem Skript, dass von einem USB Stick automatisch nach dem einstecken ...