Powershell web请求在4xx/5xx上不引发异常

Powershell web请求在4xx/5xx上不引发异常,powershell,Powershell,我正在编写一个powershell脚本,它需要发出web请求并检查响应的状态代码 我试着写下: $client = new-object system.net.webclient $response = $client.DownloadData($url) 除此之外: $response = Invoke-WebRequest $url 但是,每当网页的状态代码不是成功状态代码时,PowerShell就会继续并抛出异常,而不是给我实际的响应对象 即使页面加载失败,我如何获取页面的状态代码?

我正在编写一个powershell脚本,它需要发出web请求并检查响应的状态代码

我试着写下:

$client = new-object system.net.webclient

$response = $client.DownloadData($url)
除此之外:

$response = Invoke-WebRequest $url
但是,每当网页的状态代码不是成功状态代码时,PowerShell就会继续并抛出异常,而不是给我实际的响应对象

即使页面加载失败,我如何获取页面的状态代码?

尝试以下操作:

try { $response = Invoke-WebRequest http://localhost/foo } catch {
      $_.Exception.Response.StatusCode.Value__}
这引发了一个异常,这有点令人沮丧,但事实就是这样

根据评论更新 为确保此类错误仍然返回有效响应,您可以捕获类型为
WebException
的异常,并获取相关的
响应

由于异常的响应类型为
System.Net.HttpWebResponse
,而成功的
Invoke WebRequest
调用的响应类型为
Microsoft.PowerShell.Commands.HtmlWebResponseObject
,要从两种场景返回兼容类型,我们需要获取成功响应的
BaseResponse
,它也是
System.Net.HttpWebResponse
类型

此新响应类型的状态代码是
[system.net.httpstatuscode]
类型的枚举,而不是简单的整数,因此您必须明确地将其转换为int,或者如上所述访问其
值\uuu
属性以获取数字代码

#ensure we get a response even if an error's returned
$response = try { 
    (Invoke-WebRequest -Uri 'localhost/foo' -ErrorAction Stop).BaseResponse
} catch [System.Net.WebException] { 
    Write-Verbose "An exception was caught: $($_.Exception.Message)"
    $_.Exception.Response 
} 

#then convert the status code enum to int by doing this
$statusCodeInt = [int]$response.BaseResponse.StatusCode
#or this
$statusCodeInt = $response.BaseResponse.StatusCode.Value__

由于Powershell 7.0版
调用WebRequest
具有
-SkipHttpErrorCheck
开关参数

-SkipHttpErrorCheck

此参数导致cmdlet忽略HTTP错误状态和 继续处理答复。错误响应将写入 就好像他们成功了一样

此参数是在PowerShell 7中引入的


-SkipHttpErrorCheck
是PowerShell 7+的最佳解决方案,但如果您还不能使用它,那么这里有一个简单的替代方案,可用于交互式命令行Poweshell会话

当您看到404响应的错误描述时,即

远程服务器返回错误:(404)未找到

然后,您可以通过输入以下内容从命令行中查看“最后一个错误”:

$Error[0].Exception.Response.StatusCode


或者你想从“Response”对象中知道的任何其他信息

谢谢,成功了。我没有意识到您可以从异常对象访问响应对象。是的,获取实际代码有点棘手。:-)我的目标是使用Chris Wahl的这段代码,这是一种稍微好一点的方法:$response=try{Invoke WebRequest}catch{$\ux.Exception.response},这样在这两种情况下都可以在$response变量中得到一些东西。但是请注意,失败返回一个HtmlWebResponse,而成功返回一个HtmlWebResponseObject。特别是,这些类型上的状态码是不同的(叹气…)对Rob的建议做了一些小的调整,以避免不同类型的问题:
$response=try{(调用WebRequest-Uri'localhost/foo'-ErrorAction Stop).BaseRequest}catch[System.Net.WebException]{$\ux.Exception.response}
。也就是说,获取
BaseRequest
可确保在成功和错误情况下,我们都能获得
HttpWebReqponse
。添加
[System.Net.WebException]
可确保我们仅以这种方式捕获相关异常/不会意外地扫过其他类型的问题。这对我来说很有效示例7:从Invoke WebRequest捕获未成功消息
$Error[0].Exception.Response.StatusDescription