Mar*_*son 4 powershell http error-handling
我正在使用 Powershell Invoke-WebRequest(这也适用于Invoke-RestMethod)来调用 ElasticSearch 集群。此特定命令通常会返回错误结果 ( 409 conflict)。
Powershell 看到错误状态,抛出一个错误并且没有通过管道传递任何有用的东西,并将响应的主体喷到控制台上:
但是,a) 即使它有一个错误代码,我也不在乎它是否出错了(只是它被返回了),并且 b) 我希望能够访问该响应的正文,以便我可以实际检查其中包含的数据。
有没有办法让 PowerShell 抑制错误输出(-ErrorAction不起作用)并沿管道传递一些有用的东西?
作为说明,我实际上想用Invoke-RestMethod它来调用它,但是因为它Invoke-WebRequest本质上是相同的命令,所以我将这个问题概括为Invoke-WebRequest
去年我写了一个脚本来诊断常见的 IIS 设置问题,它在GitHub 上,因为我需要分析来自服务器的响应,即使是非 200 的结果,尤其是非 200 的结果,所以Invoke-WebRequest没有工作。
我删除了一些东西,基本代码如下。
我使用 .NETSystem.Net.WebRequest是因为即使System.Net.WebException抛出 a,您仍然可以使用响应头和正文访问响应流。
$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
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6257 次 |
| 最近记录: |