我正在尝试梳理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状态代码,则会退出并显示不同的错误代码?
答案 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
}
}