有人可以帮助我仅捕获下面的invoke-webrequest的StatusCode,以便使我确定站点是否处于启动状态(200)或关闭(任何其他代码)。我认为基本上需要if语句。
注意:我不需要invoke-webrequest的输出。这是我现在使用的代码:。\ websiteCheck.ps1 https://google.com
$url = $args[0]
[Net.ServicePointManager]::SecurityProtocol = "Tls11"
invoke-webrequest -uri $url -DisableKeepAlive -UseBasicParsing -Method head
返回比我需要更多的信息:
StatusCode : 200
StatusDescription : OK
Content :
RawContent : HTTP/1.1 200 OK
X-XSS-Protection: 1; mode=block
X-Frame-Options: SAMEORIGIN
Cache-Control: private, max-age=0
Content-Type: text/html; charset=UTF-8
Date: Wed, 20 Feb 2019 05:55:14 GMT
Expires: ...
Forms :
Headers : {[X-XSS-Protection, 1; mode=block], [X-Frame-Options, SAMEORIGIN], [Cache-Control, private,
max-age=0], [Content-Type, text/html; charset=UTF-8]...}
Images : {}
InputFields : {}
Links : {}
ParsedHtml :
RawContentLength : 0
我只想做类似的事情:
如果StatusCode = 200,则写主机“站点已启动” 否则写主机“该站点已关闭”
这必须基于invoke-webrequest,而不是像[Net.HttpWebRequest] $ req = [Net.WebRequest] :: Create($ url)之类的东西,因为否则它不能与执行多次重定向的url一起正常工作。
答案 0 :(得分:2)
还有更多状态码可以返回。参见HTTP Status Codes。
那么也许更细粒度的脚本会是更好的选择?
$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)"
}
您也可以使用Invoke-WebRequest
代替[System.Net.WebRequest]
。像这样:
$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() }
答案 1 :(得分:0)
使用property dereferences operator和if来完成工作。
$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."
}
上面的脚本已被修改,下面的一些评论已过时。
答案 2 :(得分:0)
这可能有效
$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."
}