Skip to content

Instantly share code, notes, and snippets.

@sartimo
Created December 18, 2021 08:46
Show Gist options
  • Save sartimo/2c9a8beb910fe9fd41990c984089e36e to your computer and use it in GitHub Desktop.
Save sartimo/2c9a8beb910fe9fd41990c984089e36e to your computer and use it in GitHub Desktop.
Our solution for the M122 project
<#
# Copyright 2021 - 2022 Timo Sarkar & Aaron Camenzind
# Redistribution des Codes ohne Genehmigung nicht gestattet
# Verwendung des Codes als eigene Lösung nicht gestattet
#>
<#
# Titel: M122 Backup Script
# Zweck: PowerShell GUI App um Backups zu erstellen
# Datum: 07.12.2021 - 12.12.2021
# Dokumentename: main.ps1
# Projektname: M122 PAA Backup Lösung realisieren
# Autoren: Timo Sarkar & Aaron Camenzind
# Versionierung: 0.1.1-stable
#>
# script imports damit das GUI funktioniert
function mainBackup {
param (
# parameter hier dokumentieren
)
# System.Windows.Forms Assembly laden
Add-Type -AssemblyName System.Windows.Forms
# EnableVisualStyles sieht einfach besser aus :)
[System.Windows.Forms.Application]::EnableVisualStyles()
# Forms configs
# Neues GUI Forms erstellen
$Form = New-Object system.Windows.Forms.Form
# Massen des GUIS
$Form.ClientSize = '550,470'
# Titel des GUIS
$Form.text = "M122 Backup App"
# Überlappen anderer GUIS erlauben?
$Form.TopMost = $false
# Label 1: 1)
# Neues Label erstellen
$Label1 = New-Object system.Windows.Forms.Label
# Wert des Labels
$Label1.text = "1)"
# Veränderliche Grösse auf true setzen
$Label1.AutoSize = $true
# Label breite
$Label1.width = 25
# Label höhe
$Label1.height = 10
# Label koordinaten (höhe,breite)
$Label1.location = New-Object System.Drawing.Point(44,43)
# Schriftart des Labels
$Label1.Font = 'Microsoft Sans Serif,10'
# Neues Label erstellen
$Label2 = New-Object system.Windows.Forms.Label
# Wert des Labels
$Label2.text = "Event-Logs des Backups"
# Veränderliche Grösse auf true setzen
$Label2.AutoSize = $true
# label breite
$Label2.width = 25
# label höhe
$Label2.height = 10
# label koordinaten (höhe,breite)
$Label2.location = New-Object System.Drawing.Point(176,210)
# label schriftart setzen
$Label2.Font = 'Microsoft Sans Serif,10'
# Neues Label erstellen
$Label3 = New-Object system.Windows.Forms.Label
# Wert des Labels
$Label3.text = "2)"
# Veränderliche Grösse auf true setzen
$Label3.AutoSize = $true
$Label3.width = 25
$Label3.height = 10
$Label3.location = New-Object System.Drawing.Point(44,95)
$Label3.Font = 'Microsoft Sans Serif,10'
# Neues Label erstellen
$Label4 = New-Object system.Windows.Forms.Label
# Wert des Labels
$Label4.text = "3)"
# Veränderliche Grösse auf true setzen
$Label4.AutoSize = $true
# label breite
$Label4.width = 50
# label höhe
$Label4.height = 10
# label koordinaten (höhe,breite)
$Label4.location = New-Object System.Drawing.Point(44,155)
# label schriftart setzen
$Label4.Font = 'Microsoft Sans Serif,10'
# Backup Button
# Neuer Button erstellen
$init = New-Object system.Windows.Forms.Button
# Button Text/Wert
$init.text = "Logs definieren + Backup starten"
# Breite des Buttons
$init.width = 241
# Höhe des Buttons
$init.height = 30
# koordinaten des Buttons (höhe,breite)
$init.location = New-Object System.Drawing.Point(120,150)
# Schriftart des Buttons
$init.Font = 'Microsoft Sans Serif,10'
# OutputBox fürs Event-Log
# outputbox erstellen
$outputBox = New-Object System.Windows.Forms.TextBox
# textbox breite
$outputBox.width = 400
# textbox höhe
$outputBox.height = 200
# textbox koordinaten (höhe,breite)
$outputBox.location = New-Object System.Drawing.Point(69,256)
# textbox multiline allow setzen
$outputBox.MultiLine = $True
# textbox scrollbars auf vertikal setzen
$outputBox.ScrollBars = "Vertical"
# quellverzeichnis button
# neuer button erstellen
$quellverzeichnisbutton = New-Object system.Windows.Forms.Button
# button text
$quellverzeichnisbutton.text = "Quell-Verzeichnis definieren"
# button breite
$quellverzeichnisbutton.width = 240
# button höhe
$quellverzeichnisbutton.height = 30
# button koordinaten (höhe,breite)
$quellverzeichnisbutton.location = New-Object System.Drawing.Point(120,36)
# button schriftart
$quellverzeichnisbutton.Font = 'Microsoft Sans Serif,10'
# backup location button
# neuer button erstellen
$backupLocation = New-Object system.Windows.Forms.Button
# button text
$backupLocation.text = "Backup-Verzeichnis definieren"
# button breite
$backupLocation.width = 240
# button höhe
$backupLocation.height = 30
# button koordinaten (höhe,breite)
$backupLocation.location = New-Object System.Drawing.Point(120,90)
# button schriftart
$backupLocation.Font = 'Microsoft Sans Serif,10'
# componenten im Forms renderen
$Form.controls.AddRange(@($Label1, $Label2, $Label3, $Label4, $outputbox, $backupLocation, $quellverzeichnisbutton, $init))
# datum in variable speichern
[string] $date = get-Date -f yyyyMMdd_HHmmss
# erstelle Bin directory in PWD
new-item .\Bin\ -itemtype directory -force
# FIXME: Kopiere das aktive Skript nach .\Bin\ für die Filestruktur
# $MyInvocation.MyCommand.ScriptContents | Out-File .\Bin\Main.ps1
# event-log setzen
$outputBox.Text = "[SUCCESS] [${date}] - Main.ps1 - GUI Erfolgreich initialisiert"
# quell verzeichnis auswählen. D.h. wenn man auf den Button klickt
$quellverzeichnisbutton.Add_click({
# System.windows.forms assembly laden
[System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms")
# neues FolderBrowser Objekt erstellen und in $foldername speichern
$foldername = New-Object System.Windows.Forms.FolderBrowserDialog
# rootfolder methode definieren
$foldername.rootfolder = "MyComputer"
# FolderBrowser Fenster anzeigen
$foldername.ShowDialog()
# $quellverzeichnis auf $foldername.selectedPath setzen
$quellverzeichnis = $foldername.SelectedPath
# FIXME: Notlösung aufgrund von keiner Vererbung einer Variabel ausserhalb eines GUI Events
# FIXME: Zum Zugreifen auf $backupverzeichnis ausserhalb des events, erstellt das Skript eine Datei im Verzeichnis
# PWD\Bin. Die Datei lautet: Backuppath.txt und beinhaltet den Ziel-Pfad, welcher für das zu erstellende backup essentiell ist.
new-item -path ".\Bin\Quellpath.txt" -ItemType file -value $quellverzeichnis -force
# log schreiben
$outputBox.AppendText("`n[SUCCESS] [${date}] - Main.ps1 - Quellverzeichnis wurde definiert")
})
# backup verzeichnis auswählen D.h. wenn man auf den Button klickt
$backupLocation.Add_click({
# System.windows.forms assembly laden
[System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms")
# neues FolderBrowser Objekt erstellen und in $foldername speichern
$foldername2 = New-Object System.Windows.Forms.FolderBrowserDialog
# rootfolder methode definieren
$foldername2.rootfolder = "MyComputer"
# FolderBrowser Fenster anzeigen
$foldername2.ShowDialog()
# $backupverzeichnis auf $foldername2.selectedPath setzen
$backupverzeichnis = $foldername2.SelectedPath
# log schreiben
$outputBox.AppendText("`n[SUCCESS] [${date}] - Main.ps1 - Backupverzeichnis wurde definiert")
# FIXME: Notlösung aufgrund von keiner Vererbung einer Variabel ausserhalb eines GUI Events
# FIXME: Zum Zugreifen auf $backupverzeichnis ausserhalb des events, erstellt das Skript eine Datei im Verzeichnis
# PWD\Bin. Die Datei lautet: Backuppath.txt und beinhaltet den Ziel-Pfad, welcher für das zu erstellende backup essentiell ist.
new-item -path ".\Bin\Backuppath.txt" -ItemType file -value $backupverzeichnis -force
})
# log definieren und backup starten
$init.Add_click({
# auf den backup-pfad zugreifen (via filesystem)
[string] $backupverzeichnis = get-content ".\Bin\Backuppath.txt"
# auf den quell-pfad zugreifen (via filesystem)
[string] $quellverzeichnis = get-content ".\Bin\Quellpath.txt"
# Microsoft.VisualBasic.*/Interaction Assembly laden
[void][Reflection.Assembly]::LoadWithPartialName('Microsoft.VisualBasic')
# titel des PopUps definieren
[string] $title = 'M122 Backup App'
# Nachricht des PopUps definieren
[string] $msg = 'Bitte geben Sie den Logpfad an, bsp. C:\temp\log.txt'
# eingegebener path von der InputBox wird in $logverzeichnis gespeichert.
$logverzeichnis = [Microsoft.VisualBasic.Interaction]::InputBox($msg, $title)
# ist das logverzeichnis nicht definiert, dann erstelle das Log im PWD
if ($logverzeichnis -eq "") {
# setze logverzeichnis auf PWD\Log\Log.txt
[string] $logverzeichnis = ".\Log\Log.txt"
}
# log mit pfad von $logverzeichnis erstellen. Initial-Wert mit erstem Eintrag setzen
new-item -path $logverzeichnis -ItemType file -value "[SUCCESS] [${date}] - Main.ps1 - Logfile wurde erstellt: ${logverzeichnis}"
# event-log eintrag in der outpubox setzen
$outputBox.AppendText("`n[SUCCESS] [${date}] - Main.ps1 - Logfile wurde erstellt. Pfad: ${logverzeichnis}")
# scan, welcher alle dateien und ordner in TopSrc speichert
[string] $scanContent = get-childitem -path $quellverzeichnis -name -recurse -force
# event-log eintrag in der outpubox setzen
$outputBox.AppendText("`n[SUCCESS] [${date}] - Main.ps1 - Ziel-Objekte wurden gefunden")
# log schreiben
Add-Content $logverzeichnis "`n[SUCCESS] [${date}] - Main.ps1 - Ziel-Objekte wurden im Quell-Verzeichnis gefunden und gespeichert"
# zählen der objekte in $scanLocation
[string] $countObjectsInScanLocation = ( get-childitem $quellverzeichnis -recurse -force | measure-object).Count;
# event-log eintrag in der outpubox setzen
$outputBox.AppendText("`n[SUCCESS] [${date}] - Main.ps1 - Ziel-Objekte wurden gezaehlt. Anzahl: ${countObjectsInScanLocation}")
# log schreiben
Add-Content $logverzeichnis "`n[SUCCESS] [${date}] - Main.ps1 - Ziel-Objekte wurden gezaehlt. Anzahl: ${countObjectsInScanLocation}"
# schauen ob der angegebene quell-pfad exisitiert
# FIXME: test exist [string] $testpath = test-path -Path $scanContent
# wenn der quell pfad leer ist, gib eine fehlermeldung aus
if ([System.IO.File]::Exists($quellverzeichnis)) {
# fehler im event-log viewer anzeigen
$outputBox.AppendText("`n[FAILURE] [${date}] - Main.ps1 - Der Quell-Pfad ist leer. Beende das Programm")
# fehler meldung ausgeben mit PopUp
[System.Windows.Forms.MessageBox]::Show("Der Quell-Pfad darf nicht leer sein","M122 Backup App",0)
# log schreiben
Add-Content $logverzeichnis "`n[FAILURE] [${date}] - Main.ps1 - Der Quell-Pfad ist leer."
# GUI Schliessen
$Form.Close()
# log schreiben
Add-Content $logverzeichnis "`n[FAILURE] [${date}] - Main.ps1 - Beende das Programm."
# Programm beenden
Exit
} else {
# log schreiben
Add-Content $logverzeichnis "`n[SUCCESS] [${date}] - Main.ps1 - Der Quell-Pfad ist nicht leer und existiert"
}
# dateien von TopSrc nach TopBack kopieren
copy-item -path "${quellverzeichnis}" -destination "${backupverzeichnis}" -recurse -force
# wenn der letzte command erfolgreich ausgeführt worden ist...
if ($?) {
# speichere alle objekte in TopBack in $copieditems
[string] $copieditems = Get-ChildItem -Path $backupverzeichnis -recurse -force
# log schreiben
Add-Content $logverzeichnis "`n[SUCCESS] [${date}] - Main.ps1 - ${countObjectsInScanLocation} Dateien und Ordner wurden nach ${backupverzeichnis} kopiert."
Add-Content $logverzeichnis "`n[SUCCESS] [${date}] - Main.ps1 - Kopierte Objekte sind folgende: ${copieditems}"
} else {
# log schreiben
Add-Content $logverzeichnis "`n[FAILURE] [${date}] - Main.ps1 - ${countObjectsInScanLocation} Dateien und Ordner konnten nicht nach ${backupverzeichnis} kopiert werden."
# programm beenden
Exit
}
# items in quellverzeichnis scannen
[string] $checkquellverzeichnis = get-childitem -path $quellverzeichnis -recurse -force
# items in backupverzeichnis scannen
[string] $checkbackupverzeichnis = get-childitem -path $backupverzeichnis -recurse -force
# $quellverzeichnis und $backupverzeichnis verleichen
if (!(test-path $quellverzeichnis) -and !(test-path $backupverzeichnis)) {
# backup fehlerhaft = nachricht
[System.Windows.Forms.MessageBox]::Show("Backup fehlerhaft!","M122 Backup App",[System.Windows.Forms.MessageBoxButtons]::OK)
# logs schreiben
Add-Content $logverzeichnis "`n[FAILURE] [${date}] - Main.ps1 - Ueberpruefung des Backups fehlerhaft (stimmt nicht ueber ein)"
} else {
# logs schreiben
Add-Content $logverzeichnis "`n[SUCESS] [${date}] - Main.ps1 - ${countObjectsInScanLocation} Dateien und Ordner in ${backupverzeichnis} wurden mit ${quellverzeichnis} verglichen"
Add-Content $logverzeichnis "`n[SUCESS] [${date}] - Main.ps1 - Ueberpruefung des Backups erfolgreich"
# backup erfolgreich mit nachricht beenden
[System.Windows.Forms.MessageBox]::Show("Backup erfolgreich durchgefuehrt","M122 Backup App",[System.Windows.Forms.MessageBoxButtons]::OK)
}
})
# GUI Anzeigen
$Form.showdialog()
# erfolgscode 0 zurückgeben
return 0
}
# haupt funktion aufrufen
mainBackup
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment