if else based on output of invoke-webrequest in PS

后端 未结 3 438
渐次进展
渐次进展 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 07:56

    This might work

    $uri = $args[0]
    
    [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
    
    try{
        if((Invoke-WebRequest $uri -UseBasicParsing -DisableKeepAlive -Method Head).StatusCode -eq 200)
        {
            Write-Output "The site is up."
        }
    }
    catch {
        Write-Output "The site is down."
    }
    
    0 讨论(0)
  • 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() }
    
    0 讨论(0)
  • 2020-12-22 08:08

    Use property dereferencesmember access operator and if to do the work.

    $uri = $args[0]
    
    [Net.ServicePointManager]::SecurityProtocol = ([Net.SecurityProtocolType]::Tls12, [Net.SecurityProtocolType]::Tls11, [Net.SecurityProtocolType]::Tls, [Net.SecurityProtocolType]::Ssl3)
    
    try {
        if ((Invoke-WebRequest $uri -UseBasicParsing -DisableKeepAlive -Method Head).StatusCode -eq 200) {
            Write-Host "The site is up."
        }
        else {
            Write-Host "The site is down."
        }
    }
    catch {
        Write-Host "The site is down."
    }
    

    The script above has been modified, some comments below are obsolete.

    0 讨论(0)
提交回复
热议问题