Существует ли «если есть» в цикле foreach? - PullRequest
0 голосов
/ 05 октября 2018

Я пытаюсь прочесать пулы приложений 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 голосов
/ 05 октября 2018

Я бы предварительно установил $errorcode перед входом в цикл и изменил бы его значение только тогда, когда код состояния для запроса не равен 200.

$errorcode = 0
foreach ($a in $appPool) {
    ...
    if ($HTTP_Response.StatusCode.value__ -ne 200) {
        $errorcode = 1
    }
}
0 голосов
/ 05 октября 2018

Один из способов сделать это - включить возвращенные логические значения в список и просто проверить, что список содержит значение.Например:

$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]
...