【问题标题】:Sites up or down check with powershell [duplicate]使用powershell检查站点向上或向下[重复]
【发布时间】:2020-11-05 11:57:39
【问题描述】:

如何为超过 1 个站点执行此脚本?我知道每个命令都有一个,但你能帮我如何为这个脚本添加这个循环吗?

    Begin {
    $webRequest = [Net.WebRequest]::Create("http://172.20.1.33:81");
}
Process {
    $validStatus = 200, 401

    try {
        $status = $webRequest.GetResponse().StatusCode.value__
    } catch {
        $status = $_.Exception.InnerException.Response.StatusCode.value__
    }
    
    if ($validStatus -contains $status) {
        Write-Host 'Site is up.'
    } else {
        Write-Host 'Site is down.'
    }
}

【问题讨论】:

  • 将您的部分函数转换为高级函数。然后只需将 URI 作为参数发送。

标签: powershell foreach


【解决方案1】:

您的代码看起来像是函数的一部分。你可以变成advanced function,把url变成parameter,接受多个值甚至管道输入。

function Test-Url {
    param(
        [Parameter(Position = 0, Mandatory, ValueFromPipeline)]
        [string[]]$Url,
        [int[]]$ValidStatus = (200, 401)
    )
    process {
        foreach ($item in $Url) {
            $webRequest = [Net.WebRequest]::Create($item)
            try {
                $response = $webRequest.GetResponse()
            }
            catch {
                $response = $_.Exception.InnerException.Response    
            }
            $statusCode = $null
            if ($response) {
                $statusCode = [int]$response.StatusCode
                $response.Close()
            }
            [PSCustomObject]@{
                Url = $item
                Online = $validStatus -contains $statusCode
                StatusCode = $statusCode
            }
        }
    }
}

并像这样使用它:

if ((Test-Url "http://172.20.1.33:81").Online) {
    Write-Host 'Site is up.'
} else {
    Write-Host 'Site is down.'
}

对于多个网站:

Test-Url "http://172.20.1.33:81", "http://172.20.1.34:81"
# or
"http://172.20.1.33:81", "http://172.20.1.34:81" | Test-Url

请注意,同样可以使用 PowerShell 的 Invoke-WebRequest

function Test-Url {
    param(
        [Parameter(Position = 0, Mandatory, ValueFromPipeline)]
        [string[]]$Url,
        [int[]]$ValidStatus = (200, 401)
    )
    process {
        foreach ($item in $Url) {
            $webRequest = [Net.WebRequest]::Create($item)
            try {
                $response = Invoke-WebRequest $item
            }
            catch {
                $response = $_.Exception.Response
            }
            $statusCode = $null
            if ($response) {
                $statusCode = [int]$response.StatusCode
            }
            [PSCustomObject]@{
                Url = $item
                Online = $validStatus -contains $statusCode
                StatusCode = $statusCode
            }
        }
    }
}

【讨论】:

  • 嘿,非常感谢您的快速回答! ,我将您的代码复制并粘贴到 powershell ISE,但没有发生任何事情
  • 对不起,也许我不明白或不正确.. 我不能在这里写我在屏幕上写的内容,因为字符太多了我怎么能告诉你我在尝试什么在 powershell 中运行?
  • 你是说这个? function Test-Url { param( [Parameter(Position = 0, Mandatory, ValueFromPipeline)]
  • 好的!但是对于多个站点它不起作用,我写了 2 个 url 一个用于工作站点,一个用于不工作,但我仍然得到 1 次按摩“站点已启动”
猜你喜欢
  • 2012-04-06
  • 1970-01-01
  • 2014-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-05
  • 2016-12-08
  • 1970-01-01
相关资源
最近更新 更多