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
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."
}
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() }
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.