if else based on output of invoke-webrequest in PS

后端 未结 3 440
渐次进展
渐次进展 2020-12-22 07:36

Can someone help me capture only the StatusCode of invoke-webrequest below so that I can determine if a site is up (200) or down (any other code). I think essentially an if

3条回答
  •  不思量自难忘°
    2020-12-22 08:01

    There are more status codes that can be returned. See HTTP Status Codes.

    So maybe a bit more fine-grained script would be a better choice?

    $uri = $args[0]
    [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
    
    try{
        $status = [int](Invoke-WebRequest $uri -UseBasicParsing -DisableKeepAlive -Method Head).StatusCode
        switch ($status) {
            {$_ -ge 100 -and $_ -lt 200}  { Write-Output "The site is up. Statuscode: $status"; break }
            {$_ -ge 200 -and $_ -lt 300}  { Write-Output "The site is up. Statuscode: $status"; break }
            {$_ -ge 300 -and $_ -lt 400}  { Write-Output "The site is redirected. Statuscode: $status"; break }
            {$_ -ge 400 -and $_ -lt 500}  { Write-Output "Client error. Statuscode: $status"; break }
            {$_ -ge 500 -and $_ -lt 600}  { Write-Output "Server error. Statuscode: $status"; break }
            default { Write-Output "The site returned an unhandled status code. Statuscode: $status"}
        }
    }
    catch {
        Write-Error "An error occurred on Invoke-WebRequest.`r`n$($_.Exception.Message)"
    }
    

    Instead of the Invoke-WebRequest you could also use [System.Net.WebRequest]. Something like:

    $uri = $args[0]
    [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
    
    try{
        # Web request
        $res = ([System.Net.WebRequest]::Create($uri)).GetResponse()
    }
    catch {
        $res = $_.Exception.Response
    }
    $status = [int]$res.StatusCode
    switch ($status) {
        {$_ -ge 100 -and $_ -lt 200}  { Write-Output "The site is up. Statuscode: $status"; break }
        {$_ -ge 200 -and $_ -lt 300}  { Write-Output "The site is up. Statuscode: $status"; break }
        {$_ -ge 300 -and $_ -lt 400}  { Write-Output "The site is redirected. Statuscode: $status"; break }
        {$_ -ge 400 -and $_ -lt 500}  { Write-Output "Client error. Statuscode: $status"; break }
        {$_ -ge 500 -and $_ -lt 600}  { Write-Output "Server error. Statuscode: $status"; break }
        default { Write-Output "An unhandled error occurred. Statuscode: $status"}
    }
    # Dispose response if available
    if($res){ $res.Dispose() }
    

提交回复
热议问题