Powershell if else基于PS中invoke webrequest的输出
有人能帮我捕获下面invoke webrequest的状态码吗?这样我就可以确定一个站点是向上(200)还是向下(任何其他代码)。我认为基本上需要一个if-else语句 注意:我不需要invoke webrequest的输出。这是我现在运行的代码:。\websiteCheck.ps1 它返回的信息比我需要的多得多:Powershell if else基于PS中invoke webrequest的输出,powershell,Powershell,有人能帮我捕获下面invoke webrequest的状态码吗?这样我就可以确定一个站点是向上(200)还是向下(任何其他代码)。我认为基本上需要一个if-else语句 注意:我不需要invoke webrequest的输出。这是我现在运行的代码:。\websiteCheck.ps1 它返回的信息比我需要的多得多: StatusCode : 200 StatusDescription : OK Content : RawContent : HTTP
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
我只想做一些类似的事情:
$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() }
如果StatusCode=200,则写入主机“站点已启动”
否则写主机“站点已关闭”
这必须基于invoke webrequest,而不是类似于[Net.HttpWebRequest]$req=[Net.webrequest]::Create($url),因为否则它无法与执行多个重定向的url一起正常工作。使用和来执行此工作
$uri=$args[0]
[Net.ServicePointManager]::SecurityProtocol=([Net.SecurityProtocolType]::Tls12[Net.SecurityProtocolType]::Tls11[Net.SecurityProtocolType]::Tls[Net.SecurityProtocolType]::Ssl3)
试一试{
if((调用WebRequest$uri-UseBasicParsing-DisableKeepAlive-methodhead).StatusCode-eq 200){
写主机“站点已启动”
}
否则{
写下主机“站点已关闭”
}
}
抓住{
写下主机“站点已关闭”
}
上面的脚本已被修改,下面的一些注释已过时。使用和来完成工作
$uri=$args[0]
[Net.ServicePointManager]::SecurityProtocol=([Net.SecurityProtocolType]::Tls12[Net.SecurityProtocolType]::Tls11[Net.SecurityProtocolType]::Tls[Net.SecurityProtocolType]::Ssl3)
试一试{
if((调用WebRequest$uri-UseBasicParsing-DisableKeepAlive-methodhead).StatusCode-eq 200){
写主机“站点已启动”
}
否则{
写下主机“站点已关闭”
}
}
抓住{
写下主机“站点已关闭”
}
上面的脚本已被修改,下面的一些注释已过时。这可能有效
$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."
}
这可能有用
$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."
}
可以返回更多的状态代码。看 所以,也许更细粒度的脚本会是一个更好的选择
$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)"
}
您也可以使用[System.Net.WebRequest]
,而不是调用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() }
可以返回更多的状态代码。看
所以,也许更细粒度的脚本会是一个更好的选择
$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)"
}
您也可以使用[System.Net.WebRequest]
,而不是调用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() }
谢谢问题是,如果url没有解析,它会显示错误,例如:而不是“站点已关闭”。此外,它还返回:Invoke WebRequest:远程服务器返回错误:(404)Not Found。如果我的URL与此示例使用虚假URL类似,则真实URL的页面会在浏览器中打开。@yorkman会根据您的请求进行更新,现在它涵盖了这些情况。太棒了!谢谢你,凯西。工作很好,但我确实不得不使用它:[Net.ServicePointManager]::SecurityProtocol=“tls12,tls11,tls,ssl3”来支持站点可能使用的所有不同协议。@yorkman我认为这是tls版本的一些限制:PThanks。问题是,如果url没有解析,它会显示错误,例如:而不是“站点已关闭”。此外,它还返回:Invoke WebRequest:远程服务器返回错误:(404)Not Found。如果我的URL与此示例使用虚假URL类似,则真实URL的页面会在浏览器中打开。@yorkman会根据您的请求进行更新,现在它涵盖了这些情况。太棒了!谢谢你,凯西。工作很好,但我确实不得不使用它:[Net.ServicePointManager]::SecurityProtocol=“tls12,tls11,tls,ssl3”来支持站点可能使用的所有各种协议。@yorkman我想这是tls版本的一些限制:PThanks Theo!工作正常,但我需要再添加一个单独的写主机,它也将与您的写输出一起显示,我不知道如何做到这一点。我更喜欢你的脚本,因为它更详细,但我不得不使用Kexy的脚本,因为我很容易在那里添加那些写主机消息的内容。@yorkman当然,不用担心。但是,在开关
块中的中断
命令之前添加额外的写入主机
消息是非常容易的。谢谢,我估计了,但具体在哪里?开关块有5个不同的{$\ge,我想为每一个写一些东西。一个用于100到200范围,另一个用于200-300等等。我是否只在每个写输出的末尾但在中断之前添加它,然后在新的llne上?所以{write output“site is up”,然后在新行写主机“1”;中断}谢谢你,Theo!在所有的代码样本中,你是唯一一个不管URL状态都能完美工作的人。我真的很感激你的努力。“约克曼很高兴为你工作。如果你觉得我的答案解决了你的问题,请考虑通过点击来接受答案。✓ 在左边。请看。这将帮助其他有类似问题的人更容易找到它。谢谢Theo!工作得很好,但我需要添加一个单独的写入主机,它也将与您的写入输出一起显示,我不知道如何做到这一点。我更喜欢您的脚本,因为它更详细,但我必须使用Kexy的,因为我很容易添加它ose在那里写主机消息。@yorkman当然,不用担心。但是,在开关
块中的中断
命令之前添加额外的写主机
消息是非常容易的。谢谢,我想了一下,但具体在哪里?开关块有5个不同的{${ge's和我想为每一个写主机。一个用于100到200范围,另一个用于200-300等。我只是在每个写输出的末尾,但在中断之前,在新的llne上添加它吗?所以{write output“site is up”,然后在新行写主机“1”;中断}?谢谢Theo!在所有代码示例中,您的代码是唯一一个无论URL状态如何都能完美工作的代码。我非常感谢您的努力@