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

gelöst Batch soll sich eigene Config-Datei schreiben

Mitglied: boerner-it.de

boerner-it.de (Level 1) - Jetzt verbinden

23.09.2011, aktualisiert 09:59 Uhr, 3269 Aufrufe, 4 Kommentare

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:

01.
call :tw :: Die Anzahl gespeicherter Backups sollte größer oder gleich 2 sein, um Backups rotieren zu lassen 
02.
call :tw :: Wird als Anzahl 1 eingestellt, wird das letzte Backup während der Erstellung des aktuellen Backups gelöscht 
03.
call :cw BackupAnzahl 
04.
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:

01.
:cw 
02.
set cw_proz=%% 
03.
set cw_var=%1 
04.
call set "cw_wert=%cw_proz%%cw_var%%cw_proz%" 
05.
IF defined cw_wert set cw_wert2=%cw_wert: =% 
06.
IF (%cw_wert2%) GEQ (0) IF (%cw_wert2%) LEQ (99) set cw_wert=^^%cw_wert% 
07.
IF defined cw_wert (set "cw_wert=%cw_wert:\=^\%") 
08.
echo set %cw_var%=%cw_wert%>>%pfConfig% 
09.
set cw_proz= 
10.
set cw_var= 
11.
set cw_wert= 
12.
goto :eof 
13.
 
14.
:tw 
15.
set cw_tmp=%1 
16.
if defined cw_tmp (shift) else (goto :tw_sub) 
17.
set "cw_tmp=%cw_tmp:(=[%" 
18.
set "cw_tmp=%cw_tmp:)=]%" 
19.
if defined cw_wert (set cw_wert=%cw_wert% %cw_tmp%) else (set cw_wert=%cw_tmp%) 
20.
goto :tw 
21.
 
22.
:tw_sub 
23.
if defined cw_wert (echo %cw_wert%>>%pfConfig%) else (echo\>>%pfConfig%) 
24.
set cw_tmp= 
25.
set cw_wert= 
26.
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
Mitglied: 60730
23.09.2011 um 11:14 Uhr
moin,

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ß
Bitte warten ..
Mitglied: boerner-it.de
23.09.2011 um 11:20 Uhr
Änderungsdatum ist gut... das ich da nicht selbst drauf gekommen bin...

Ist sicherer als die Größe, zumal ich eh das Problem hatte, das meine Lösung nicht bemerkt, wenn jemand aus einer 0 eine 1 macht.

Dank dir Timo
Bitte warten ..
Mitglied: bastla
23.09.2011 um 16:17 Uhr
Hallo boerner-it.de!

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"
und
01.
:tw 
02.
set "cw_tmp=%*" 
03.
if not defined cw_tmp >>%pfConfig% echo\ & goto :eof 
04.
setlocal enabledelayedexpansion 
05.
>>%pfConfig% echo !cw_tmp! 
06.
endlocal 
07.
goto :eof
Grüße
bastla
Bitte warten ..
Mitglied: boerner-it.de
26.09.2011 um 15:18 Uhr
Zuerst einmal vielen Dank an TimoBeil und bastla für die Rückmeldungen.

Habe als Check auf Änderungen das Änderungsdatum anstatt der Dateigröße verbaut - was super funktioniert.

Ausserdem habe ich Bastlas Ratschläge verbaut und nach einigen Anpassungen bin ich jetzt doch endlich zu einem Ergebnis gekommen. So sehen :cw und :tw jetzt aus:
01.
:cw 
02.
set cw_proz=%% 
03.
set cw_var=%1 
04.
call set "cw_wert=%cw_proz%%cw_var%%cw_proz%" 
05.
if not defined cw_wert goto :cw2 
06.
set "cw_wertTMP=%cw_wert: =%" 
07.
IF "%cw_wertTMP%" GEQ "0" IF "%cw_wertTMP%" LEQ "99" set cw_wert=^^%cw_wert% 
08.
IF defined cw_wert (set "cw_wert=%cw_wert:\=^\%") 
09.
:cw2 
10.
echo set %cw_var%=%cw_wert%>>%pfConfig% 
11.
set cw_proz= 
12.
set cw_var= 
13.
set cw_wert= 
14.
goto :eof 
15.
 
16.
:tw 
17.
set "cw_tmp=%*" 
18.
if not defined cw_tmp >>%pfConfig% echo\ & goto :eof 
19.
setlocal enabledelayedexpansion 
20.
>>%pfConfig% echo !cw_tmp! 
21.
endlocal 
22.
goto :eof
Alles in allem läuft das Erzeugen einer Config-Datei im Schnitt jetzt 4 bis 5 mal schneller ab - da ich auf die lästige Schleife bei :tw verzichten kann.

Zeile 4 kann ich allerdings nicht wie empfohlen abändern, da der Aufruf per call dafür sorgt, dass ich mir den Variablennamen zusammensetze und gleich dessen Wert auslese.
Würde ich call weglassen, bekäme ich den Namen der Variable (mit den umgebenden Prozentzeichen) als Wert zurück.
Wäre also die Variable LOG auf den Wert 1 gesetzt, bekomme ich bei meinem Aufruf cw_wert=1 und ohne call erhalte ich cw_wert=%log%

Die Prüfung in Zeile 5 muss ebenfalls bleiben, da cw_wert ja nicht %cw_proz%%cw_var%%cw_proz% enthält, sondern den Wert, den die daraus entstehende Variable möglicherweise enthält

Die Textzeilen in doppelte Anführungszeichen zu setzen, führte dazu, dass ich diese dann auch in meiner Config-Datei hatte. Nachdem ich die einfach wieder weg gelassen habe, lief die Generierung der Config-Datei sauber durch.

Somit sind all die Probleme bereits gelöst, die die Funktion meines Scripts beeinträchtigt haben.

Bleibt noch die Frage offen, ob es möglich ist, die :cw und :tw zusammenzufassen.

Vielleicht habt ihr ja auch dazu noch eine schlaue Idee.

Grüße, Chris
Bitte warten ..
Ähnliche Inhalte
Batch & Shell
Batch Eingabe in Datei schreiben
gelöst Frage von MedicalAdBatch & Shell2 Kommentare

Hallo Leute, ich habe folgendes Problem, ich möchte ein Batch Programm was nacheinander > Computername, IP Adresse, Aufstellungsort und ...

Windows 10

Mit einer batch Datei etwas in eine andere batch Datei schreiben und ausführen

Frage von RaphaelStockWindows 105 Kommentare

Hey Administratoren!! Ich habe ein Problem: Ich möchte alle 40 sek etwas in eine batch Datei schreiben und ausführen ...

Batch & Shell

Batch: Batch in batch in cfg schreiben

gelöst Frage von pixelBfBatch & Shell2 Kommentare

Hayy, ich bin neu hier im forum:)) Meine frage: Kann ich eine batch schreiben die was in eine batch ...

Batch & Shell

Größe einer Datei per BATCH in eine TXT schreiben

gelöst Frage von marvinplBatch & Shell5 Kommentare

Hallo erstmal und danke, dass du meine Frage geöffnet hast. Ich möchte auf Servern von uns und unseren Kunden ...

Neue Wissensbeiträge
Datenschutz

Die Datenkrake Google verlängert ihr Arme mal wieder ein wenig, automatische Anmeldung

Tipp von magicteddy vor 3 StundenDatenschutz

Benutzer mit einem Google Account und gespeicherten Zugangsdaten werden von chrome 69 automatisch bei Google angemeldet, natürlich alles zum ...

Verschlüsselung & Zertifikate
Meine Wissenssammlung zu Bitlocker
Erfahrungsbericht von DerWoWusste vor 1 TagVerschlüsselung & Zertifikate3 Kommentare

Die Motivation für diesen Beitrag waren die vielen Posts rund um dieses Thema, die deutlich machen, wie viele Einzelaspekte ...

E-Mail
Email-Apps und Verhalten bei Pop3
Erfahrungsbericht von kfranzk vor 3 TagenE-Mail11 Kommentare

Hallo Freunde, da mir mein diesbezüglicher Faden als gelöst markiert wurde, muss ich hier neu aufsetzen. Ich arbeite bewusst ...

Hyper-V

Optimiertes Ubuntu per Microsoft Hyper-V-Schnellerstellung verfügbar

Anleitung von Frank vor 3 TagenHyper-V1 Kommentar

Für Microsofts Virtualisierungssoftware Hyper-V ist ab sofort auch ein optimiertes Ubuntu 18.04.1 LTS verfügbar. In der "Hyper-V-Schnellerstellung" App, die ...

Heiß diskutierte Inhalte
Hardware
Sophos SG135 - Routing
gelöst Frage von Xaero1982Hardware22 Kommentare

Moin Zusammen, ich ersetze gerade nen alten Cisco DualWAN Router durch eine SG 135. Ich muss bestimmte Ziele über ...

Datenschutz
Gilt ein Ransomware-Befall als Datenpanne nach DSGVO?
Frage von MOS6581Datenschutz22 Kommentare

Moin Kollegen, wenn sich jemand Ransomware einfängt und dadurch bspw. Kundendaten verschlüsselt werden; gilt dies dann als meldepflichtige Datenpanne ...

Windows 7
Mit gpedit gesetzte Richtlinien in rsop.msc nicht definiert und ausgegraut
gelöst Frage von 137006Windows 715 Kommentare

Hallo zusammen, anfangs verweise ich fairerweise daruf dass ich dieses Thema bereits im Forum angeschnitten habe, nachdem ich hier ...

Netzwerke
Hilfe bei der Planung meines Heimnetzwerks
Frage von DHD082Netzwerke15 Kommentare

Hallo zusammen, wir bauen gerade ein Einfamilienhaus, welches ich mit einem Heimnetzwerk ausstatten möchte. Da ich zwar auch in ...