Назад | Перейти на главную страницу

Invoke-WebRequest - сохранять содержимое запроса даже при ошибке?

Я использую 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
}