foreach循环中是否存在“如果有”?

时间:2018-10-04 21:22:52

标签: powershell iis foreach http-status-codes

我正在尝试梳理WebServer的应用程序池以检测每个应用程序的HTTP响应代码。我正在使用foreach循环来检查响应是否为200,但是如果响应之一不是200,我需要foreach循环才能继续并检查所有其他应用程序池。

$appPool = Get-WebApplication
foreach ($a in $appPool) {
    $app = $a.Attributes[0].Value;
    $url = "http://localhost$app/apitest/index"
    $HTTP_Request = [System.Net.WebRequest]::Create($url)
    $HTTP_Response = try{
        $HTTP_Request.GetResponse()
    } catch {
        $exceptionMessage = $_.Exception.Message
        $exceptionItem = $app
    }
    $HTTP_Status = [int]$HTTP_Response.StatusCode

    if ($HTTP_Status -eq 200) {
        $errorcode = 0
    } elseif ($HTTP_Status -ne 200) {
        $errorcode = 1
    } else {
        $errorcode = 2
    }
}

我发现任何应用程序池返回什么都没有关系,因为循环随最后一个应用程序返回的内容而退出。如果应用3返回503,但最后一个应用返回200,则foreach循环返回200,并以$errorcode = 0退出。

如何更改此代码以检查所有应用程序池,但是如果中间的应用程序没有200状态代码,则会退出并显示不同的错误代码?

2 个答案:

答案 0 :(得分:3)

执行此操作的一种方法是将返回的布尔值包含在列表中,然后仅检查列表中是否包含该值。例如:

$results =  foreach($n in 1..10) { 
    $n -eq 5 
}

if ($results -contains $true) {
    Write-Host "There was a 5"
}

以您的示例为例,

$appPool = get-webapplication
$results = foreach($a in $appPool) {

    $app = $a.Attributes[0].Value;
    $url = "http://localhost$app/apitest/index"
    $HTTP_Request = [System.Net.WebRequest]::Create($url)
    $HTTP_Response = try { 
        $HTTP_Request.GetResponse() 
    } catch { 
        $exceptionMessage = $_.Exception.Message
        $exceptionItem = $app
    }
    [int]$HTTP_Response.StatusCode -ne 200
}

if ($results -contains $true) {
    $errorcode = 1
} else {
    $errorcode = 0
}

我不想弄乱示例,但实际上我可以这样做:

$errorcode = $results -contains $true -as [int]

答案 1 :(得分:2)

我会在进入循环之前预先设置$errorcode,并且仅在请求的状态码不是200时才更改其值。

$errorcode = 0
foreach ($a in $appPool) {
    ...
    if ($HTTP_Response.StatusCode.value__ -ne 200) {
        $errorcode = 1
    }
}