darkhercules
Goto Top

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

Content-Key: 335233

Url: https://administrator.de/contentid/335233

Ausgedruckt am: 29.03.2024 um 00:03 Uhr

Mitglied: 132895
Lösung 132895 14.04.2017 aktualisiert um 13:36:19 Uhr
Goto Top
Steht hier zwar schon in x Threads aber na dann ...
gci c:\ordner -Directory | sort CreationTime -Desc | select -skip 2 | remove-item -force -recurse -verbose
Gruß
Mitglied: DarkHercules
DarkHercules 14.04.2017 um 14:35:05 Uhr
Goto Top
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.
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.

Ich entschuldige mich schon mal im Voraus, ich bin nicht so geübt mit Powershell.
Mitglied: 132895
Lösung 132895 14.04.2017 aktualisiert um 15:08:03 Uhr
Goto Top
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.
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 face-smile
Mitglied: DarkHercules
DarkHercules 14.04.2017 um 15:19:14 Uhr
Goto Top
Und wo muss ich den -exclude Parameter einbauen, oder ist das völlig egal. Und dahinter dann einfach die Namen des Ordners, oder?
Mitglied: 132895
Lösung 132895 14.04.2017 aktualisiert um 15:22:18 Uhr
Goto Top
Mitglied: DarkHercules
DarkHercules 14.04.2017 um 16:29:47 Uhr
Goto Top
Ja danke