是否基于PS中invoke-webrequest的输出

时间:2019-02-20 06:12:52

标签: powershell

有人可以帮助我仅捕获下面的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一起正常工作。

3 个答案:

答案 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 operatorif来完成工作。

$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."
}