Ich sag zum Abschied leise Batch-Datei

Für diesen Beitrag habe ich in meinen Kategorien extra den Eintrag «Nerdpost» eingerichtet. Sie ist den Tipps vorbehalten, die ich mit gutem Gewissen nicht in der Kummerbox des Tagesanzeiger veröffentlichen kann, weil ich mir sonst zu Recht die Frage gefallen muss, ob ich denn noch bei Trost sei.
In meinem Blog habe ich diesbezüglich keine Scham: Da nehme ich Worte wie Editor für lokale Gruppenrichtlinien in den Mund, ohne dabei rot zu werden. Denn so umständlich das Ding auch benannt ist und so undurchsichtig Microsoft es gestrickt hat: Es kann nützliche Dinge bewirken.
Also, nachdem das zu erwartende Schmerzlevel in diesem Nerdpost nun geklärt ist, zu der eigentlichen Angelegenheit:
Es ist ja so, dass man bei Windows ohne Aufwand Programme automatisch starten kann. Man tut dazu nichts anderes, als eine Verknüpfung zu diesem Programm in den Ordner Alle Programme > Autostart zu legen. Nun möchten viele Leute (ich, zum Beispiel) aber auch Dinge beim Abschalten automatisch in Betrieb setzen. Das klassische Beispiel dafür ist die Datensicherung. Die soll automatisch beim Herunterfahren durchgeführt werden.
Ich erledige die Datensicherung über eine Batch-Datei, die automatisch alle neuen und geänderten Dateien auf die Netzwerkfestplatte kopiert (siehe unten). Praktisch, aber es hat den Nachteil, dass man sie vor dem Herunterfahren automatisch starten muss. Und auch wenn man in der Batch-Datei einen Befehl zum Herunterfahren platzieren kann, so wäre es doch trotzdem perfekt, wenn Windows die Batch-Datei beim Herunterfahren freundlicherweise selbst in Gang setzen würde.
Und man vermutet, dass das möglich ist – denn Windows kann irgendwie alles, aber auf eine Weise, die man als Anwender nicht versteht.
Da ich nun seit gut zwanzig Jahren mit Windows zu tun habe und vor gut acht Jahren zum ersten Mal über ein Ding namens Editor für lokale Gruppenrichtlinien (bitte nicht rot werden bei diesem Namen) gestolpert bin, drängte sich mir die Vermutung auf, dass man damit das Gewünschte erledigen kann. Und tatsächlich: Die Gruppenrichtlinie bietet – so gut versteckt, dass nie jemals ein Anwender zufällig oder absichtlich darauf stossen wird – die Möglichkeit, automatische Dinge beim Herunterfahren in Gang zu setzen.
Und das geht wie folgt: Als erstes startet man den Editor für lokale Gruppenrichtlinien. Das tut man bei Vista und Windows 7 am einfachsten, indem man gpedit.msc in das Startmenü-Suchfeld tippt und dann Enter drückt. Bei Windows XP Professional klickt man auf Ausführen und gibt dann gpedit.msc ein. Bei Windows XP Home Edition funktioniert der Zauber leider nicht.
Es erscheint dieses schöne Programm hier:
100819_gpedit01.jpg
Also, bei diesem Programm hangle ich mich über Benutzerkonfiguration > Windows-Einstellungen zu Scripts (Anmelden/Abmelden). Hier doppelklicke ich auf Abmelden, und es erscheint dieser schöne Dialog hier:
100819_gpedit02.jpg
Ich klicke auf Durchsuchen und gebe meine Batch-Datei an. Diese sollte in einem bestimmten Ordner liegen, den ich am einfachsten öffne, indem ich im Dialog Eigenschaften von Abmelden auf Dateien anzeigen klicke. Da ich meine Batch-Datei nicht in diesem Ordner haben will, lege ich dort eine Batch-Datei hinein, die meine aufruft:

@echo off
title Datensicherung auf Netzwerk-Festplatte
c:
cd "C:\Users\Matthias\Documents\Dokumente\Systools"
call "DoBackup.bat"

Das aber nur so als Randbemerkung.
Nun möchte ich natürlich kontrollieren, ob das auch wunschgemäss funktioniert. Das geht aber nicht gut, weil Windows die Scripts standardmässig unsichtbar ausführt. Ich würde aber doch gern sehen, was passiert. Darum nehme ich die Gruppenrichtline, öffne den Ast Benutzerkonfiguration > Administrative Vorlagen > System > Skripts, doppelklicke auf Abmeldescript sichtbar ausführen und setze den Wert auf Aktiviert.
Nun sehe ich das Script, wie es ausgeführt wird.
Es gibt noch eine zweite Hürde. Shutdown-Scripts können das Herunterfahren massiv verzögern, weil Windows lange auf das wartet – es kann auch dazu kommen, dass Windows herunterfährt, bevor das Script fertig ausgeführt wurde. Das hat mit der Einstellung Maximale Wartezeit für Gruppenrichtlinienskripts zu tun, die beim Ast Computerkonfiguration > Administrative Vorlagen > System > Skripts zu finden ist. Dort lässt sich ein Wert zwischen 0 und 32000 eingeben; er definiert die Wartezeit in Sekunden. Standard sind 600 Sekunden (zehn Minuten). Bei 0 wartet Windows immer, bis das Script zu Ende ausgeführt wurde. Da ich voller Vertrauen bin, dass mein Script entweder richtig funktioniert oder mit einem Fehlerlog terminiert, setze ich den Wert auf 0.

Das wars mit dem Trick; der Beitrag ist hier zu Ende. Aber weil es sich um ein Nerdpost handelt, noch einige referenzielle Angaben:
Man kann über die Gruppenrichtlinie bei vier verschiedenen Gelegenheiten Scripts ausführen lassen: Beim Starten, beim Anmelden, beim Abmelden und beim Herunterfahren. Die Scripts zum Starten und Herunterfahren werden ausgeführt, wenn das Benutzerkonto noch nicht, bzw. nicht mehr geladen ist. Die Anmelde- und Abmelde-Scripts werden innerhalb eines Benutzerkontos ausgeführt.
In der Gruppenrichtlinie ist der Ast Computerkonfiguration zuständig für diejenigen Einstellungen, die für alle Benutzer gelten. Die Scripts zum Starten und Herunterfahren stecken unter unter Computerkonfiguration. In der Gruppenrichtlinie ist der Ast Benutzerkonfiguration zuständig für diejenigen Einstellungen, die für alle Benutzer gelten. Es ist also nichts als folgerichtig, dass die Scripts zum Starten und Herunterfahren ihrerseits unter Benutzerkonfiguration zu finden sind. Als Übersicht:

  1. Folgende Äste sind in der Gruppenrichtlinie für die Maschinenscripts relevant:
    • Computerkonfiguration > Windows-Einstellungen > Skripts (Start/Herunterfahren):
      Hier sind die Scripts für den Start und das Herunterfahren hinterlegt. Die Scriptdateien sind in den folgenden Ordnern zu deponieren:
      C:\Windows\System32\GroupPolicy\Machine\Scripts\Startup
      C:\Windows\System32\GroupPolicy\Machine\Scripts\Shutdown
    • Computerkonfiguration > Administrative Vorlagen > System > Skripts:
      Hier finden sich einige wichtige Konfigurationseinstellungen für die Scripts, zum Beispiel die Optionen Skripts zum Herunterfahren sichtbar ausführen und Maximale Wartezeit für Gruppenrichtlinienskripts.
  2. Folgende Äste sind in der Gruppenrichtlinie für die Benutzerscripts relevant:
    • Benutzerkonfiguration > Windows-Einstellungen > Skripts (Anmelden/Abmelden):
      Hier werden Anmelde- und Abmeldescripts eingerichtet. Die Scriptdateien selbst müssen in diesen Ordnern liegen:
      C:\Windows\System32\GroupPolicy\User\Scripts\Logon
      C:\Windows\System32\GroupPolicy\User\Scripts\Logoff
    • Benutzerkonfiguration > Administrative Vorlagen > System > Skripts:
      Hier findet man wiederum wichtige Optionen wie Abmeldeskripts sichtbar ausführen und Anmeldescripts sichtbar ausführen.

Ich empfehle, Benutzerscripts zu arbeiten. Für Maschinenscripts muss man genau über Windows Bescheid wissen, um beurteilen zu können, welche Operationen zulässig sind und welche nicht. Ausserdem beziehen sich die Dinge, die man als Privatanwender via Scripts erledigt, in aller Regel auf das Benutzerkonto, wie in unserem Beispiel mit dem automatischen Backup.
Und hier noch der Inhalt meiner Datei DoBackup.bat:

@echo off

echo BACKUP IS RUNNING
echo.

REM Shares verbinden (Netzwerk-Festplatte)
echo Verbindungen herstellen:
call DoConnect.bat

REM Abbruch, falls Festplatte nicht erreichbar
if not exist \\EDMINI\share\Datendepot\ goto NoDisk

REM Backup-Modus auswaehlen. Es wird 5 Sekunden gewartet und dann mit N gestartet
echo.
echo BACKUP-MODUS:
echo S = schnell
echo N = normal (mit Fotos und Musik)
echo V = voll (mit einfach allem!)
CHOICE /C SNV /T 5 /D N /M "Bitte Backup-Modus angeben! "
SET DoExtended=%ERRORLEVEL%

echo.
if %DoExtended% == 1 echo Schnelles Backup
if %DoExtended% == 2 echo Normales Backup
if %DoExtended% == 3 echo Voll-Backup

echo.
echo Sichern: Browser-Konfiguration
C:\Users\Matthias\Documents\Dokumente\Systools\Browserkonfiguration-Backup.wjf

echo.
echo Sichern: E-Mails als ZIP
C:\Users\Matthias\Documents\Dokumente\Systools\Mailbackup.wjf

echo.
echo Sichern: Dokumente
xcopy C:\Users\Matthias\Documents\*.* \\EDMINI\share\Datendepot\ /m /h /s /c /y

REM Daten, die beim vollen und normalen Backup gesichert werden.
if %DoExtended% == 1 Goto eof:

echo.
echo Sichern: Musik
xcopy C:\Users\Matthias\Music\*.* \\EDMINI\multimedia\MP3\ /m /h /s /c /y

REM Volles Backup
if %DoExtended% == 2 Goto eof:

Goto eof:

:NoDisk
echo Festplatte nicht gefunden!
date /t > C:\Users\Matthias\Documents\Fehler-Log.txt
time /t >> C:\Users\Matthias\Documents\Fehler-Log.txt
echo Backup-Festplatte nicht gefunden! >> C:\Users\Matthias\Documents\Fehler-Log.txt
ping -n 300 127.0.0.1 > nul
Goto eof:

:eof

Einige Erklärungen dazu:
DoConnect.bat verbindet die Netzwerkfestplatte, falls sie nicht vorhanden sein sollte.
xcopy kopiert alle Dateien, die verändert wurden oder neu hinzugekommen sind.
Der choice-Befehl fragt, ob das normale, das schnelle oder das vollständige Backup ausgeführt werden soll. Falls keine Eingabe erfolgt, wird das normale Backup ausgeführt.
Die wjf-Dateien sind übrigens WinZip-Jobs, die man mit WinZip Pro einrichtet. Die brauche ich zum inkrementellen Sichern einiger Dinge; ausserdem beschleunigen sie den Vorgang bei grossen Datenmengen, wo 100’000 oder mehr Dateien durchzusehen sind, massiv.
Der seltsame Ping-Befehl hält das Script bei Fehlern für kurze Zeit an, damit man die Fehlermeldung zur Kenntnis nehmen kann (oder auch nicht).

Autor: Matthias

Diese Website gibt es seit 1999. Gebloggt wird hier seit 2007.

4 Gedanken zu „Ich sag zum Abschied leise Batch-Datei“

  1. du solltest aber noch dazu schreiben, dass das mit dem ausführen beim herunterfahren nur funktioniert, wenn man professional oder höher hat, bei den home versionen von win 7 funktioniert das nicht. Da muss man erst mal die gruppenrichtlinien finden und dann bekommt nur die meldung, dass diese funktionen nicht in den home versionen verfügbar sind. Und mehr info gibts nicht.

  2. Herzlichen Dank für die Anleitung!

    Auch nach Jahren noch ein klasse Tipp, gerade was die Einstellung der maximalen Wartezeit für Gruppenrichtlinienskripts anbelangt.

    VG

Kommentar verfassen