PowerShell bietet verschiedene Möglichkeiten, mehrzeilige Befehle zu erstellen und auszuführen. Dies ist besonders nützlich bei komplexeren Operationen, langen Pipelines oder wenn Sie Ihre Befehle strukturiert und lesbar gestalten möchten.

Direkte Eingabe in der PowerShell-Konsole

Backtick für Zeilenwrapping

Der einfachste Weg, einen Befehl über mehrere Zeilen zu schreiben, ist die Verwendung des Backtick-Zeichens (`) am Ende einer Zeile:

Get-ChildItem -Path C:\Users `
    -Recurse `
    -Filter "*.txt" `
    | Where-Object { $_.Length -gt 1000 }

Das Backtick teilt PowerShell mit, dass der Befehl in der nächsten Zeile fortgesetzt wird.

Natürliche Zeilenumbrüche bei Pipelines

PowerShell erkennt automatisch, wenn eine Pipeline nicht vollständig ist und wartet auf weitere Eingaben:

Get-Process |
    Where-Object { $_.CPU -gt 10 } |
    Sort-Object CPU -Descending |
    Select-Object -First 10

Nach dem Pipe-Symbol (|) können Sie einfach Enter drücken, und PowerShell zeigt >> an, um anzuzeigen, dass weitere Eingaben erwartet werden.

Here-Strings für komplexe Inhalte

Für mehrzeilige Strings verwenden Sie Here-Strings:

$multilineText = @"
Dies ist ein mehrzeiliger
Text, der über mehrere
Zeilen verteilt ist.
"@

Multiline-Befehle in PowerShell-Skripten

Grundlegende Strukturierung

In PowerShell-Skriptdateien (.ps1) können Sie Befehle natürlich über mehrere Zeilen verteilen:

# Beispiel: Systeminfo sammeln
$systemInfo = Get-ComputerInfo |
    Select-Object WindowsProductName,
                  WindowsVersion,
                  TotalPhysicalMemory,
                  CsProcessors |
    Format-Table -AutoSize

Splatting für Parameter

Splatting ist eine der elegantesten Techniken in PowerShell, um Befehle mit vielen Parametern übersichtlich zu gestalten. Anstatt alle Parameter in eine lange Zeile zu schreiben, sammeln Sie sie in einer Hashtable und übergeben diese mit dem @-Symbol.

Grundlegendes Splatting:

# Statt dieser unübersichtlichen Zeile:
Get-ChildItem -Path "C:\Logs" -Recurse -Include "*.log" -Force -ErrorAction SilentlyContinue

# Verwenden Sie Splatting:
$params = @{
    Path = "C:\Logs"
    Recurse = $true
    Include = "*.log"
    Force = $true
    ErrorAction = "SilentlyContinue"
}

Get-ChildItem @params

Splatting mit Pipelines kombinieren:

$searchParams = @{
    Path = "C:\Windows\System32"
    Filter = "*.dll"
    Recurse = $false
}

$filterParams = @{
    Property = "LastWriteTime"
    Descending = $true
}

Get-ChildItem @searchParams |
    Where-Object { $_.Length -gt 1MB } |
    Sort-Object @filterParams |
    Select-Object -First 10

Dynamisches Splatting:

Sie können Parameter-Hashtables auch dynamisch aufbauen:

$copyParams = @{
    Source = "C:\Source"
    Destination = "C:\Backup"
}

# Parameter nur unter bestimmten Bedingungen hinzufügen
if ($IncludeSubfolders) {
    $copyParams.Add("Recurse", $true)
}

if ($OverwriteExisting) {
    $copyParams.Add("Force", $true)
}

Copy-Item @copyParams

Splatting für verschiedene Cmdlets:

# Web-Request Parameter
$webParams = @{
    Uri = "https://api.github.com/users/octocat"
    Method = "GET"
    Headers = @{
        "User-Agent" = "PowerShell Script"
        "Accept" = "application/json"
    }
    ContentType = "application/json"
}

$response = Invoke-RestMethod @webParams

# Service-Parameter
$serviceParams = @{
    Name = @("Spooler", "BITS", "Themes")
    ComputerName = "Server01"
    ErrorAction = "Continue"
}

Get-Service @serviceParams

Hashtables und Arrays über mehrere Zeilen

$serverConfig = @{
    Name = "WebServer01"
    IPAddress = "192.168.1.100"
    Services = @(
        "IIS",
        "SQL Server",
        "Windows Update"
    )
    Settings = @{
        AutoStart = $true
        LogLevel = "Verbose"
    }
}

Fazit

Multiline-Befehle in PowerShell erhöhen die Lesbarkeit und Wartbarkeit Ihrer Skripte erheblich. Splatting ist dabei eine besonders mächtige Technik, die nicht nur die Übersichtlichkeit verbessert, sondern auch die Wiederverwendbarkeit von Parameter-Sets ermöglicht. Ob Sie das Backtick für einfache Zeilenumbrüche, natürliche Pipeline-Fortsetzungen oder Splatting für komplexe Parameter verwenden - die richtige Formatierung macht Ihre PowerShell-Befehle professioneller und einfacher zu verstehen.

Experimentieren Sie mit diesen Techniken und finden Sie heraus, welcher Stil am besten zu Ihrem Workflow passt. Die Investition in sauberen, gut strukturierten Code zahlt sich langfristig durch einfachere Wartung und weniger Fehler aus.