Invoke-WebRequest - 即使出现错误也存储请求内容?

Invoke-WebRequest - 即使出现错误也存储请求内容?

我正在使用 Powershell Invoke-WebRequest(这也适用于Invoke-RestMethod)调用 ElasticSearch 集群。此特定命令经常返回错误结果(409 conflict)。

Powershell 看到错误状态,抛出错误并且不通过管道传递任何有用的内容,并且它将响应主体喷到控制台上:

在此处输入图片描述

但是,a)即使它有一个错误代码,我并不关心它是否出错(只关心它是否返回),b)我希望能够访问该响应的主体,以便我可以实际检查其中包含的数据。

有什么方法可以让 PowerShell 抑制错误输出(-ErrorAction不起作用)并沿着管道传递一些有用的内容?

需要注意的是,我实际上想用它调用它,Invoke-RestMethod但由于它和Invoke-WebRequest本质上是相同的命令,我将这个问题概括为Invoke-WebRequest

答案1

去年我写了一个脚本来诊断常见的 IIS 设置问题,它位于GitHub,为此我需要分析来自服务器的响应,即使对于非 200 的结果,尤其是对于非 200 的结果,所以Invoke-WebRequest不起作用。

我删除了一些东西,基本代码如下。

我使用 .NETSystem.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
}

相关内容