Batch soll sich eigene Config-Datei schreiben
Erstmal einen schönen guten Tag.
Ich habe da so eine kleine Batch, die tägliche Datenbank-Backups in verschiedenen Kundenumgebungen erledigen soll. Das hat auch super funktioniert, bis ich auf die Idee gekommen bin, ich möchte auch gleich noch mehrere Ordner mitsichern, die alle semikolon-getrennt ( wie %path% ) in einer einzigen Variable stehen. Mein Hauptproblem dabei ist, dass Zeichen wie Komma oder Semikolon bei meiner Lösung unbeabsichtigt "herausgefiltert" werden. Aber seht selbst:
Ich möchte eine Batch schaffen, die bei ihrer ersten Ausführung eine Config-Datei schreibt (und später prüft, ob die Config-Datei aktualisiert werden muss). Hierfür gibt es mehrere Gründe:
- der Anwender dieser Batch soll nicht mehr irgendwo im Quellcode dieser Batchdatei Variablen füllen müssen, sondern bequem in einer TXT-Datei (später vielleicht noch mit einem set /P-Assistenten
- die Batch selbst soll austauschbar sein durch neuere Versionen und dabei die Einträge der Konfiguration beibehalten
Im Augenblick enthält meine Batch in einem bestimmten Bereich diese und ähnliche Einträge, die als Vorlage für die Config-Datei dienen:
Zeilen, die mit call :tw anfangen, sind Textzeilen und sollen eins zu eins in die Config-Datei geschrieben werden.
Zeilen, die mit call :cw anfangen, sind Variablen, die später mit Inhalt gefüllt werden sollen.
Um nun z.B. bei einem Update der Batch die Config zu aktualisieren, benenne ich sie von Config.txt in Config.bat um und führe sie aus.
Sollte die Config-Datei bereits Inhalte haben, existieren die Variablen mit ihren Werten nun im Speicher.
Um die Config-Datei nun mit möglichen neuen Config-Einträgen ( weil ja Aktualisierung der Batch erfolgt ist) anzupassen, schreibe ich sie kurzerhand neu.
Zur Prüfung, ob sich an der Batch oder Config-Datei etwas geändert hat, werden in die Config-Datei die Dateigrößen von Batch und Config-Datei geschrieben und bei jeder Ausführung der Batch geprüft.
Durch die Neuerstellung werden die Config-Werte im Speicher und der Aufbau, der in der Batch hinterlegt ist, zusammengeführt. Hierfür ist folgende Routine zuständig:
Die Variable %pfConfig% enthält den Pfad zur Config-Datei.
zur :cw ) Ich hole mir den übergebenen Wert, sorge dafür, dass er als Variable erkannt wird und schreibe folgendes in die Config-Datei: Variablenname=Variablenwert
zur :tw ) Ich hole mir in einer Schleife mit shift so lange den übergebenen Text, bis dieser komplett ist und schreibe ihn ebenfalls in die Config-Datei. Leerzeilen sollen hierbei ebenfalls geschrieben werden.
Das ganze ist aber leider suboptimal. So ist der ganze Vorgang beispielsweise abgebrochen, wenn ein Text Klammern enthielt ( daher der Notbehelf, runde Klammern durch eckige zu ersetzen ).
Ausserdem werden Texte ohne die im Vorlagenbereich eingetragenen Komma, Semikolon, etc. übergeben.
Zu allem Überfluss ist die Lösung mit shift bei den Texten natürlich recht langsam ( Vorlagenbereich enthält z.Z. 70 Zeilen und braucht etwa 20 Sekunden dafür ), aber anders wollte es mir einfach nicht gelingen, den Text mit allen Leerzeichen in die Variable zu übergeben.
Was ich erreichen möchte:
- Lösung ohne shift - der Text soll in einem Stück übergeben werden und nicht schnipselweise
- Lösung, die :cw und :tw zusammenfasst und möglichst per for-schleife schaut, ob die Zeile mit :: anfängt oder leer ist - was Text ausgeben soll - oder, wenn dies nicht zutrifft, eine Variable
( Mein Ansatz hierzu war eine for-schleife, die mit call den Vorlagenbereich aufruft und abarbeitet. Leider scheint diese Konstellation nicht zu funktionieren. )
- Lösung, bei der ich im Vorlagenbereich auf den Aufruf von :cw / :tw vor jeder Zeile verzichten kann ( die Batch soll das ja selbst entscheiden )
- Lösung, die mit Leerzeichen, Semikolon, Komma, Doppelpunkt, Punkt, Slash, Backslash und der öffnenden und schließenden Klammer klarkommt.
Ich hoffe, Ihr kommt mit meinem Anfänger-Batch-Fu klar und könnt mir helfen. Bei Bedarf kann ich auch die ganze Batch posten, wenn euch das was nützt.
Für eure Hilfe schonmal vielen Dank im Voraus
Ich habe da so eine kleine Batch, die tägliche Datenbank-Backups in verschiedenen Kundenumgebungen erledigen soll. Das hat auch super funktioniert, bis ich auf die Idee gekommen bin, ich möchte auch gleich noch mehrere Ordner mitsichern, die alle semikolon-getrennt ( wie %path% ) in einer einzigen Variable stehen. Mein Hauptproblem dabei ist, dass Zeichen wie Komma oder Semikolon bei meiner Lösung unbeabsichtigt "herausgefiltert" werden. Aber seht selbst:
Ich möchte eine Batch schaffen, die bei ihrer ersten Ausführung eine Config-Datei schreibt (und später prüft, ob die Config-Datei aktualisiert werden muss). Hierfür gibt es mehrere Gründe:
- der Anwender dieser Batch soll nicht mehr irgendwo im Quellcode dieser Batchdatei Variablen füllen müssen, sondern bequem in einer TXT-Datei (später vielleicht noch mit einem set /P-Assistenten
- die Batch selbst soll austauschbar sein durch neuere Versionen und dabei die Einträge der Konfiguration beibehalten
Im Augenblick enthält meine Batch in einem bestimmten Bereich diese und ähnliche Einträge, die als Vorlage für die Config-Datei dienen:
call :tw :: Die Anzahl gespeicherter Backups sollte größer oder gleich 2 sein, um Backups rotieren zu lassen
call :tw :: Wird als Anzahl 1 eingestellt, wird das letzte Backup während der Erstellung des aktuellen Backups gelöscht
call :cw BackupAnzahl
call :tw
Zeilen, die mit call :tw anfangen, sind Textzeilen und sollen eins zu eins in die Config-Datei geschrieben werden.
Zeilen, die mit call :cw anfangen, sind Variablen, die später mit Inhalt gefüllt werden sollen.
Um nun z.B. bei einem Update der Batch die Config zu aktualisieren, benenne ich sie von Config.txt in Config.bat um und führe sie aus.
Sollte die Config-Datei bereits Inhalte haben, existieren die Variablen mit ihren Werten nun im Speicher.
Um die Config-Datei nun mit möglichen neuen Config-Einträgen ( weil ja Aktualisierung der Batch erfolgt ist) anzupassen, schreibe ich sie kurzerhand neu.
Zur Prüfung, ob sich an der Batch oder Config-Datei etwas geändert hat, werden in die Config-Datei die Dateigrößen von Batch und Config-Datei geschrieben und bei jeder Ausführung der Batch geprüft.
Durch die Neuerstellung werden die Config-Werte im Speicher und der Aufbau, der in der Batch hinterlegt ist, zusammengeführt. Hierfür ist folgende Routine zuständig:
:cw
set cw_proz=%%
set cw_var=%1
call set "cw_wert=%cw_proz%%cw_var%%cw_proz%"
IF defined cw_wert set cw_wert2=%cw_wert: =%
IF (%cw_wert2%) GEQ (0) IF (%cw_wert2%) LEQ (99) set cw_wert=^^%cw_wert%
IF defined cw_wert (set "cw_wert=%cw_wert:\=^\%")
echo set %cw_var%=%cw_wert%>>%pfConfig%
set cw_proz=
set cw_var=
set cw_wert=
goto :eof
:tw
set cw_tmp=%1
if defined cw_tmp (shift) else (goto :tw_sub)
set "cw_tmp=%cw_tmp:(=[%"
set "cw_tmp=%cw_tmp:)=]%"
if defined cw_wert (set cw_wert=%cw_wert% %cw_tmp%) else (set cw_wert=%cw_tmp%)
goto :tw
:tw_sub
if defined cw_wert (echo %cw_wert%>>%pfConfig%) else (echo\>>%pfConfig%)
set cw_tmp=
set cw_wert=
goto :eof
Die Variable %pfConfig% enthält den Pfad zur Config-Datei.
zur :cw ) Ich hole mir den übergebenen Wert, sorge dafür, dass er als Variable erkannt wird und schreibe folgendes in die Config-Datei: Variablenname=Variablenwert
zur :tw ) Ich hole mir in einer Schleife mit shift so lange den übergebenen Text, bis dieser komplett ist und schreibe ihn ebenfalls in die Config-Datei. Leerzeilen sollen hierbei ebenfalls geschrieben werden.
Das ganze ist aber leider suboptimal. So ist der ganze Vorgang beispielsweise abgebrochen, wenn ein Text Klammern enthielt ( daher der Notbehelf, runde Klammern durch eckige zu ersetzen ).
Ausserdem werden Texte ohne die im Vorlagenbereich eingetragenen Komma, Semikolon, etc. übergeben.
Zu allem Überfluss ist die Lösung mit shift bei den Texten natürlich recht langsam ( Vorlagenbereich enthält z.Z. 70 Zeilen und braucht etwa 20 Sekunden dafür ), aber anders wollte es mir einfach nicht gelingen, den Text mit allen Leerzeichen in die Variable zu übergeben.
Was ich erreichen möchte:
- Lösung ohne shift - der Text soll in einem Stück übergeben werden und nicht schnipselweise
- Lösung, die :cw und :tw zusammenfasst und möglichst per for-schleife schaut, ob die Zeile mit :: anfängt oder leer ist - was Text ausgeben soll - oder, wenn dies nicht zutrifft, eine Variable
( Mein Ansatz hierzu war eine for-schleife, die mit call den Vorlagenbereich aufruft und abarbeitet. Leider scheint diese Konstellation nicht zu funktionieren. )
- Lösung, bei der ich im Vorlagenbereich auf den Aufruf von :cw / :tw vor jeder Zeile verzichten kann ( die Batch soll das ja selbst entscheiden )
- Lösung, die mit Leerzeichen, Semikolon, Komma, Doppelpunkt, Punkt, Slash, Backslash und der öffnenden und schließenden Klammer klarkommt.
Ich hoffe, Ihr kommt mit meinem Anfänger-Batch-Fu klar und könnt mir helfen. Bei Bedarf kann ich auch die ganze Batch posten, wenn euch das was nützt.
Für eure Hilfe schonmal vielen Dank im Voraus
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 173572
Url: https://administrator.de/forum/batch-soll-sich-eigene-config-datei-schreiben-173572.html
Ausgedruckt am: 23.04.2025 um 05:04 Uhr
4 Kommentare
Neuester Kommentar

moin,
ganz kurz - ich hab nicht viel Zeit und nehme mir nur eine zeile raus...
Ist suboptimal - entweder mittels Dateiänderungsdatum, oder mit je einer doublette, die du per fc überprüfst.
Gruß
ganz kurz - ich hab nicht viel Zeit und nehme mir nur eine zeile raus...
Zur Prüfung, ob sich an der Batch oder Config-Datei etwas geändert hat, werden in die Config-Datei die Dateigrößen von Batch und Config-Datei geschrieben und bei jeder Ausführung der Batch geprüft.
Ist suboptimal - entweder mittels Dateiänderungsdatum, oder mit je einer doublette, die du per fc überprüfst.
Gruß
Hallo boerner-it.de!
Ich habe auch nur mal einen Blick auf die Auffälligkeiten riskiert:
"
In Zeile 5 ist aufgrund der Zuweisung von zumindest "%%" in Zeile 4 "
Da ja in Zeile 6 vermutlich ein numerischer Vergleich erfolgen soll, sind die Klammern kontraproduktiv.
Zum Thema "Sonderzeichen" könntest Du das so vereinfachen:
und
Grüße
bastla
Ich habe auch nur mal einen Blick auf die Auffälligkeiten riskiert:
"
call
" wird in Zeile 4 nicht benötigt.In Zeile 5 ist aufgrund der Zuweisung von zumindest "%%" in Zeile 4 "
IF defined cw_wert
" überflüssig.Da ja in Zeile 6 vermutlich ein numerischer Vergleich erfolgen soll, sind die Klammern kontraproduktiv.
Zum Thema "Sonderzeichen" könntest Du das so vereinfachen:
call :tw ":: Die Anzahl gespeicherter Backups sollte größer (oder wenigstens gleich) 2 sein, um Backups >rotieren< zu lassen"
:tw
set "cw_tmp=%*"
if not defined cw_tmp >>%pfConfig% echo\ & goto :eof
setlocal enabledelayedexpansion
>>%pfConfig% echo !cw_tmp!
endlocal
goto :eof
bastla