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
-UseBasicParsingnicht 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-Csvverwendet werden. - Wichtig zu beachten: Laufende Parallel-Jobs sehen nur lokale Variablen des aktuellen Elements ($_). Um auf Variablen aus dem übergeordneten Kontext zuzugreifen,
$using:Variablennameverwenden.
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:
Kommentar abschicken