Я пишу сценарий PowerShell, который должен сделать веб-запрос и проверить код состояния ответа.
Я пробовал написать это:
$client = new-object system.net.webclient
$response = $client.DownloadData($url)
так же как и это:
$response = Invoke-WebRequest $url
но всякий раз, когда веб-страница имеет код состояния, который не является кодом состояния успеха, PowerShell выдает исключение вместо того, чтобы предоставить мне фактический объект ответа.
Как я могу получить код статуса страницы, даже если она не загружается?
powershell
jcarpenter2
источник
источник
Ответы:
Попробуй это:
try { $response = Invoke-WebRequest http://localhost/foo } catch { $_.Exception.Response.StatusCode.Value__}
Это своего рода облом, что это вызывает исключение, но так оно и есть.
Обновление по комментариям
Чтобы гарантировать, что такие ошибки по-прежнему возвращают действительный ответ, вы можете зафиксировать эти исключения типа
WebException
и получить связанныеResponse
.Поскольку ответ на исключение имеет тип
System.Net.HttpWebResponse
, в то время как ответ на успешныйInvoke-WebRequest
вызов имеет типMicrosoft.PowerShell.Commands.HtmlWebResponseObject
, для возврата совместимого типа из обоих сценариев нам нужно взять успешный ответBaseResponse
, который также имеет типSystem.Net.HttpWebResponse
.Код состояния этого нового типа ответа - это перечисление типа
[system.net.httpstatuscode]
, а не простое целое число, поэтому вам нужно явно преобразовать его в int или получить доступ к егоValue__
свойству, как описано выше, чтобы получить числовой код.#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__
источник
$response = try { (Invoke-WebRequest -Uri 'localhost/foo' -ErrorAction Stop).BaseRequest } catch [System.Net.WebException] { $_.Exception.Response }
. Т.е. выборкаBaseRequest
гарантирует, что как в случае успеха, так и в случае ошибки мы получим файлHttpWebReqponse
. Добавление[System.Net.WebException]
гарантирует, что таким образом мы фиксируем только релевантные исключения / случайно не заметим другие типы проблем.Поскольку Powershell версии 7.0
Invoke-WebRequest
имеет-SkipHttpErrorCheck
параметр переключения.запрос на включение документов
источник
-SkipHttpErrorCheck
- лучшее решение для PowerShell 7+, но если вы еще не можете его использовать, то вот простая альтернатива, которая полезна для интерактивных сеансов Poweshell в командной строке.Когда вы видите описание ошибки для ответа 404, т. Е.
Затем вы можете увидеть «последнюю ошибку» из командной строки, введя это:
$Error[0].Exception.Response.StatusCode
Или же
$Error[0].Exception.Response.StatusDescription
Или что-то еще, что вы хотели бы узнать об объекте Response.
источник