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