Powershell Web请求,不会在4xx / 5xx上抛出异常

时间:2013-10-01 17:29:54

标签: powershell

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

我试过写这个:

$client = new-object system.net.webclient

$response = $client.DownloadData($url)

以及:

$response = Invoke-WebRequest $url

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

即使无法加载页面,如何获取页面的状态代码?

3 个答案:

答案 0 :(得分:91)

试试这个:

try { $response = Invoke-WebRequest http://localhost/foo } catch {
      $_.Exception.Response.StatusCode.Value__}

这会引发异常,但这就是它的方式。

每条评论更新

为确保此类错误仍会返回有效回复,您可以捕获WebException类型的异常并获取相关的Response

由于对异常的响应属于System.Net.HttpWebResponse类型,而成功Invoke-WebRequest调用的响应属于Microsoft.PowerShell.Commands.HtmlWebResponseObject类型,要从两种方案中返回兼容类型,我们需要获取成功回复的BaseResponse,其类型为System.Net.HttpWebResponse

这个新的响应类型的状态代码是类型[system.net.httpstatuscode]的枚举,而不是一个简单的整数,所以你必须明确地将它转换为int,或者如上所述访问它的Value__属性以获得数字代码。

#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__

答案 1 :(得分:6)

由于Powershell 7.0版Invoke-WebRequest具有-SkipHttpErrorCheck开关参数。

-SkipHttpErrorCheck

此参数使cmdlet忽略HTTP错误状态,并且 继续处理回应。错误响应将写入 就好像他们成功一样。

PowerShell 7中引入了此参数。

docs pull request

答案 2 :(得分:0)

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

当您看到404响应的错误说明时,即

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

然后,您可以在命令行中输入以下内容来查看“最后的错误”:

$Error[0].Exception.Response.StatusCode

$Error[0].Exception.Response.StatusDescription

或者您想从“响应”对象中了解的其他信息。