Private/Wissen/C_Advance/C06_AufbauAusführbareDatei.ps1

<#
 
# Inhaltliche Aufbau von ausführbaren Dateien
 
Wie sollten .PS1- und .PSM1-Dateien idealerweise aufgebaut sein?
 
- **Hashtags** PS1 PSM1 TEMPLATE
- **Version** 2020.02.27
 
#>


#region Prolog

# ! 1. Benötigte Module importieren
# ! ├ Für Dritte eine Übersicht der benötigten und damit zu installierenden Module
# ! └ using Module ... ist identisch mit Import-Module -Name ...
using Module Microsoft.PowerShell.Management
using Module Microsoft.PowerShell.Utility

# ! 2. Benötigte Namespace importieren
# ! └ Erleicht den Zugriff auf Typen,
# ! anstelle [System.Management.Automation.ActionPreference]::Stop
# ! kann [ActionPreference]::Stop geschrieben werden.
using namespace System.Management.Automation
using namespace System.Windows.Forms

# ! 3. Standard-Verhalten beim auftretten von Fehlern festlegen
# ! └ Die Skript-Verarbeitung sollte beim ersten auftretenden Fehler abbrechen (STOP)
# ! und nicht weiter arbeiten (Standard ist Continue), um einen Schaden auf
# ! minimum zu beschränken.
$backupErrorActionPreference = $ErrorActionPreference
$ErrorActionPreference = [ActionPreference]::Stop

# ! 4. Benötigte .NET Assemblies laden
# ! └ Die gebräuchlisten Assemblies sind bereits geladen.
# ! Darüberhinaus muss manuell geladen werden.
# ! Das schont Ressourcen.
Add-Type -AssemblyName "System.Windows.Forms"

# ! 5. Script-Übergabe-Parameter definieren
# ! ├ Optional
# ! └ Diese Datei kann jetzt wie folgt aufgerufen werden:
# ! MyScript.ps1 -Path x:\wtf -BenutzerId 47110815
param (
    [string]$Path, 
    [int]$BenutzerId
)

# ! 6. Aktivieren von 'Variablen-Deklaration muss vor der ersten Verwendung erfolgen'
# ! ├ Vor der ersten Verwendung einer Variable, muss diese einen Wertaufweisen.
# ! │ Sonst wird ein Fehler ausgelöst.
# ! └ Diese Verfahren schützt vor Tippfehlern im Variablennamen.
Set-StrictMode -Version Latest

# ! 7. Benötigte Funktions-Definitionen erstellen
# ! ├ Optional
# ! └ Vor der ersten Verwendung von Functions muss die Function-Definition stehen,
# ! um rechtzeitig geladen werden zu können.
function Invoke-Irgendwas {
    param ([string]$Stadtname)
    $Stadtname
}

#endregion

# ! 8. Der eigentliche Business-Logik-Code der Script-Datei:
$prozesse = Get-Process
foreach($p in $prozesse) {
    $prozessname = $p.Name
    if($prozessname -eq "notepad") {
        $p.Kill()
    }
}

$fenster = New-Object -TypeName Form
$fenster.ShowDialog()

Invoke-Irgendwas -Stadtname Köln

#region Epilog

# ! 9. Aufräumen, d.H. keine Spuren hinterlassen
Remove-Variable -Name prozesse, prozessname, p, fenster -Force
Remove-Item -Path function:\Invoke-Irgendwas -Force
Set-StrictMode -Off
$ErrorActionPreference = $backupErrorActionPreference
Remove-Module -Name Module Microsoft.PowerShell.Utility -Force
Remove-Module -Name Microsoft.PowerShell.Management -Force

# ! 10. Digitale Signatur
# ! ├ Optional
# ! └ siehe Set-AuthenticodeSignature
# SIG # Begin signature block
# MIIkBwYJKoZIhvcNAQcCoIIj+DCCI/QCAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# ...
# Dg4zxvPhyyMhIuS/Rz2KOG8Ly6rTmGC1C5VxdjpP96xuhz6IefLKVxRZqZQNRJ25
# oCid85NU8LI2+rA=
# SIG # End signature block

# ! 11. Allgemeine Regeln
# ! 11.1 Keine Aliase verwenden
# ! 11.2 Invoke-ScriptAnalyzer -Path .\MeinSkript.ps1 ausführen.
# ! 11.3 Scripte/Code-Blöcke formatieren: Invoke-Formatter -Settings CodeFormattingAllman -ScriptDefinition (Get-Clipboard -Raw)

#endregion