【问题标题】:Does "if any" in a foreach loop exist?foreach 循环中是否存在“如果有”?
【发布时间】:2018-10-04 21:22:52
【问题描述】:

我正在尝试梳理 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 状态码,如何更改此代码以检查所有应用程序池但以不同的错误代码退出?

【问题讨论】:

    标签: powershell iis foreach http-status-codes


    【解决方案1】:

    您可以这样做的一种方法是将返回的布尔值作为一个列表包含在内,并检查该列表是否包含该值。例如:

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

    【讨论】:

      【解决方案2】:

      我会在进入循环之前预先设置$errorcode,只有当请求的状态码不是200时才改变它的值。

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

      【讨论】:

      • 我也喜欢这种方法
      • 这不能解决我的问题,因为 foreach 循环的第一次迭代可能不等于 200,因此错误代码将设置为 1。但是下一次迭代可能等于 200,并且它会改变错误代码为 0。
      • @RaptorPete 这种方法不会在循环开始后将错误代码重置为 0,我认为这就是你想要的。
      • @briantist 我希望它设置 $errorcode=1 当任何 ($a in $appPool) 返回 200 以外的值时。这样,如果有 ($a in此特定服务器上的 $appPool) 失败。例如,如果 $appPool 中的最后一个 $a 确实返回了 200 的状态,那么您提供的这个 foreach 方法是否会改回 $errorcode=0?
      • @RaptorPete 这是我的回答,不,它不会在循环内将 $errorcode 重置为 0。是什么给了你这个想法?我发布的代码中没有任何内容(甚至建议)。
      猜你喜欢
      • 2013-11-12
      • 1970-01-01
      • 2010-09-28
      • 1970-01-01
      • 2020-09-21
      • 1970-01-01
      • 1970-01-01
      • 2012-01-26
      • 1970-01-01
      相关资源
      最近更新 更多