Backup-Script erweitern mit automatischer bereinigung
Hallo,
Ich sichere meine Hyper-V-Testumgebung momentan mit einem Powershell-Script.
Dabei wird mir ein Ordner gesichert in dem ich meine ganzen ISOs und Treiber für den Hyper-V-Host speichere.
Dies passiert mit einem Robocopy-Job, der mir den ganzen Ordner auf eine Externe Festplatte schreibt.
Dieser Robocopy-Job macht mir auch ein Protokoll, welches ich in einen 2. Ordner schreibe, welchen ich im Anschluss mit einem 2. Robocopy-Job auch auf die externe Festplatte sichere.
Als letztes Exportiert mir das Powershell-Script meine ganzen virtuellen Machinen in einen Ordner, auf der Externen Festplatte, welchen ich mit "Server-Sicherung-Aktuelles-Datum" bennne.
Dies bedeutet, das ich auf der Externen Festplatte, (habe 2 davon, die ich immer abwechselnd anstecke) mehrere Ordner habe:
- 1 Ordner: Backup-Log (wo das Backup-Log hingespeichert wird)
- 1 Ordner: HV-Daten (wo die ISOs und Treiber drin sind, welche ich nur am Hyper-Visor brauche)
- 3 Ordner: Server-Sicherung-Aktuelles Datum
Nun möchte ich, dass ich nicht immer den ältesten Ordner, wo die virtuellen Maschinen reingespeichert werden, per Hand löschen muss, sondern dass mir das das Script auch autom. erledigt.
Die externe Festplatte ist groß genug, dass 3 Sicherungen der virtuellen Maschinen drauf passen, neben der anderen 2 Ordner.
kann man nun irgendwie in das Script mit einbauen, dass es mir immer den ältesten der 3 Server-Sicherungs Ordner löscht, bevor die Sicherung läuft? oder das man es am Datum festmacht, dass es z.B. den Ordner löscht, der älter als 6 Tage ist. (es ist ja das Datum, als der Ordner erstellt wurde, im Namen mit drin. ich möchte nur nicht, dass die 2 Ordner der Robocopy-Jobs auch gelöscht werden.
Ich danke im Voraus schon mal für die Hilfe wie man sowas bewerkstelligen kann.
PS: nicht wundern, ich weis dass man die virtuellen Maschinen auch ohne sie vorher zu beenden sichern kann, hatte da aber schon einmal das Problem, dass sich der Exchange nicht mehr starten lies, nachdem ich ihn wiederhergestellt habe, das lag wohl daran, dass ich ihn online gesichert habe, wenn ich ihn nämlich zuvor herunterfahre, funktioniert das wiederherstellen problemlos. Daher fahre ich momentan alle Maschinen immer vorher herunter.
Mein Hypervisor, auf welchem das Script ausgeführt wird, ist übrigens ein Windows Server 2016.
Anbei noch das Script, wie es momentan ausschaut:
$id=[System.Security.Principal.WindowsIdentity]::GetCurrent()
$principal=New-Object System.Security.Principal.WindowsPrincipal($id)
if(!$principal.IsInRole([System.Security.Principal.WindowsBuiltInRole]::Administrator)) {
$powershell=[System.Diagnostics.Process]::GetCurrentProcess()
$psi=New-Object System.Diagnostics.ProcessStartInfo $powershell.Path
$script=$MyInvocation.MyCommand.Path
$prm=$script
foreach($a in $args) {
$prm+=' '+$a
}
$psi.Arguments=$prm
$psi.Verb="runas"
[System.Diagnostics.Process]::Start($psi) | Out-Null
return;
}
robocopy D:\HV-Daten F:\HV-Daten /copyall /mir /B /E /EFSRAW /Unilog+:D:\Backup-Log\Robocopy_$(get-date -f yyyy-MM-dd).log
robocopy D:\Backup-Log F:\Backup-Log /copyall /mir /B /E /EFSRAW
Stop-VM Win10-Virtual -Force
Stop-VM Win7-Virtual -Force
Stop-VM Owncloud -Force
Stop-VM APP01 -Force
Stop-VM EX01 -Force
Stop-VM FS01 -Force
Export-VM Owncloud F:\Server-Sicherung-$(get-date -f yyyy-MM-dd)\
Export-VM FS01 F:\Server-Sicherung-$(get-date -f yyyy-MM-dd)\
Export-VM APP01 F:\Server-Sicherung-$(get-date -f yyyy-MM-dd)\
Export-VM EX01 F:\Server-Sicherung-$(get-date -f yyyy-MM-dd)\
Export-VM Win10-Virtual F:\Server-Sicherung-$(get-date -f yyyy-MM-dd)\
Export-VM Win7-Virtual F:\Server-Sicherung-$(get-date -f yyyy-MM-dd)\
Start-VM FS01
sleep -Seconds 300
Start-VM Owncloud
sleep -Seconds 300
Start-VM APP01
sleep -Seconds 300
Start-VM EX01
Ich sichere meine Hyper-V-Testumgebung momentan mit einem Powershell-Script.
Dabei wird mir ein Ordner gesichert in dem ich meine ganzen ISOs und Treiber für den Hyper-V-Host speichere.
Dies passiert mit einem Robocopy-Job, der mir den ganzen Ordner auf eine Externe Festplatte schreibt.
Dieser Robocopy-Job macht mir auch ein Protokoll, welches ich in einen 2. Ordner schreibe, welchen ich im Anschluss mit einem 2. Robocopy-Job auch auf die externe Festplatte sichere.
Als letztes Exportiert mir das Powershell-Script meine ganzen virtuellen Machinen in einen Ordner, auf der Externen Festplatte, welchen ich mit "Server-Sicherung-Aktuelles-Datum" bennne.
Dies bedeutet, das ich auf der Externen Festplatte, (habe 2 davon, die ich immer abwechselnd anstecke) mehrere Ordner habe:
- 1 Ordner: Backup-Log (wo das Backup-Log hingespeichert wird)
- 1 Ordner: HV-Daten (wo die ISOs und Treiber drin sind, welche ich nur am Hyper-Visor brauche)
- 3 Ordner: Server-Sicherung-Aktuelles Datum
Nun möchte ich, dass ich nicht immer den ältesten Ordner, wo die virtuellen Maschinen reingespeichert werden, per Hand löschen muss, sondern dass mir das das Script auch autom. erledigt.
Die externe Festplatte ist groß genug, dass 3 Sicherungen der virtuellen Maschinen drauf passen, neben der anderen 2 Ordner.
kann man nun irgendwie in das Script mit einbauen, dass es mir immer den ältesten der 3 Server-Sicherungs Ordner löscht, bevor die Sicherung läuft? oder das man es am Datum festmacht, dass es z.B. den Ordner löscht, der älter als 6 Tage ist. (es ist ja das Datum, als der Ordner erstellt wurde, im Namen mit drin. ich möchte nur nicht, dass die 2 Ordner der Robocopy-Jobs auch gelöscht werden.
Ich danke im Voraus schon mal für die Hilfe wie man sowas bewerkstelligen kann.
PS: nicht wundern, ich weis dass man die virtuellen Maschinen auch ohne sie vorher zu beenden sichern kann, hatte da aber schon einmal das Problem, dass sich der Exchange nicht mehr starten lies, nachdem ich ihn wiederhergestellt habe, das lag wohl daran, dass ich ihn online gesichert habe, wenn ich ihn nämlich zuvor herunterfahre, funktioniert das wiederherstellen problemlos. Daher fahre ich momentan alle Maschinen immer vorher herunter.
Mein Hypervisor, auf welchem das Script ausgeführt wird, ist übrigens ein Windows Server 2016.
Anbei noch das Script, wie es momentan ausschaut:
$id=[System.Security.Principal.WindowsIdentity]::GetCurrent()
$principal=New-Object System.Security.Principal.WindowsPrincipal($id)
if(!$principal.IsInRole([System.Security.Principal.WindowsBuiltInRole]::Administrator)) {
$powershell=[System.Diagnostics.Process]::GetCurrentProcess()
$psi=New-Object System.Diagnostics.ProcessStartInfo $powershell.Path
$script=$MyInvocation.MyCommand.Path
$prm=$script
foreach($a in $args) {
$prm+=' '+$a
}
$psi.Arguments=$prm
$psi.Verb="runas"
[System.Diagnostics.Process]::Start($psi) | Out-Null
return;
}
robocopy D:\HV-Daten F:\HV-Daten /copyall /mir /B /E /EFSRAW /Unilog+:D:\Backup-Log\Robocopy_$(get-date -f yyyy-MM-dd).log
robocopy D:\Backup-Log F:\Backup-Log /copyall /mir /B /E /EFSRAW
Stop-VM Win10-Virtual -Force
Stop-VM Win7-Virtual -Force
Stop-VM Owncloud -Force
Stop-VM APP01 -Force
Stop-VM EX01 -Force
Stop-VM FS01 -Force
Export-VM Owncloud F:\Server-Sicherung-$(get-date -f yyyy-MM-dd)\
Export-VM FS01 F:\Server-Sicherung-$(get-date -f yyyy-MM-dd)\
Export-VM APP01 F:\Server-Sicherung-$(get-date -f yyyy-MM-dd)\
Export-VM EX01 F:\Server-Sicherung-$(get-date -f yyyy-MM-dd)\
Export-VM Win10-Virtual F:\Server-Sicherung-$(get-date -f yyyy-MM-dd)\
Export-VM Win7-Virtual F:\Server-Sicherung-$(get-date -f yyyy-MM-dd)\
Start-VM FS01
sleep -Seconds 300
Start-VM Owncloud
sleep -Seconds 300
Start-VM APP01
sleep -Seconds 300
Start-VM EX01
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 335233
Url: https://administrator.de/contentid/335233
Ausgedruckt am: 25.11.2024 um 22:11 Uhr
6 Kommentare
Neuester Kommentar
Steht hier zwar schon in x Threads aber na dann ...
Gruß
gci c:\ordner -Directory | sort CreationTime -Desc | select -skip 2 | remove-item -force -recurse -verbose
Zitat von @DarkHercules:
Wenn ich das richtig verstehe, geht man damit in einen Ordner, sortiert die darin enthaltenen Ordner nach dem Änderungsdatum, überspringt die obersten 2 und löscht den nächsten, oder?
Fast richtig, nur das Datum ist das Erstelldatum des Ordners.Wenn ich das richtig verstehe, geht man damit in einen Ordner, sortiert die darin enthaltenen Ordner nach dem Änderungsdatum, überspringt die obersten 2 und löscht den nächsten, oder?
wie kann ich jetzt sagen, dass er mir die bestimmten 2 Ordner (HV-Daten und Backup-Log) garantiert nicht löscht, wenn deren Änderungsdatum jetzt das gleiche Änderungsdatum hat, wie der älteste der 3 Server-Sicheruns Ordner. Man müsste ja erst einmal diese 2 Ordner ausklammern, die anderen nach dem Datum Sortieren und den ältesten der 3 Ordner löschen.
Dafür gibt's den -Exclude Parameter von Get-Childitem (gci)Durch das, dass die Ordner ihr Erstelldatum im Namen haben, könnte man evtl. ja das verwenden, wenn das hilft, oder verstehe ich da was falsch und dein Script funktioniert auch so.
Kann man auch, aber das Erstelldatum des Ordners sollte hier ja auch genügen.Ich entschuldige mich schon mal im Voraus, ich bin nicht so geübt mit Powershell.
Dann üb mal schön weiter