Powershell if else基于PS中invoke webrequest的输出

Powershell if else基于PS中invoke webrequest的输出,powershell,Powershell,有人能帮我捕获下面invoke webrequest的状态码吗?这样我就可以确定一个站点是向上(200)还是向下(任何其他代码)。我认为基本上需要一个if-else语句 注意:我不需要invoke webrequest的输出。这是我现在运行的代码:。\websiteCheck.ps1 它返回的信息比我需要的多得多: StatusCode : 200 StatusDescription : OK Content : RawContent : HTTP

有人能帮我捕获下面invoke webrequest的状态码吗?这样我就可以确定一个站点是向上(200)还是向下(任何其他代码)。我认为基本上需要一个if-else语句

注意:我不需要invoke webrequest的输出。这是我现在运行的代码:。\websiteCheck.ps1

它返回的信息比我需要的多得多:

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状态如何都能完美工作的代码。我非常感谢您的努力@