Created
December 18, 2021 08:46
-
-
Save sartimo/2c9a8beb910fe9fd41990c984089e36e to your computer and use it in GitHub Desktop.
Our solution for the M122 project
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<# | |
# 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