Softwareentwickler / Software Developer
Bild von einem USB Stick in einem Computer

Automatisierte Back-Ups | Datensicherung auf externer Festplatte

Um mich vor Datenverlust zu schützen, mache ich regelmäßig Back-Ups meiner Daten. Als ein Teil meiner Datensicherung spiele ich die wichtigen Daten wie zum Beispiel Bilder oder Dokumente regelmäßig auf eine externe Festplatte. Was mich dabei immer gestört hat war das manuelle Übertragen dieser Dateien. Daher habe ich versucht, möglichst viele Schritte von diesem Prozess zu automatisieren.

Im ersten Schritt habe ich ein Powershell-Skript geschrieben, dass mir diese manuelle Tätigkeit des Kopierens abgenommen hat. Dies habe ich auf dem USB-Gerät gespeichert und bei Bedarf gestartet.

$backupParentFolder = "D:\Backup"
$backupFolder = $backupParentFolder + (Get-Date -format "dd MMMM yyyy")
$foldersForBackup = @("Z:\Music", "Z:\Documents", "Z:\Pictures", "Z:\Videos")

New-Item -ItemType directory -Path $parentDirectory

foreach ($path in $foldersForBackup) {
    Copy-Item -Path $path -Destination $parentDirectory -Recurse
}

Get-ChildItem $backupParentFolder |
  ? { $_.PSIsContainer } |
  Remove-Item -Exclude $backupFolder -Recurse -Force

Zuerst wird ein neuer Ordner mit dem aktuellen Datum als Namen angelegt. In diesen werden anschließend ausgewählte Ordner von meinem Computer hineinkopiert. Am Ende werden die alten Back-Ups gelöscht. Bei Bedarf kann man das Skript auch so umschreiben, dass eine bestimmte Anzahl von älteren Back-Ups ebenfalls erhalten bleibt.

Zwar fiel dadurch ein Großteil der Arbeit weg, aber ich musste das Skript immer noch eigenständig starten. Das Back-Up soll aber durchgeführt werden, sobald ich die Festplatte an den PC anschließe. Warum also nicht noch weiter automatisieren?

Dazu habe ich ein Skript auf Stackoverflow gefunden. Leider finde ich die exakte Quelle nicht mehr wieder.

#Requires -version 2.0
Register-WmiEvent -Class win32_VolumeChangeEvent -SourceIdentifier 
volumeChange
write-host (get-date -format s) " Beginning script..."
do{
$newEvent = Wait-Event -SourceIdentifier volumeChange
$eventType = $newEvent.SourceEventArgs.NewEvent.EventType
$eventTypeName = switch($eventType)
{
1 {"Configuration changed"}
2 {"Device arrival"}
3 {"Device removal"}
4 {"docking"}
}
write-host (get-date -format s) " Event detected = " $eventTypeName
if ($eventType -eq 2)
{
$driveLetter = $newEvent.SourceEventArgs.NewEvent.DriveName
$driveLabel = ([wmi]"Win32_LogicalDisk='$driveLetter'").VolumeName
write-host (get-date -format s) " Drive name = " $driveLetter
write-host (get-date -format s) " Drive label = " $driveLabel
# Execute process if drive matches specified condition(s)
if ($driveLetter -eq 'D:' -and $driveLabel -eq 'DRIVE-N-GO')
{
write-host (get-date -format s) " Starting task in 3 seconds..."
start-sleep -seconds 3
start-process "D:\test.ps1"
}
}
Remove-Event -SourceIdentifier volumeChange
} while (1-eq1) #Loop until next event
Unregister-Event -SourceIdentifier volumeChange

Hierbei wird registriert, wenn ein USB-Gerät angeschlossen oder rausgezogen wird.

Es muss lediglich in Zeile 23 in der if-Abfrage der Laufwerksbuchstabe und der Gerätename sowie der zu startende Prozess in Zeile 27 verändert werden.  Dieses Skript soll nun als sogenannte Aufgabe in der Windows Aufgabenplanung eingetragen werden.

Unter “Aktion” in der oberen Leiste findet man den Punkt “Einfache Aufgabe erstellen”. Zuerst soll ein Name der Aufgabe und eine Beschreibung eingegeben werden. Klickt man dann auf weiter, wird man aufgefordert, einen Trigger auszuwählen, also wann die Aufgabe ausgeführt werden soll. Da die Aufgabe das Skript aufruft, mit dem das USB-Gerät erkannt und das Back-Up angestoßen wird, habe ich “Beim Start des Computers” gewählt. Als Aktion soll dann ein Programm gestartet werden. Dort wird der Pfad zu dem Skript angegeben. Anschließend muss diese EIngabe noch einmal bestätigt werden. Nach einem Neustart des Computer sollte sich dann ein Konsolenfester mit dem Text “Beginning script…” öffnen. Schließt man ein USB-Gerät an, wird dies in dem Konsolenfenster protokolliert und handelt es sich dabei um das gewünschte Device, so wird der Back-Up-Prozess gestartet.

Problembehandlung

Bei mir ist das Problem aufgetreten, dass das Powershell-Skript, dass ich in die Aufgabe eingetragen habe, beim Systemstart nicht ausgeführt, sondern lediglich in einem Text-Editor geöffnet wurde. Da ich den Grund dafür nicht finden konnte, habe ich noch einen weiteren Schritt getätigt und die .ps1 in eine .exe-Datei umgewandelt. Hierfür habe ich PS2EXE GUI verwendet.

Nachdem die zip-Datei heruntergeladen und entpackt wurde, muss man mit der Konsole in das Verzeichnis wechseln.

Dort führt man das Skript “ps2exe.ps1” aus und übergibt die umzuwandelnde Datei sowie den Ausgabepfad als Parameter und erhält die ausführbare Datei.

Diese wird dann in der Aufgabenplanung als Aktion eingetragen.

Fandet ihr den Artikel hilfreich oder kennt ihr noch bessere Alternativen, um einen solchen Prozess automatisch durchzuführen? Dann hinterlasst gerne einen Kommentar!

Schreibe einen Kommentar

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

4 Gedanken zu “Automatisierte Back-Ups | Datensicherung auf externer Festplatte”