Datei am Ende durchnummerieren für Log
Dateien nummerieren nach diesem Muster: backup0001.log backup0002.log backup0003.log backup0004.log
Hi,
nach längeren Googlen bin ich bei der Recherche immer wieder auf diesen Seiten gelandet, also stelle ich meine Frage gleich hier -- meine Suche war bisher vergebens.
Für ein Backup-Scirpt möchte ich eine Logdatei erstellen, die für jeden Durchgang eine eigene Nummer in aufsteigender Reihenfolge erhält.
Im ersten Schritt habe ich leider schon Probleme bei der Ermittlung der Datei.
Gegeben sei die Liste:
backuplog0001.txt
backuplog0002.txt
backuplog0003.txt
Auf der Shell liefert dir/B/O-E backuplog????.txt das, was ich erwarte: backuplog0003.txt.
Im Script klappt es nicht mehr, wenn ich das Dir-Kommando substituiere:
liefert backuplog0001.txt. Tja, das habe ich nicht erwartet. Versuche ergaben, dass das Resultat anders ist, wenn ich backuplog????.txt weglasse und einfach nur * (Stern) schreibe.
Wenn ich die Nuss geknackt habe, muss ich noch Folgendes machen
Mit einem Platzhalter für Zahlen wäre ich aus dem Schneider, aber so etwas konnte ich für DOS nicht ergoogeln. Wenn jemand von Euch da einen Ansatz parat hätte, würde ich mich auch freuen.
Gruß
Hi,
nach längeren Googlen bin ich bei der Recherche immer wieder auf diesen Seiten gelandet, also stelle ich meine Frage gleich hier -- meine Suche war bisher vergebens.
Für ein Backup-Scirpt möchte ich eine Logdatei erstellen, die für jeden Durchgang eine eigene Nummer in aufsteigender Reihenfolge erhält.
Im ersten Schritt habe ich leider schon Probleme bei der Ermittlung der Datei.
Gegeben sei die Liste:
backuplog0001.txt
backuplog0002.txt
backuplog0003.txt
Auf der Shell liefert dir/B/O-E backuplog????.txt das, was ich erwarte: backuplog0003.txt.
Im Script klappt es nicht mehr, wenn ich das Dir-Kommando substituiere:
@echo off
SET RES=
FOR /F %%G IN ('dir/O-E/B c:\batch\backuplog\backuplog????.txt') DO SET RES=%%G
ECHO Die Datei mit der hoechsten Nummer: %RES%
liefert backuplog0001.txt. Tja, das habe ich nicht erwartet. Versuche ergaben, dass das Resultat anders ist, wenn ich backuplog????.txt weglasse und einfach nur * (Stern) schreibe.
Wenn ich die Nuss geknackt habe, muss ich noch Folgendes machen
- überprüfen, ob ???? wirklich eine Zahl ist. Das dürfte nicht einfach sein.
- und noch mal sortieren, damit ich den höchsten Wert habe, den ich dann um +1 erweitern kann.
Mit einem Platzhalter für Zahlen wäre ich aus dem Schneider, aber so etwas konnte ich für DOS nicht ergoogeln. Wenn jemand von Euch da einen Ansatz parat hätte, würde ich mich auch freuen.
Gruß
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 101573
Url: https://administrator.de/forum/datei-am-ende-durchnummerieren-fuer-log-101573.html
Ausgedruckt am: 23.12.2024 um 09:12 Uhr
9 Kommentare
Neuester Kommentar
Hallo sisiphus!
Mir war nicht ganz klar, ob Du die restlichen "Nüsschen" selbst knacken wolltest, oder ob Deine weiteren Überlegungen als Fragestellung an das Forum gedacht waren - deshalb zunächst nur die eine Antwort ...
Die gewünschte "Sicherheitsvariante" ist etwas aufwändig, und könnte etwa so aussehen:
Da auf die vier "?" auch kein Verlass ist (soferne kein weiteres Zeichen folgt, steht jedes Fragezeichen für "irgendein oder auch kein Zeichen"), erfolgt im Unterprogramm ":ProcessFile" (in den Zeilen 9 bis 11) zunächst eine Überprüfung der Länge des (reinen) Dateinamens - aus Vereinfachungsgründen nicht dynamisch, sondern auf die gegebenen 9 Zeichen "backuplog" zugeschnittten.
Nachdem feststeht, dass auf "backuplog" genau 4 Zeichen folgen, werden diese isoliert (%Num%) und überprüft, ob sie nur aus den Ziffern 0 bis 9 bestehen: Dazu werden aus einer Kopie (%N%) der "Nummer" in einer Schleife alle Ziffern entfernt - nach der Schleife dürfte daher von der Variablen %N% nichts mehr übrig sein. Falls es die Variable noch gibt ("defined"), war zumindest eines der 4 Zeichen keine Ziffer und diese Datei ist daher nicht zu beachten.
Wenn es sich allerdings tatsächlich um 4 Ziffern gehandelt hat, können diese nun zu 10000 addiert und mit der bisher höchsten Zahl (%Max%; Vorgabe ist 10000, was der Numer "0000" entspricht) verglichen werden. Ist die Nummer höher als alle bisherigen, wird sie als neuer Maximalwert gespeichert.
Nach dem Durchlaufen aller passenden Dateien enthält daher %Max% die höchste Nummer (+10000) und muss zur Ermittlulng der nächsten Nummer nur noch um 1 erhöht werden. Die gewünschte vierstellige Nummer kann dann von dieser Zahl am Ende "abgeschnitten" werden.
Grüße
bastla
[Edit] Schleife auf "for /L" geändert [/Edit]
Mir war nicht ganz klar, ob Du die restlichen "Nüsschen" selbst knacken wolltest, oder ob Deine weiteren Überlegungen als Fragestellung an das Forum gedacht waren - deshalb zunächst nur die eine Antwort ...
Die gewünschte "Sicherheitsvariante" ist etwas aufwändig, und könnte etwa so aussehen:
@echo off & setlocal
set /a Max=10000
for /f %%i in ('dir /b c:\batch\backuplog\backuplog????.txt') do call :ProcessFile "%%i"
set /a Max+=1
echo Naechste: %Max:~-4%
goto :eof
:ProcessFile
set "Name=%~n1"
if "%Name:~12%"=="" goto :eof
if "%Name:~13%" neq "" goto :eof
set Num=%Name:~9,4%
set N=%Num%
for /L %%a in (0,1,9) do if defined N call set N=%%N:%%a=%%
if defined N goto :eof
set /a Nr=10000+Num
if %Nr% gtr %Max% set /a Max=%Nr%
goto :eof
Nachdem feststeht, dass auf "backuplog" genau 4 Zeichen folgen, werden diese isoliert (%Num%) und überprüft, ob sie nur aus den Ziffern 0 bis 9 bestehen: Dazu werden aus einer Kopie (%N%) der "Nummer" in einer Schleife alle Ziffern entfernt - nach der Schleife dürfte daher von der Variablen %N% nichts mehr übrig sein. Falls es die Variable noch gibt ("defined"), war zumindest eines der 4 Zeichen keine Ziffer und diese Datei ist daher nicht zu beachten.
Wenn es sich allerdings tatsächlich um 4 Ziffern gehandelt hat, können diese nun zu 10000 addiert und mit der bisher höchsten Zahl (%Max%; Vorgabe ist 10000, was der Numer "0000" entspricht) verglichen werden. Ist die Nummer höher als alle bisherigen, wird sie als neuer Maximalwert gespeichert.
Nach dem Durchlaufen aller passenden Dateien enthält daher %Max% die höchste Nummer (+10000) und muss zur Ermittlulng der nächsten Nummer nur noch um 1 erhöht werden. Die gewünschte vierstellige Nummer kann dann von dieser Zahl am Ende "abgeschnitten" werden.
Grüße
bastla
[Edit] Schleife auf "for /L" geändert [/Edit]
@Biber
Solltest Du nicht völlig abgefahren sein (in's Wochenende)? Danke jedenfalls für die "Frühstücksvertretung" ...
@sisiphus
Beim Aufruf eines Unterprogrammes wird (siehe "call /?") ein neuer Batchkontext erzeugt, sodass dort in gewohnter Weise mit den Variablen gearbeitet werden kann - dass es ev auch besserer Stil sein könnte (Steuerung durch die "for"-Schleife, Ausführung im Unterprogramm) steht für mich dabei nicht wirklich im Vordergrund.
Grüße
bastla
Solltest Du nicht völlig abgefahren sein (in's Wochenende)? Danke jedenfalls für die "Frühstücksvertretung" ...
@sisiphus
Zeile 9: Die Zuweisung hast Du über in Klammern gepackt. Welchen Grund hat das? Geht es vielleicht darum, Probleme mit Leerzeichen in der Variable zu verhindern?
Mit dieser Schreibweise (übrigens erstmals gesehen hier im Forum beim Chef-Batcher da oben) habe ich mehr Kontrolle über den zuzuweisenden Inhalt (zB werden nicht unerwünscht ev Leerzeichen am Ende mit in die Variable aufgenommen) und daher verwende ich sie schon gewohnheitsmäßig (ich frage mich gerade, warum ich das dieses Mal in Zeile 15 nicht getan habe - wäre dort nämlich auch sinnvoll).Goto-Aufrufe vs. Klammern: Kann man den Teil des ProzessFile-Unterprogramms auch in eine Klammer setzen?
Grundsätzlich ja, allerdings ist dann zu beachten, dass die Variablenauflösung nur zu Beginn der Klammer erfolgt - Konsequenz: innerhalb des Klammern ist es zwar möglich, Variablenwerte zu verändern (schreiben), wenn diese neuen Werte aber auch verwendet (gelesen) werden sollen, müsste dies per "delayedexpansion" erreicht werden.Beim Aufruf eines Unterprogrammes wird (siehe "call /?") ein neuer Batchkontext erzeugt, sodass dort in gewohnter Weise mit den Variablen gearbeitet werden kann - dass es ev auch besserer Stil sein könnte (Steuerung durch die "for"-Schleife, Ausführung im Unterprogramm) steht für mich dabei nicht wirklich im Vordergrund.
Grüße
bastla
Hallo sisiphus!
Grüße
bastla
ich hoffe mal Du hattest ein gutes Frühstück!
Danke - Mittagessen war auch ok. zumal, ich nicht weiß, ich in einer Klammer auf den Dateinamen kommen könnte (%~n1) könnte.
Daran sollte es nicht scheitern, da sich die gleiche Vorgangswseise auch auf die Laufvariablen einer "for"-Schleife (nicht aber auf mit "set" erstellte "gewöhnliche" Variablen) anwenden lässt - dann hieße es einfach "%%~ni"; trotzdem spricht eigentlich wenig (etwas längere Laufzeit - wohl nur mess-, aber kaum fühlbar) gegen die Unterprogramm-Variante.Mir fällt gerade auf, dass in meinem Beispiel natürlich noch ein ENDLOCAL vor Zeile 14 gehört.
Am Ende des Batches (welches ja durch das "goto :eof" des "Hauptprogrammes" in Zeile 14 ausgelöst wird), erfolgt automatisch ein "endlocal" - das kannst Du daher einsparen ...Grüße
bastla