Ich schreibe ein Powershell-Skript, das eine Webanforderung stellen und den Statuscode der Antwort überprüfen muss.
Ich habe versucht, dies zu schreiben:
$client = new-object system.net.webclient
$response = $client.DownloadData($url)
so gut wie das:
$response = Invoke-WebRequest $url
Wenn die Webseite jedoch einen Statuscode enthält, der kein Erfolgsstatuscode ist, löst PowerShell eine Ausnahme aus, anstatt mir das eigentliche Antwortobjekt zu geben.
Wie kann ich den Statuscode der Seite erhalten, auch wenn sie nicht geladen werden kann?
powershell
jcarpenter2
quelle
quelle
Antworten:
Versuche dies:
try { $response = Invoke-WebRequest http://localhost/foo } catch { $_.Exception.Response.StatusCode.Value__}
Es ist eine Art Mist, dass dies eine Ausnahme auslöst, aber so ist es nun mal.
Update per Kommentar
Um sicherzustellen, dass solche Fehler immer noch eine gültige Antwort zurückgeben, können Sie diese Ausnahmen vom Typ erfassen
WebException
und die zugehörigen abrufenResponse
.Da die Antwort auf die Ausnahme vom Typ ist
System.Net.HttpWebResponse
, während die Antwort von einem erfolgreichenInvoke-WebRequest
Aufruf vom Typ istMicrosoft.PowerShell.Commands.HtmlWebResponseObject
, müssen wir die erfolgreichen Antworten verwendenBaseResponse
, die ebenfalls vom Typ sind, um einen kompatiblen Typ aus beiden Szenarien zurückzugebenSystem.Net.HttpWebResponse
.Der Statuscode dieses neuen Antworttyps ist eine Aufzählung vom Typ
[system.net.httpstatuscode]
und keine einfache Ganzzahl. Sie müssen ihn also explizit in int konvertieren oderValue__
wie oben beschrieben auf seine Eigenschaft zugreifen , um den numerischen Code zu erhalten.#ensure we get a response even if an error's returned $response = try { (Invoke-WebRequest -Uri 'localhost/foo' -ErrorAction Stop).BaseResponse } catch [System.Net.WebException] { Write-Verbose "An exception was caught: $($_.Exception.Message)" $_.Exception.Response } #then convert the status code enum to int by doing this $statusCodeInt = [int]$response.BaseResponse.StatusCode #or this $statusCodeInt = $response.BaseResponse.StatusCode.Value__
quelle
$response = try { (Invoke-WebRequest -Uri 'localhost/foo' -ErrorAction Stop).BaseRequest } catch [System.Net.WebException] { $_.Exception.Response }
. Das AbrufenBaseRequest
stellt sicher, dass wir sowohl in Erfolgs- als auch in Fehlerszenarien eine erhaltenHttpWebReqponse
. Durch das Hinzufügen wird[System.Net.WebException]
sichergestellt, dass nur relevante Ausnahmen auf diese Weise erfasst werden und andere Arten von Problemen nicht versehentlich beseitigt werden.Seit Powershell Version 7.0
Invoke-WebRequest
haben-SkipHttpErrorCheck
Schalterparameter.docs Pull-Anfrage
quelle
-SkipHttpErrorCheck
ist die beste Lösung für PowerShell 7+. Wenn Sie dies jedoch noch nicht verwenden können, finden Sie hier eine einfache Alternative, die für interaktive Poweshell-Befehlszeilensitzungen hilfreich ist.Wenn Sie eine Fehlerbeschreibung für eine 404-Antwort sehen, dh
Dann können Sie den 'letzten Fehler' in der Befehlszeile sehen, indem Sie Folgendes eingeben:
$Error[0].Exception.Response.StatusCode
Oder
$Error[0].Exception.Response.StatusDescription
Oder was auch immer Sie sonst noch vom `Response'-Objekt wissen möchten.
quelle