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

Datei am Ende durchnummerieren für Log

Mitglied: sisiphus

sisiphus (Level 1) - Jetzt verbinden

11.11.2008, aktualisiert 15.11.2008, 4683 Aufrufe, 9 Kommentare

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:

01.
@echo off 
02.
SET RES= 
03.
FOR /F %%G IN ('dir/O-E/B c:\batch\backuplog\backuplog????.txt') DO SET RES=%%G 
04.
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ß
Mitglied: bastla
11.11.2008 um 22:22 Uhr
Hallo sisiphus und willkommen im Forum!

Aus welchem Grund willst Du denn nach Extension sortieren?
FOR /F %%G IN ('dir/ON/B c:\batch\backuplog\backuplog????.txt') DO SET "RES=%%G"
sollte eigentlich (unabhängig von der Schreibweise mit "?" oder "*") das gewünschte Ergebnis liefern.

Grüße
bastla
Bitte warten ..
Mitglied: sisiphus
11.11.2008 um 22:42 Uhr
Danke, das klappt -- ich werde verrückt, ich könnte schwören, dass ich das auch schon selbst ausprobiert habe. Danke für die Lösung -- das ging ja wirklich schnell!

Mein Ziel ist es, aus dem Verzeichnis mittels Dir die Datei mit der höchsten "Endnummer" zu ermitteln. Das aktuelle Log soll dann um +1 erweitert in diesem Verzeichnis gespeichert werden. Ich möchte gerne die Log-Dateien durchnummerieren, und kein Datum verwenden, da mir das aufgrund Lokalisierungs- und Windows-Versions-Problematik zu riskant ist, und ohnehin mir das Dateisystem verrät, wann die Datei erstellt, bzw. zuletzt geändert wurde. Die Endnummer soll also dazu dienen, die Logs auseinander zu halten, und die Reihenfolge zu bestimmen.

Mir wird gerade klar, dass der Ansatz mit Dir/ON nicht ganz unproblematisch ist, da ich ja bei der Sortierung nicht sicherstellen kann, dass die letzten -- sagen wir mal 4 -- Stellen wirklich Ziffern und keine Buchstaben sind.

Fällt Dir dazu etwas ein?

Gruß
Bitte warten ..
Mitglied: bastla
11.11.2008 um 23:25 Uhr
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:
01.
@echo off & setlocal 
02.
set /a Max=10000 
03.
for /f %%i in ('dir /b c:\batch\backuplog\backuplog????.txt') do call :ProcessFile "%%i" 
04.
set /a Max+=1 
05.
echo Naechste: %Max:~-4% 
06.
goto :eof 
07.
 
08.
:ProcessFile 
09.
set "Name=%~n1" 
10.
if "%Name:~12%"=="" goto :eof 
11.
if "%Name:~13%" neq "" goto :eof 
12.
 
13.
set Num=%Name:~9,4% 
14.
set N=%Num% 
15.
for /L %%a in (0,1,9) do if defined N call set N=%%N:%%a=%% 
16.
if defined N goto :eof 
17.
 
18.
set /a Nr=10000+Num 
19.
if %Nr% gtr %Max% set /a Max=%Nr% 
20.
goto :eof
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]
Bitte warten ..
Mitglied: sisiphus
15.11.2008 um 11:39 Uhr
Hi bastla,

ich wollte mich endlich für die Hilfe bedanken! Ich bin sehr beeindruckt von der Geschwindigkeit, mit der Du mir den Code erstellen konntest, und der Lösung.

Wenn Du Zeit hast, würde ich mich über Hilfe bei ein paar Verständnis-Fragen freuen:

- Zeile 9: Was ist %~n1? Ich finde es in der Hilfe von Set nicht, Google brachte mich nicht weiter. Liege ich richtig, wenn ich vermute, dass ~n1 die Dateiendung entfernt?
- 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?
- Goto-Aufrufe vs. Klammern: Kann man den Teil des ProzessFile-Unterprogramms auch in eine Klammer setzen? Mir ist das nicht gelungen, aber vielleicht ist das a) nicht möglich und b) schlechterer Stil?

Gruß, sisiphus
Bitte warten ..
Mitglied: Biber
15.11.2008 um 12:41 Uhr
Moin sisiphus,

ich will da bastla nicht vorgreifen, aber bis er fertig mit frühstücken ist, könntest Du die Antworten zu Zeile 9 und Zeile 15 selbst finden.

-> %~n1 und ähnliche abgeleitete Parametervariablen: "CALL /?" am CMD-Prompt
-> FOR /L-Anweisung/Zählschleife unter FOR /?

Grüße
Biber
Bitte warten ..
Mitglied: bastla
15.11.2008 um 14:23 Uhr
@Biber
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
Bitte warten ..
Mitglied: sisiphus
15.11.2008 um 14:44 Uhr
Hi Biber, hi Bastla,

danke Biber, wenn man weiß, wo man suchen muss, ist alles gleich viel einfacher...

Verbleiben noch 2 Fragen:

1.
Die Anführungszeichen in Zeile 9 (ich habe mich da vorhin verschrieben) um \"Name=%~n1\" -- wofür werden die Anführungszeichen benötigt?

2 .
Wie baue ich diesen Teil in mein Batch ein? Das ist eher eine stilistische Frage.

So, aber wie mache ich das jetzt? Ist es richtig, dass alles von Zeile 8 bis 20 zu :ProzessFile gehören? Ja?

So würde ich jetzt den Code von bastla in mein Script integrieren -- ich Euch lieber, bevor ich einen Fehler mache, den ich bei Tests nicht ermittle.

01.
@echo off & setlocal 
02.
befehl-mein-Programm0 
03.
 
04.
:: Zaehler fuer Logdatei anhand bereits geschriebener Logdateien setzten, Code von bastla 
05.
set /a Max=10000 
06.
for /f %%i in ('dir /b c:\batch\backuplog\backuplog????.txt') do call :ProcessFile "%%i" 
07.
:: Nummer um eine Ziffer hochsetzen 
08.
set /a Max+=1 
09.
echo Naechste: %Max:~-4% 
10.
befehl-mein-Programm1 
11.
befehl-mein-Programm2 
12.
befehl-mein-Programm3 
13.
usw... 
14.
goto :eof 
15.
 
16.
:ProcessFile 
17.
:: Dateilänge ueberpruefen 
18.
set "Name=%~n1" 
19.
if "%Name:~12%"=="" goto :eof 
20.
if "%Name:~13%" neq "" goto :eof 
21.
echo %Name% 
22.
:: Nummer ueberpruefen 
23.
set Num=%Name:~9,4% 
24.
set N=%Num% 
25.
for /L %%a in (0,1,9) do if defined N call set N=%%N:%%a=%% 
26.
if defined N goto :eof 
27.
set /a Nr=10000+Num 
28.
if %Nr% gtr %Max% set /a Max=%Nr% 
29.
goto :eof

Gruß und Danke soweit,
sisiphus
Bitte warten ..
Mitglied: sisiphus
15.11.2008 um 15:00 Uhr
Hi Bastla,

ich hoffe mal Du hattest ein gutes Frühstück! Frage 1 hat sich erledigt.

Zur Klammer-Problematik. Die Behandlung der Variable aus der For-Schleife spricht für die Behandlung der Prüfung nach der Sprungmarke, zumal, ich nicht weiß, ich in einer Klammer auf den Dateinamen kommen könnte (%~n1) könnte.

Mir fällt gerade auf, dass in meinem Beispiel natürlich noch ein ENDLOCAL vor Zeile 14 gehört.

Noch mal Danke!
Gruß, sisiphus
Bitte warten ..
Mitglied: bastla
15.11.2008 um 15:09 Uhr
Hallo sisiphus!

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
Bitte warten ..
Ähnliche Inhalte
Batch & Shell
Batchdatei soll überprüfen, ob auf eine Log Datei
Frage von hoppalaBatch & Shell1 Kommentar

Hiho :) ! Ein Freund und ich haben eine Batchdatei erstellt, leider kommen wir bei einer Sache nicht weiter. ...

Microsoft Office
Sharepoint 2013 - Dokumentenmappen durchnummerieren
Frage von BirdyBMicrosoft Office

Hallo miteinander, ich befasse mich gerade mit Sharepoint und baue eine Beispielanwendung um zu evaluieren, ob Sharepoint das richtige ...

Linux Tools
Mit Linux am ende einer Datei eine Leerzeile einfügen
gelöst Frage von OIOOIOOIOIIOOOIIOIIOIOOOLinux Tools30 Kommentare

Tach ihr alle, Ich wollte mal einen etwas aufwendigen Script schreiben welches via Cronejob zur bestimmten Zeiten ausgeführt werden ...

E-Mail
E-Mail End zu End Verschlüsselung
gelöst Frage von BergEnteE-Mail45 Kommentare

Hallo Support Forum, wir wollen Daten zwischen verschiedenen Organisationen sicher übertragen und verschlüsseln. Die Organisationen arbeiten mit Mac Mail, ...

Neue Wissensbeiträge
Linux

Meltdown und Spectre: Linux Update

Information von Frank vor 2 TagenLinux

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 3 TagenTipps & 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 3 TagenSicherheit12 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 3 TagenSicherheit12 Kommentare

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

Heiß diskutierte Inhalte
E-Mail
Erfahrungen mit hMailServer gesucht
Frage von it-fraggleE-Mail10 Kommentare

Hallo, meine neue Stelle möchte einen eigenen Mailserver. Ich als Linuxkind war direkt geistig mit Postfix dabei. Leider wollen ...

Entwicklung
VBS: alle PDF-Dateien in einem Ordner gleichzeitig öffnen
gelöst Frage von JuweeeEntwicklung9 Kommentare

Hallo, ich habe in deiner Ordnerstruktur (.\Tagesberichte\xx.18\) mehrere dynamische PDF-Formulare (mit LCD erstellt). Die Berichtsformulare sind im Layout alle ...

Firewall
Penetrationstester-Labor - Firewalls
Frage von Oli-nuxFirewall9 Kommentare

Mich würde interessieren warum man beim Einrichten eines Penetrationstester-Labor (VMs) die Firewall der Systeme deaktivieren soll? Hat das nur ...

Netzwerkgrundlagen
IPv6 Inter-VLAN Routing
gelöst Frage von clSchakNetzwerkgrundlagen9 Kommentare

Hi ich befasse mich gerade mit der Implementierung von IPv6 was bisher (in einem VLAN) korrekt funktioniert inkl. DNS ...