Piszę skrypt PowerShell, który musi wykonać żądanie sieciowe i sprawdzić kod stanu odpowiedzi.
Próbowałem napisać to:
$client = new-object system.net.webclient
$response = $client.DownloadData($url)
tak dobrze jak to:
$response = Invoke-WebRequest $url
ale za każdym razem, gdy strona internetowa ma kod stanu, który nie jest kodem stanu sukcesu, PowerShell kontynuuje i zgłasza wyjątek zamiast podawać mi rzeczywisty obiekt odpowiedzi.
Jak mogę uzyskać kod statusu strony, nawet jeśli się nie ładuje?
powershell
jcarpenter2
źródło
źródło
Odpowiedzi:
Spróbuj tego:
try { $response = Invoke-WebRequest http://localhost/foo } catch { $_.Exception.Response.StatusCode.Value__}
To trochę kłopotliwe, że rzuca to wyjątek, ale tak właśnie jest.
Aktualizuj według komentarzy
Aby upewnić się, że takie błędy nadal zwracają prawidłową odpowiedź, możesz przechwycić te wyjątki typu
WebException
i pobrać powiązaneResponse
.Ponieważ odpowiedź na wyjątek jest typu
System.Net.HttpWebResponse
, podczas gdy odpowiedź z pomyślnegoInvoke-WebRequest
wywołania jest typuMicrosoft.PowerShell.Commands.HtmlWebResponseObject
, aby zwrócić zgodny typ z obu scenariuszy, musimy pobrać pomyślną odpowiedźBaseResponse
, która również jest typuSystem.Net.HttpWebResponse
.Kod stanu tego nowego typu odpowiedzi jest wyliczeniem typu
[system.net.httpstatuscode]
, a nie prostą liczbą całkowitą, więc musisz bezpośrednio przekonwertować go na int lub uzyskać dostęp do jegoValue__
właściwości, jak opisano powyżej, aby uzyskać kod numeryczny.#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__
źródło
$response = try { (Invoke-WebRequest -Uri 'localhost/foo' -ErrorAction Stop).BaseRequest } catch [System.Net.WebException] { $_.Exception.Response }
.BaseRequest
To znaczy, że pobieranie zapewnia, że zarówno w scenariuszach sukcesu, jak i błędów otrzymujemy plikHttpWebReqponse
. Dodanie[System.Net.WebException]
zapewnia, że w ten sposób wychwytujemy tylko istotne wyjątki / nie usuwamy przypadkowo innych typów problemów.Od wersji Powershell 7.0
Invoke-WebRequest
mają-SkipHttpErrorCheck
parametr przełącznika.żądanie ściągnięcia dokumentów
źródło
-SkipHttpErrorCheck
jest najlepszym rozwiązaniem dla PowerShell 7+, ale jeśli jeszcze nie możesz z niego korzystać, oto prosta alternatywa, która jest przydatna w przypadku interaktywnych sesji Poweshell z wiersza poleceń.Gdy zobaczysz opis błędu dla odpowiedzi 404, tj.
Następnie możesz zobaczyć `` ostatni błąd '' z wiersza poleceń, wpisując to:
$Error[0].Exception.Response.StatusCode
Lub
$Error[0].Exception.Response.StatusDescription
Lub cokolwiek innego, co chciałbyś wiedzieć o obiekcie `Response '.
źródło