688987

CMD-Tricks am Beispiel der pcw1-1.v05.BAT

Das Programmieren von Batchdateien für komplexere Aufgaben scheitert meist nicht an den Grenzen, die die Batchsprache setzt. Probleme bereitet eher, dass die Kommandos unzureichend dokumentiert sind und der Interpreter Cmd.EXE oft nichtssagende Fehlermeldungen ausgibt. Typisch ist etwa die Meldung, sei "an dieser Stelle syntaktisch nicht verarbeitbar“.

Anforderung:

Profis

Zeitaufwand:

Mittel

Problem:

Das Programmieren von Batchdateien für komplexere Aufgaben scheitert meist nicht an den Grenzen, die die Batchsprache setzt. Probleme bereitet eher, dass die Kommandos unzureichend dokumentiert sind und der Interpreter Cmd.EXE oft nichtssagende Fehlermeldungen ausgibt. Typisch ist etwa die Meldung, <xy> sei "an dieser Stelle syntaktisch nicht verarbeitbar“.

Lösung:

Wir erläutern an Hand der Batchdatei :pcw1-1.v05.BAT eine Handvoll typischer Probleme. Der Befehl

del /s \*. ext

ist praktisch, um einen Dateityp wie TMP von der ganzen Platte zu fegen. Der Befehl löscht aber nicht wirklich alles. Ein Stück weiter kommen Sie mit

del /f /s \*. ext

, der auch schreibgeschützte Dateien entsorgt.

Wirklich alles löscht der Befehl

del /f /a /s \*. ext

(pcw1-1.v05, Zeile 133, dort ohne Schalter /s). Schalter /a ohne nachfolgende Angabe bestimmter Attribute zeigt dem Löschkommando, dass es alle Dateien mit beliebigen Attribut-Kombinationen berücksichtigen soll. Wenn Sie alle Ordner oder alle Dateien unterhalb eines Ausgangspfads bearbeiten wollen, bietet sich

for /r Pfad %N in (.) do...

an. Steht in der Klammer nur ein Punkt, verarbeitet die Schleife alle Ordner, mit "(*.*)“ alle Dateien. Alle? Nein. Dateien mit Hidden-Attribut übergeht der Befehl, bei Ordnern nimmt er hingegen wirklich alle. Zuverlässiger und obendrein schneller ist es daher, erst mit einem "dir“-Kommando, das die gewünschten Datei-Objekte erfasst, eine Liste zu erzeugen und diese danach mit "for /f“ abzuarbeiten (pcw1-1.v05, Zeile 104 f. und 108 f.):

for /f "Delims=" %N in ( Liste ) do...

Die Option "Delims=“ sorgt dafür, dass Zeile für Zeile der Listendatei in die Variable %N gelesen werden. Ohne dieses Abschalten der sonstigen Standard-Begrenzer würde die For-Schleife etwa auch Leerzeichen als Begrenzer für das nächste Argument interpretieren.

Die Batchsprache beherrscht weder Fließkommaberechnungen noch ansehnliche Interaktion. Für Zähler, Summen oder Differenzen mit Integer-Zahlen und einfache Texteingaben reicht der CMD-Interpreter aber allemal: Einschlägig ist der Set-Befehl mit Schalter /a für Berechnungen und Schalter /p für User-Abfragen (pcw1-1.v05, Zeile 27, 131 und weitere).

Beachten Sie bei User-Abfragen, dass dabei Doskey-Makros im Weg stehen könnten: Ein geplanter Input "n“ für "Nein“ kann etwa daran scheitern, dass "n“ als Kurzaufruf für Notepad definiert ist. Also: Vorsorglich weg mit allen Doskey-Makros, die den Batch-Ablauf stören könnten (pcw1-1.v05, Zeilen 11 bis 15).

Um User-Eingaben zu überprüfen und auf eine einheitliche Form zu trimmen, ist bei jeder Programmierung etwas String-Verarbeitung erforderlich. Die Batchsprache ist für diese Aufgabe zwar nicht eben eingängig, andererseits aber nicht unfähig. Um etwa einen eventuellen Backslash am Ende der Variable "z“ abzuschneiden, hilft diese Zeile:

if %z:~-1%==\ set z=%z:~0,-1%

Sofern das erste Zeichen von rechts ("-1“) ein Backslash ist, wird die Variable um ein Zeichen gekürzt. String-Ersetzungen folgen dem Muster "set z=%z:a=b%“ (jeder Buchstabe "a“ in der Variable "z“ wird durch "b“ ersetzt). Zum Löschen von bestimmten Zeichen bleibt einfach der Ersatz-String leer:

set z=%z:a=%

Die pcw1-1.v05 enthält hierfür konkrete Beispiele etwa in den Zeilen 28, 36, 124 und 130.

Die beiden Beispiele in Zeile 124 und 130 zeigen, dass diese String-Ersetzung auch funktioniert, wenn die auszutauschenden String-Teile nicht als Klartext-Konstanten, sondern als Variablen vorliegen. Das setzt dann allerdings einen zusätzlichen Call-Befehl voraus. Da dieses "call set...“ nicht innerhalb einer For-Schleife funktioniert (Zeile 105 und 109), muss die Aktion in eine eigene "Funktion“ ausgelagert werden (Zeilen 123ff. und 129ff.).

:Tipp des Tages: Daten synchronisieren mit pcw1-1.v05.BAT

0 Kommentare zu diesem Artikel
688987