BATch-Dateien - leeres Template

leeres Template für eine neue BAT-Datei

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

Befehle: echo findstr for goto set