我正在使用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 }