PowerShell: Parallel-HTTP-Requests mit ForEach-Object -Parallel (PowerShell 7+)

Kurze Einführung

Dieses Skript führt HTTP-Requests parallel aus und liefert für jede URL den HTTP-Status. Nützlich, um Verfügbarkeit oder Antwortverhalten mehrerer Webseiten schnell zu prüfen.

Voraussetzungen

  • PowerShell 7 oder höher (ForEach-Object -Parallel ist erst ab PowerShell 7 verfügbar)
  • Netzwerkzugang zu den Ziel-URLs (Internetzugang, ggf. Proxy-Konfiguration)
  • Ausführungsrechte für Skripte auf dem System (ExecutionPolicy entsprechend)

Verbessertes und kompatibles PowerShell 7-Skript

$urls = @(
    "https://www.microsoft.com",
    "https://www.github.com",
    "https://www.google.com",
    "https://www.bing.com"
)

# Parallel ausführen (PowerShell 7+)
$results = $urls | ForEach-Object -Parallel {
    try {
        # -UseBasicParsing ist in PowerShell Core nicht verfügbar, daher weglassen
        $response = Invoke-WebRequest -Uri $_ -TimeoutSec 5 -ErrorAction Stop
        [PSCustomObject]@{
            Url    = $_
            Status = $response.StatusCode
        }
    } catch {
        [PSCustomObject]@{
            Url    = $_
            Status = "Fehler: $($_.Exception.Message)"
        }
    }
} -ThrottleLimit 3   # Maximal 3 Jobs gleichzeitig

# Ergebnisse anzeigen
$results | Format-Table -AutoSize

Wichtige Bestandteile des Skripts (Bullet Points)

  • $urls: Array mit den zu prüfenden URLs. Hier lassen sich beliebig viele Adressen ergänzen.
  • ForEach-Object -Parallel: Führt das ScriptBlock parallel in mehreren Runspaces aus. Verfügbar ab PowerShell 7.
  • -ThrottleLimit: Begrenzung der gleichzeitig gestarteten Parallel-Jobs (hier 3), um Ressourcenverbrauch zu steuern.
  • Invoke-WebRequest: Führt den HTTP-Request aus. In PowerShell 7 sollte -UseBasicParsing nicht verwendet werden; stattdessen das Standardverhalten nutzen.
  • -TimeoutSec: Maximale Wartezeit in Sekunden für den Request (hier 5s) — sinnvoll, um blockierende Anfragen zu verhindern.
  • -ErrorAction Stop: Erzwingt, dass Invoke-WebRequest bei Fehlern eine Ausnahme wirft, die im Catch-Block verarbeitet werden kann.
  • Try/Catch: Fängt Fehler ab und liefert eine aussagekräftige Fehlermeldung pro URL statt das ganze Skript zum Abbruch zu bringen.
  • [PSCustomObject]: Einheitliche Struktur der Rückgabe (Url und Status), damit Ergebnisse leicht weiterverarbeitet/exportiert werden können.
  • Format-Table -AutoSize: Schöne Konsolen-Ausgabe. Für Automatisierungen kann stattdessen z. B. Export-Csv verwendet werden.
  • Wichtig zu beachten: Laufende Parallel-Jobs sehen nur lokale Variablen des aktuellen Elements ($_). Um auf Variablen aus dem übergeordneten Kontext zuzugreifen, $using:Variablenname verwenden.

Tipps & Erweiterungen

  • Wenn die Reihenfolge der Eingabedateien erhalten bleiben soll, vorher jedem Eintrag einen Index zuweisen und die Ergebnisse anschliessend danach sortieren.
  • Bei vielen URLs oder häufiger Nutzung ist der Einsatz von [System.Net.Http.HttpClient] performanter als Invoke-WebRequest.
  • Für ausführlichere Logs: Ergebnisse zusätzlich mit Zeitstempel, Dauer des Requests und ggf. StatusDescription erweitern.

Optionales Beispiel: Reihenfolge beibehalten und Index hinzufügen

$urls = @(
    "https://www.microsoft.com",
    "https://www.github.com",
    "https://www.google.com",
    "https://www.bing.com"
)

# Index hinzufügen
$indexed = $urls | ForEach-Object -Begin { $i = 0 } -Process { [PSCustomObject]@{ Index = $i++; Url = $_ } }

$results = $indexed | ForEach-Object -Parallel {
    try {
        $response = Invoke-WebRequest -Uri $using:item.Url -TimeoutSec 5 -ErrorAction Stop
        [PSCustomObject]@{
            Index  = $using:item.Index
            Url    = $using:item.Url
            Status = $response.StatusCode
        }
    } catch {
        [PSCustomObject]@{
            Index  = $using:item.Index
            Url    = $using:item.Url
            Status = "Fehler: $($_.Exception.Message)"
        }
    }
} -ThrottleLimit 3

# Nach Index sortieren, um ursprüngliche Reihenfolge zu erhalten
$results | Sort-Object Index | Format-Table -AutoSize

Ausführen

Skript in eine Datei speichern, z. B. Check-Urls.ps1, und in PowerShell 7 mit pwsh.exe -File .\Check-Urls.ps1 oder direkt in einer PowerShell 7-Sitzung ausführen.

Zusammenfassung

Mit ForEach-Object -Parallel in PowerShell 7 lassen sich HTTP-Requests sehr effizient parallelisieren. Achte auf PowerShell-Version, Timeouts und ThrottleLimit — damit bleibt dein System stabil und die Ergebnisse aussagekräftig.

Share this content:

Das hast du vielleicht verpasst

shibiadmin
Datenschutz-Übersicht

Diese Website verwendet Cookies, damit wir dir die bestmögliche Benutzererfahrung bieten können. Cookie-Informationen werden in deinem Browser gespeichert und führen Funktionen aus, wie das Wiedererkennen von dir, wenn du auf unsere Website zurückkehrst, und hilft unserem Team zu verstehen, welche Abschnitte der Website für dich am interessantesten und nützlichsten sind.