Einleitung
Zumeist sind BAT-Dateien recht klein und damit überschaubar. Wenn man doch auf die Idee kommt, etwas mehr hineinzupacken und es vielleicht irgendwann doch unübersichtlich wird, ärgert man sich: Wieso habe ich nicht von Anfang an Strukur in das Ganze gebracht!?
Ich habe mir aus diesem Grunde angewöhnt, immer eine Vorlage zu verwenden, die in mehrere Abschnitte unterteilt ist:
- Header
In Kommentarzeilen werden Name des Skriptes, eine Beschreibung und eine History (Datum + Beschreibung der Änderung) abgelegt. - CONFIG
Hier initialisiere ich die gebrauchten Variablen. Hier werden z.B. Pfade und Dateinamen, die ich später brauche, in Umgebungsvariablen abgelegt.
Hier darf der User noch Anpassungen vornehmen. - MAIN
In dieser Sektion ist das eigentliche Skript.
Dieser Teil ist so geschrieben, dass er keine "hardcodierten" Elemente enthält, sondern immer funktioniert und mit den Variablen aus dem CONFIG-Abschnitt auskommt. - END
Hier werden z.B. temporäre Dateien gelöscht und/ oder auf einen Tastendruck zum Beenden gewartet.
einfache Variante
Es kann z.B. so aussehen:
@echo off rem ====================================================================== :: :: [2do: insert the script name here] :: Axel Hahn - https://www.axel-hahn.de/ :: rem ---------------------------------------------------------------------- :: History :: V1.0 - 2003-08-13 initial version rem ====================================================================== rem ---------------------------------------------------------------------- :: CONFIG rem ---------------------------------------------------------------------- set sTitle=[2do: insert the script name here] set LINE=------------------------------------------------------------------- rem ---------------------------------------------------------------------- :: MAIN rem ---------------------------------------------------------------------- echo %LINE% echo. echo %sTitle% echo. echo %LINE% echo. echo 2do: insert your code here.. goto END rem ---------------------------------------------------------------------- :: the end of all rem ---------------------------------------------------------------------- :END echo %LINE% echo %0 was terminated. echo press any key... pause >nul rem ====================================================================== :: EOF rem ======================================================================
Befehle: echo goto pause set rem
Erweiterungen
aktuelles Skriptverzeichnis in eine Variable holen
Gern setze ich eine Variable scriptdir mit dem aktuellen Verzeichnis, in dem sich das Skript befindet. Meist lege ich im selben Verzeichnis oder in einen Unterverzeichnis noch andere Dateien an (Konfigurationen, Binaries). So kann ich diese dann in leserlicher Form ansprechen:
set scriptdir=%~dp0
Die Variable scriptdir enthält dann den aktuellen Pfad inkl. abschliessenden Backslash. Dies funktioniert mit auch UNC-Pfaden (das Kürzel %~d0 für das Laufwerk ist halt nur leer).
mehrfache Konfigurations-Sets
Wenn man ein Skript daheim auf dem Privatrechner laufen lässt, ist das Bearbeiten des Skripts und das Anpassen der Variablen kein Problem. Oft ist es so, dass man aber auch die CONFIG-Sektion variabel halten muss, z.B.
- Im Netzwerk-Einsatz - bei manchen Servern braucht man eine eine andere Konfiguration
- oder bei Tests in eigenen Umgebung und späteren Einsatz bei einem Kunden
Nun, prinzipiell ist es eh besser, wenn man Logik des Codes von der Konfiguration trennen kann.
Die Lösung des Problems besteht im call-Aufruf einer weiteren Datei (bei sonstigen Skriptsprachen entspricht das einer Include-Anweisung). Man kann pro Server/ Kundenumgebung eine andere Konfigurationsdatei installieren oder auf Umgebungsvariablen zurückgreifen, und rechnerspezifisch oder benutzerspezifisch einen Dateinamen ansprechen:
%USERNAME% - enthält aktuellen Benutzer, unter dem das Skript ausgeführt wird %COMPUTERNAME% - Rechnername
set scriptdir=%~dp0 rem --- eine Default-Variable setzen set defaultdir=C:\irgendwo rem --- Festlegen des Namens der Konfigurationsdatei set cfgfile=%scriptdir%config_%COMPUTERNAME%.bat rem --- Mit Call die Konfiguration laden call "%cfgfile%" 2>nul || ( echo. echo ERROR - the config file echo %cfgfile% echo was not found. Exit. pause exit ) echo %defaultdir%
Befehle: call echo goto set rem
Die Konfiguration ist dann eine BAT, die einfach mit set die notwendigen Variablen setzt:
rem --- Konfiguration für Rechner server1.example.com set defaultdir=D:\irgendwoanders
Hilfe und Syntax ausgeben
Das gehört in die Rubrik erweitertes Skripting (getestet mit XP).
Man kann in den Header etwas Dokumentation packen. Wenn man diese Dokumentation so schreibt, dass man sie parsen kann, kann man diese Ausgabe auch noch für das Skript selbst verwerten.
Mal ein Beispiel: Hinter dem Kommentar mit :: ab Zeilenanfang schreibe ich mein Keyword "HELP" und Doppelpunkt. Dahinter folgt der eigentliche Hilfetext.
@echo off rem ====================================================================== :: :: MEIN SKRIPT :: rem ---------------------------------------------------------------------- :: :: HELP:MEIN SKRIPT - V1.0 :: HELP:Dieses Skript macht irgendwas ganz Tolles. :: :: SYNTAX:SYNTAX: :: SYNTAX:call skriptname [variable1] [variable2] :: SYNTAX: [variable1] - ist wichtig :: SYNTAX: [variable2] - die auch ::
Befehle: echo rem
Diese Hilfe kann ich ausgeben, indem ich im eigenen Skript (Variable %0) mit dem regulären Ausdruck "^::.*HELP:" danach suche.
set var1=%1 set var2=%2 if "%var1%"=="" goto help if "%var2%"=="" goto showSyntax rem ... main code is here ... goto end :help echo. for /F "tokens=2* delims=:" %%a in ('findstr "^::.*HELP:" "%0"') do echo %%a :showSyntax echo. for /F "tokens=2* delims=:" %%a in ('findstr "^::.*SYNTAX:" "%0"') do echo.%%a echo. goto end :end