BackupAssist ER: Den Computer nach der Datensicherung herunterfahren

Seit Version 1.2.1 von BackupAssist ER ist es möglich, mit Hilfe der Skript-Unterstützung einen Möglichkeit zu schaffen, den Computer nach der Datensicherung herunterzufahren.

Bislang war es lediglich möglich sozusagen auf gut Glück den Computer zu einem festgelegten Zeitpunkt mittels Windows-Aufgabe herunterzufahren, mitunter würgte man dabei allerdings die Datensicherung ab. Geschickter war und ist es, gezielt darauf zu prüfen ob die Datensicherung abgeschlossen ist und erst dann den Computer herunterzufahren.

Dieses Thema ist in der Regel nur für Arbeitsplätze interessant, die beispielsweise über Nacht oder an Wochenenden eine Datensicherung ausführen, dennoch zeigt dies Möglichkeiten der neu hinzugekommenen Skript-Unterstützung auf.

Wie bereits im “Update-Beitrag” (eingangs verlinkt) bemerkt, sollte man den “shutdown”-Befehl nicht direkt nach der Datensicherung ausführen, denn der Job ist zu diesem Zeitpunkt noch nicht vollständig abgeschlossen und die Sicherung in die Cloud noch gar nicht erfolgt. Der Trick besteht nun darin, nach der lokalen Datensicherung ein Skript zu starten, das auf den Abschluss des Cloud-Backup-Jobs wartet. Die notwendigen Schritt hierzu sehen wie folgt aus:

  • Den Backup-Job bearbeiten.
  • Im Abschnitt “Skripte” bei “Nach jedem Backup ausführen” folgenden Befehl (angepasst auf die eigene Umgebung) einfügen:
    start "" /d "C:\Skripte" shutdown-after-backup.cmd

    Bemerkung: An dieser Stelle muss zwingend “start” statt direkt das Skript oder “call” zum Einsatz gebracht werden, damit die Prüfung auf den Abschluss der Datensicherung (insgesamt) weiter im Hintergrund laufen kann, auch wenn die lokale Sicherung bereits abgeschlossen ist.

  • Die Änderung speichern.

Nun legt man z.B. unter “C:\Skripte” das Skript “shutdown-after-backup.cmd” mit folgendem Inhalt an:

@echo off

rem Konfiguration

 rem 5 Minuten
  set Period=300000

 set JobResult=Backup-Job Job (1) - S3-kompatible Cloud-Speicherung wurde erfolgreich

rem Das Ereignisprotokoll auswerten. Wird der zuvor konfigurierte Text in der angegebenen Zeit gefunden, dann den Computer herunterfahren.

:loop

 wevtutil qe Application /q:"*[System[Provider[@Name='BackupAssist'] and (EventID=5633) and TimeCreated[timediff(@SystemTime) <= %Period%]]]" /c:1 /f:text /rd:true | find "%JobResult%"

 if %errorlevel%==0 (
  timeout /t 300 /nobreak
  shutdown /s /f /t 0
  goto exitloop
 )

timeout /t 60 /nobreak
goto loop

:exitloop

Anpassen muss man die Variable “JobResult”, damit diese zum eigenen Job-Namen und Cloud-Ziel passt. Am einfachsten gelangt man zum passenden Text, in man den Job zunächst ohne Skript ausführt und dessen Ende abwartet um dann im Ereignisprotokoll von Windows aus folgenden Eintrag diesen entnehmen zu können:

Protokollname: Application
Quelle: BackupAssist
Datum: 14.09.2021 07:49:45
Ereignis-ID: 5633
Aufgabenkategorie:Keine
Ebene: Informationen
Schlüsselwörter:Klassisch
Benutzer: Nicht zutreffend
Computer: w10-cloud-backup
Beschreibung:
Backup-Job Job (1) - S3-kompatible Cloud-Speicherung wurde erfolgreich ausgeführt.

Ziel: S3-kompatibles Bucket
Byte: 25244850185
Dateien: 285487
Startzeit: 14.09.2021 07:10:10
Ende um: 14.09.2021 07:49:33
Dauer: 00:39:22.8116678

Job Execution ID: 2.60

In der Variablen wurde bewusst

Backup-Job Job (1) - S3-kompatible Cloud-Speicherung wurde erfolgreich

statt

Backup-Job Job (1) - S3-kompatible Cloud-Speicherung wurde erfolgreich ausgeführt.

verwendet, da der Umlaut zu Schwierigkeiten bei der Auswertung geführt hat, was kurzfristig selbst mit dem Einsatz von “chcp” (Codepage ändern) nicht zu lösen war.

Das Skript prüft ob in einem festgelegten Zeitraum (Period) ein entsprechender Eintrag im Ereignisprotokoll vorhanden ist. Wenn dies zutrifft wird die Bedingung (if…) wahr und der Computer wird heruntergefahren.

Die Pause (timeout…) innerhalb der Bedingung ist zur Sicherheit vorhanden, damit BackupAssist ER noch die Möglichkeit hat ggf. den Bericht oder weiteres abzuschließen. Die Pause unterhalb der Bedingung ist vorhanden, damit die Schleife (loop) nicht sofort von vorne beginnt.

Aufpassen muss man nur beim manuellen Ausführen (während der Arbeitszeit) des Jobs, denn das System fährt ohne weitere Nachfrage oder Hinweis herunter!

Bemerkung: Man könnte das Skript auch mittels Windows-Aufgabe ausführen lassen. Mir persönlich hat der Weg über den Backup-Job allerdings besser gefallen, denn so ist leichter erkennbar, das so etwas überhaupt konfiguriert ist bzw. man muss nicht an mehreren unterschiedlichen Stellen nachsehen. Den “timeout”- vor dem “shutdown”-Befehl kann weglassen und stattdessen “shutdown /s /f /t 300” verwenden.

Update 17.09.2021

Anbei eine erweiterte Fassung des Skripts. Neu hinzugekommen ist die Möglichkeit ein Zeitfenster zu konfigurieren, in dem der Computer nicht heruntergefahren werden darf. So verhindert man, falls die Datensicherung und/oder das Cloud-Backup mal länger braucht, das der Computer innerhalb der Arbeitszeit “plötzlich” herunterfährt. Ausschlaggebend sind die beiden Variablen

  • timeframestart
  • timeframeend

die von x Uhr bis y Uhr (jeweils nur volle Stunde), z.B. von 08:00 Uhr morgens bis 20:00 Uhr abends, festlegt, wann kein Herunterfahren ausgeführt werden darf.

@echo off

rem Konfiguration

 rem Das Zentfenster definieren, in dem kein Herunterfahren erfolgen soll
  set timeframestart=8
  set timeframeend=20
 
rem Variablen definieren bzw. zuruecksetzen

 set tfstart=0
 set tfend=0

rem Das Zeitfenster festlegen, in dem nach neuen Ereignissen geprueft werden soll

 rem 5 Minuten
  set Period=300000

rem Den Text des Ereignisses (ohne Umlaute!) festlegen, das signalisiert, dass das Cloud-backup abgeschlossen ist

 set JobResult=Backup-Job Job (1) - S3-kompatible Cloud-Speicherung wurde erfolgreich

rem Das Ereignisprotokoll auswerten. Wird der zuvor konfigurierte Text in der angegebenen Zeit gefunden, dann den Computer herunterfahren.

:loop

 wevtutil qe Application /q:"*[System[Provider[@Name='BackupAssist'] and (EventID=5633) and TimeCreated[timediff(@SystemTime) <= %Period%]]]" /c:1 /f:text /rd:true | find "%JobResult%"

 if %errorlevel%==0 (
  timeout /t 300 /nobreak
  REM shutdown /s /f /t 0
  goto exitloop
 )

timeout /t 60 /nobreak
goto loop

:exitloop

rem Die Uhrzeit auslesen und ein eine Variable schreiben
 
 set hh=%time:~0,2%

rem Das Zeitfenster pruefen
 
 if %hh% geq %timeframestart% set tfstart=1
 if %hh% leq %timeframeend% set tfend=1

rem Das Ergebnis der Bedingungen addieren

 set /a result=%tfstart% + %tfend%
 
 rem 0 oder 1 bedeutet innerhalb des Zeitfensters, also kein Herunterfahren
 rem 2 bedeutet ausserhalb des Zeitfensters, also den Computer herunterfahren
 
 if %result% leq 1 (
  shutdown /s /f /t 0
  )

2 Kommentare

  1. Rüdiger Heide

    Hallo Herr Weber,
    bin mal wieder auf Ihrem Blog fündig geworden bzw. habe ein ähnliches Problem:
    Auf einem PC läuft BackupAssist Classic. Der PC wird nach den Backups (Mo-Fr abends) heruntergefahren.
    Jetzt soll der PC übers Wochenende Remote genutzt werden und darf Freitags nach der Sicherung nicht mehr heruntergefahren werden.
    Habe schon mit Ebertlang kommuniziert, die hatten empfohlen das über den Windows -Taskplaner über die Ereignis-ID von BackupAssist zu machen. Aber das geht dann nicht Wochentag bezogen. Der Windows Taskplaner kann ja nur Ereignis- oder Zeitplan-bezogen triggern.
    Haben oder kennen Sie ein Script, das den PC abhängig vom Wochentag heruterfährt, das man aus BackupAssist aufrufen kann?

    Danke und Gruß
    Rüdiger Heide

  2. Andy

    Hallo Herr Heide,

    ich würde das nach wie vor als Skript aus dem Job heraus machen (ähnlich wie im Beitrag beschrieben).

    Ein Batch-Klassiker um auf den Wochentag zu kommen wäre das hier:

    rem Wochentag auslesen

    for /f %%g in ('wmic path win32_localtime get dayofweek^|findstr /v /r "^$"') do (set Weekday=%%g)

    if %Weekday%==0 set Weekday=Sunday
    if %Weekday%==1 set Weekday=Monday
    if %Weekday%==2 set Weekday=Tuesday
    if %Weekday%==3 set Weekday=Wednesday
    if %Weekday%==4 set Weekday=Thursday
    if %Weekday%==5 set Weekday=Friday
    if %Weekday%==6 set Weekday=Saturday

    Anschließend kann man die Variable “Weekday” auswerten und dann entscheiden wie es weitergeht, z.B.

    if %Weekday%==Friday exit
    if %Weekday%==Saturday exit
    if %Weekday%==Sunday exit

    Aber Achtung: wmic ist abgekündigt, daher ist es besser das nun per PowerShell zu realisieren:

    https://learn.microsoft.com/de-de/powershell/scripting/learn/ps101/07-working-with-wmi?view=powershell-7.4

    https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/get-date?view=powershell-7.4

    Get-Date -Format "dddd"

    liefert den Wochentag in der Systemsprache, also z.B. in deutsch.

    Hoffe das hilft. Ansonsten mal direkt bei mir melden und wir arbeiten zusammen etwas aus.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

© 2024 Andy's Blog

Theme von Anders NorénHoch ↑