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 )
Verheiratet, Vater von zwei Kindern, eines an der Hand, eines im Herzen. Schon immer Technik-Freund, seit 2001 in der IT tätig und seit über 10 Jahren begeisterter Blogger. Mit meiner Firma IT-Service Weber kümmern wir uns um alle IT-Belange von gewerblichen Kunden und unterstützen zusätzlich sowohl Partner als auch Kollegen.
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
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.