4xx / 5xxで例外をスローせずにPowershellWebリクエスト


82

Webリクエストを作成し、レスポンスのステータスコードを検査する必要があるPowerShellスクリプトを作成しています。

私はこれを書いてみました:

$client = new-object system.net.webclient

$response = $client.DownloadData($url)

これと同様に:

$response = Invoke-WebRequest $url

ただし、Webページに成功ステータスコードではないステータスコードがある場合は常に、PowerShellは先に進み、実際の応答オブジェクトを提供する代わりに例外をスローします。

ページの読み込みに失敗した場合でも、ページのステータスコードを取得するにはどうすればよいですか?


これは私にとってはうまくいきましたdocs.microsoft.com/en-us/powershell/module/… 例7:Invoke-WebRequestからの成功しなかったメッセージをキャッチします
user35202

回答:


121

これを試して:

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__

5
おかげで、それはうまくいきました。ExceptionオブジェクトからResponseオブジェクトにアクセスできることに気づいていませんでした。
jcarpenter2 2013年

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

6

PowerShellのバージョンので、7.0はInvoke-WebRequest持っている-SkipHttpErrorCheckスイッチパラメータを。

-SkipHttpErrorCheck

このパラメーターにより、コマンドレットはHTTPエラーステータスを無視し、応答の処理を続行します。エラー応答は、成功したかのようにパイプラインに書き込まれます。

このパラメーターは、PowerShell7で導入されました。

ドキュメント プルリクエスト


0

-SkipHttpErrorCheck はPowerShell7以降の最適なソリューションですが、まだ使用できない場合は、インタラクティブなコマンドラインPoweshellセッションに役立つ簡単な代替手段を次に示します。

404応答のエラーの説明が表示された場合、つまり、

リモートサーバーがエラーを返しました:(404)見つかりません。

次に、次のように入力すると、コマンドラインから「最後のエラー」を確認できます。

$Error[0].Exception.Response.StatusCode

または

$Error[0].Exception.Response.StatusDescription

または、 `Response 'オブジェクトから知りたいことは何でも。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.