1. ホーム
  2. powershell

[解決済み] 4xx/5xxで例外をスローしないPowershellウェブリクエスト

2023-03-16 22:14:14

質問

私は、Webリクエストを作成し、応答のステータスコードを検査する必要があるpowershellスクリプトを書いています。

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

$client = new-object system.net.webclient

$response = $client.DownloadData($url)

もこれと同じように

$response = Invoke-WebRequest $url

が、Web ページが成功ではないステータスコードを持つときはいつでも、PowerShell は先に進み、実際のレスポンスオブジェクトを与える代わりに例外をスローします。

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

どのように解決するのですか?

これを試してみてください。

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__