Powershell: Backupscript
HejJeg vil starte med at undskylde, det her bliver en lidt længere post. Jeg håber at nogen har tålmodighed nok til at læse det hele.
Da jeg altid har lært at man skal give så meget info som muligt, for at sikre at man får den hjælp, man håber på, vil jeg forsøge på det.
Jeg har minimal erfaring med scripts, så al forklaring modtages med stor tak.
Jeg prøver på at finde en løsning til simpel backup.
De fleste af brugerne er godt oppe i årene og har ikke det store kendskab til PC'ere
Det skal være en "med livrem, seler og en snor" løsning, gerne med et interface til den brugerinteraktion der er nødvendig, men nogle få popups eller deromkring kan også gøre det.
Det er en simpel kopier alt backup, ikke noget fancy, bare klik ikonet på skrivebordet og følg anvisningerne
Jeg tænkte jeg ville bruge robocopy da den kan forsøge flere gange.
Jeg har forsøgt mig lidt og mener at have flikket noget kludekode sammen, men det meste er totalt volapyk når jeg forsøger at finde ud af noget, så her er jeg :-)
Nederst i denne post er hvad jeg selv har flikket sammen ved at planke på det der indernet.
Her er hvad jeg havde forestillet mig der sker når en bruger klikker på ikonet:
1. Der undersøges om den rette HDD er isat.
Hvis nej, Brugeren bedes om at isætte den rette HDD via en popup
2. Der undersøges om folderen BACKUP_Dagsdato eksisterer på HDD,
ellers lave den.
Hvis ja, spørge om bruger ønsker at lave endnu en backup, hvor der så
bare kopieres oveni uden at spørge.
3. Der undersøges om folderen LOGS eksisterer på HDD, ellers oprette den.
4. Slette ældste backupfolder hvis der 12. 1 år må være fint til alm.
mennesker. Sikkert overkill.
5. Undersøge om der er plads til de ønskede filer på backup HDD.
Jeg ved ikke om man kan ovenstående? Ellers bare undersøge om der er
lad os sige 50GB fri plads, de færreste af de brugere der skal bruge
scriptet har 50GB data. Jeg kan jo altid rette lidt til.
6. Filerne fra brugerfolderne Dokumenter, Billeder, Musik og Video +
brugerprofil kopieres. Har jeg glemt noget?
Hvis ikke standardfolderne er flyttet kan jeg så bare kopiere
Brugerfolderen med nogle Robocopy parametre a la
nedenstående?
Robocopy "C:\Users\Bruger" "BACKUPHDD:\BACKUP_$dateStr" /MIR /XA:SH /XD AppData /XJD /R:3 /W:15 /MT /V /LOG: BRUGERHDD:\LOGS BACKUP_$dateStr.log
Det skulle gerne undgå skjulte- og systemfiler med 3 gentagne forsøg på kopiering og tilføj til log hvis allerede eksisterende.
7. Skub BACKUPHDD sikkert ud. Det skulle gerne sikre at alt er kopieret.
Ellers er jog meget modtagelig for forslag til sikring af at alt er kopieret og
gemt.
8. Popup med lyd når backup er 100% færdig.
Mine spørgsmål til punkterne ovenfor:
1a. Kan man undersøge om en bestemt HDD er isat - HDD navn eller
serienummer.
HDD vil blive forsynet med en label, men jeg vil gerne forsøge at tage
højde for det meste. F.eks. at label falder af.
1b. Kan dirigere Robocopy til at bruge dette drev via PowerShell. (HDD navn
eller serienummer)
Evt. ved at finde drevbogstavet på en eller anden måde.
Hvis ikke, skal der komme en popup med anvisninger a la "Isæt
harddisken BACKUP"
1c. Kan man styre Fonttype og/eller attributter i popups via Powershell?
De fleste af brugerne er gamle svagtseende mennesker så større font og
evt. fed skrift ville nok være godt.
1d. Kan man styre popup vinduets størrelse via Powershell?
2a. Undersøge om folderen BACKUP_Dagsdato er til stede.
I tilfælde af at de allerede har kørt backup een gang den dag.
Hvis ja, spørge om de vil køre backup endnu en gang
2b. Lave en popup med valgmuligheder. Jeg har flikket noget sammen
nederst i denne post.
2c. Kan man styre farver i popups, evt. forsk. farve på knapperne?
3a. Mener selv at have klaret den del, se mit forsøg længere nede.
4a. Slette ældste backupfolder hvis der 12.
Tror det er noget med version og sortering, men jeg gik i sort på det.
5a. Kan man undersøge om der plads til det man ønsker at kopiere via
Robocopy/Powershell?
Jeg ved ikke om man kan ovenstående? Ellers bare undersøge om der er
lad os sige 50GB fri plads.
De færreste af de brugere der skal bruge scriptet har 50GB data. Jeg kan
jo altid rette lidt til.
5b. Hvis der ikke er plads, slette den ældste backup og lave den nye.
Også her ville en popup med valgmulighed være ønskværdigt, så
brugeren selv tager beslutningen.
Se mit forsøg nederst i denne post.
6a. Hvis standard brugerfoldere er flyttet, hvordan få jeg så
Robocopy/Powershell til at lave f.eks. Dokumenter,
i stedet for blot at kopiere indholdet af Dokumenter. Jeg kunne ikke lige
se der var et parameter til det.
6b. Kan man lave en visuel representation af selve kopieringen ville det være
dejligt.
Det behøver ikke at være 100% korrekt, det er mere så bruger kan se der
sker noget.
Måske noget i stil med Windows egen kopieringsboks hvis muligt.
7a. Kan man skubbe en HDD sikkert ud via Powershell. Sikring af filer er
kopieret inden HDD fjernes.
8a. Det skulle jeg osgå gerne selv have fundet ud af. Se mit forsøg lidt
længere nede.
9a. Hvordan får jeg skidtet til at køre fra en ikon på skrivebordet?
9b. Jeg ville gerne undersøge om ikonet/scriptet har været aktiveret den
sidste måned, hvis ikke skal der komme en popup med en reminder.
9c. Kan jeg undgå at bruger ser noget som helst til script eller Powershell,
bare en eller anden boks på skærmen?
Her er hvad jeg har kunnet finde ud af selv, det virker umiddelbart, men jeg ved ikke om det er den korrekte måde at gøre det på.
$today = (get-date).Date
$dateStr = '{0: dd-MM-yyyy}' -f $today
$path = "BACKUPHDD:\BACKUP\LOGS"
If(!(test-path $path))
{
New-Item -ItemType Directory -Force -Path $path
}
$path = "BACKUPHDD:\BACKUP_$dateStr"
If(!(test-path $path))
{
New-Item -ItemType Directory -Force -Path $path
}
Robocopy "C:\Users\Brugernavn" "BACKUPHDD:\BACKUP_$dateStr" /MIR /XA:SH /XD AppData /XJD /R:5 /W:15 /MT /V /LOG+:BACKUPHDD:\LOGS\BACKUP_$dateStr.log
[console]::beep(900,400)
[console]::beep(900,400)
$wshell = New-Object -ComObject Wscript.Shell
$wshell.Popup("Din backup er færdig. Du kan nu fjerne den eksterne harddisk.",0,"BACKUP FÆRDIG",0x1)
Multiple choice popup til 5b, kun ment som eksempel.
$Title = "BACKUP"
$Info = "Der er ikke plads på disken BACKUPHDD, hvad vil du gøre for at løse det?"
$options = [System.Management.Automation.Host.ChoiceDescription[]] @("&Slet den ældste backup og fortsæt", "&Kontakt admin og køb en ny disk", "&Afslut")
[int]$defaultchoice = 1
$opt = $host.UI.PromptForChoice($Title , $Info , $Options,$defaultchoice)
switch($opt)
{
0 { Write-Host "Slet den ældste backup og fortsæt" }
1 { Write-Host "Købe en ny disk" }
2 { Exit }
}
Jeg ville gerne ved valg 0 slette den ældste backup og lave en ny
Har jeg glemt noget?
Håber der nogen der har læst med hertil.
Al hjælp modtages med kyshånd.
PFT
Hansemand