Я использую Powershell Invoke-WebRequest
(это также относится к Invoke-RestMethod
) для вызова кластера ElasticSearch. Эта конкретная команда часто возвращает результат ошибки (409 conflict
).
Powershell видит состояние ошибки, выдает ошибку и не передает ничего полезного по конвейеру, а также выводит тело ответа на консоль:
Однако а) даже если у него есть код ошибки, мне все равно, что он ошибочен (только то, что он возвращен), и б) я хочу иметь доступ к телу этого ответа, чтобы я мог действительно проверить данные, содержащиеся в.
Есть ли способ заставить PowerShell подавлять вывод ошибки (-ErrorAction
не получается) и пропустить что-нибудь полезное по конвейеру?
В качестве примечания, я действительно хочу вызвать это с помощью Invoke-RestMethod
но как это и Invoke-WebRequest
по сути одна и та же команда, я обобщил этот вопрос на Invoke-WebRequest
В прошлом году я написал сценарий для диагностики типичных проблем с установкой IIS, он включен GitHub, для этого мне нужно было проанализировать ответ от сервера, даже для результатов, отличных от 200, особенно для результатов, отличных от 200, поэтому Invoke-WebRequest
не сработало.
Я удалил кое-что, и ниже приведен основной код.
Я использую .NET System.Net.WebRequest
потому что даже если System.Net.WebException
выбрасывается, вы все еще можете получить доступ к потоку ответов с заголовками и телом ответа.
$url = "http://localhost"
try {
$r = [System.Net.WebRequest]::Create($url)
$r.UserAgent=$userAgent
$resp = $r.GetResponse()
Write-host "Response Headers:"
foreach ($HeaderKey in $resp.Headers) {
$caption = $HeaderKey.PadLeft(15," ")
Write-host "$caption`: $($resp.Headers[$HeaderKey])";
}
$reqstream = $resp.GetResponseStream()
$sr = New-Object System.IO.StreamReader $reqstream
$body = $sr.ReadToEnd()
Write-host "$body"
$resp.StatusCode
}
catch [System.Net.WebException]
{
$resp = $_.Exception.Response
if ($resp -eq $null)
{
Write-host $_.Exception
}
else
{
$reqstream = $resp.GetResponseStream()
$sr = New-Object System.IO.StreamReader $reqstream
$body = $sr.ReadToEnd()
Write-host -Text "Response Headers:"
Echo " Status: $([int]$resp.StatusCode) - $($resp.StatusCode)"
foreach ($HeaderKey in $resp.Headers) {
$caption = $HeaderKey.PadLeft(15," ")
Write-host "$caption`: $($resp.Headers[$HeaderKey])";
}
Write-host "$body"
$resp.StatusCode
}
} catch {
Write-host $_.Exception
}