Invoke-WebRequest – 存储请求内容,甚至出错?

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

Powershell看到错误状态,抛出一个错误,并没有通过pipe道传递任何有用的东西,它将响应的主体喷到控制台上:

在这里输入图像说明

但是,a)尽pipe它有一个错误代码,我并不在意它是错误的(只是它被返回),b)我希望能够访问该响应的主体,以便我可以实际检查包含的数据。

有什么办法让PowerShell压制错误输出( -ErrorAction不起作用),并传递一些有用的pipe道?

作为一个说明,我真的想调用这与Invoke-RestMethod但因为它和Invoke-WebRequest本质上是相同的命令,我已经推广这个问题, Invoke-WebRequest

去年我写了一个脚本来诊断常见的IIS设置问题,它在GitHub上 ,因为它需要分析服务器的响应,即使是非200结果,尤其是非200结果,所以Invoke-WebRequest没有工作。

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

我使用.NET System.Net.WebRequest因为即使引发了System.Net.WebException ,仍然可以通过响应头和主体访问响应stream。

 $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 }