Powershell Web请求,不会在4xx / 5xx上引发异常


82

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

我试过这样写:

$client = new-object system.net.webclient

$response = $client.DownloadData($url)

以及这个:

$response = Invoke-WebRequest $url

但是只要网页上的状态代码不是成功状态代码,PowerShell就会继续执行并引发异常,而不是给我实际的响应对象。

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


这对我有用docs.microsoft.com/en-us/powershell/module / ... 示例7:从Invoke-WebRequest捕获非成功消息
user3520245

Answers:


121

试试这个:

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

抛出一个异常真是令人讨厌,但这就是事实。

每个评论更新

为确保此类错误仍然返回有效的响应,您可以捕获这些类型的异常WebException并获取related 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__

5
谢谢,那行得通。我没有意识到您只能从Exception对象访问Response对象。
jcarpenter2

1
是的,要获取实际的代码号有些棘手。:-)
基思·希尔

我正在使用Chris Wahl的这段代码,wahlnetwork.com
2015/02/19

11
更好的方法是:$ response = try {Invoke-WebRequest localhost / foo } catch {$ _。Exception.Response}这样,在两种情况下,您都可以在$ response变量中得到一些东西。但是请注意,失败将返回HtmlWebResponse,而成功将返回HtmlWebResponseObject。特别是,这些代码上的StatusCode是不同的类型(叹息。)
Rob Cannon

4
对Rob的出色建议进行了一些小调整,以避免使用不同类型的问题:$response = try { (Invoke-WebRequest -Uri 'localhost/foo' -ErrorAction Stop).BaseRequest } catch [System.Net.WebException] { $_.Exception.Response }。即抓取BaseRequest确保在成功和错误情况下我们都能得到一个HttpWebReqponse。添加内容[System.Net.WebException]可确保我们仅以这种方式捕获相关异常,而不会意外清除其他类型的问题。
JohnLBevan '18年


0

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

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

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

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

$Error[0].Exception.Response.StatusCode

要么

$Error[0].Exception.Response.StatusDescription

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.