You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

PowerShell遍历站点数组:如何定位测试失败的具体站点?

解决PowerShell站点可用性测试的站点定位问题

嘿,我来帮你搞定这个问题!你的代码现在把所有站点的响应结果都存在$request数组里,但最后判断的时候没法对应到具体站点——因为你是在整个数组上检查StatusCode,这会返回所有状态码的集合,自然没法知道哪个站点出了问题。

方法1:循环内直接处理每个站点(推荐,实时反馈)

我们可以在遍历每个站点的时候就单独处理请求和状态检查,同时加上错误捕获(比如站点无法连接、DNS解析失败这类情况),这样就能直接定位到出问题的站点:

$site1 = "www.site1.com"
$site2 = "www.site2.com"
$site3 = "www.site3.com"
$sites = $site1, $site2, $site3

foreach ($site in $sites) {
    try {
        $request = Invoke-WebRequest $site -Method Head -ErrorAction Stop
        if ($request.StatusCode -ne 200) {
            Write-Host "Site *$site* is not working (Status Code: $($request.StatusCode))"
        } else {
            Write-Host "Site *$site* is working correctly (Status Code: 200)"
        }
    } catch {
        # 处理请求完全失败的场景(比如无法建立连接)
        Write-Host "Failed to reach site *$site*: $_"
    }
}

这段代码的好处是:

  • 每个站点的结果实时输出,一目了然
  • try/catch捕获了请求过程中可能出现的异常,不会因为一个站点失败导致整个脚本中断

方法2:存储站点与结果的对应关系(灵活扩展)

如果你想把所有结果保存下来后续处理(比如导出到文件),可以创建自定义对象来关联站点和状态信息:

$site1 = "www.site1.com"
$site2 = "www.site2.com"
$site3 = "www.site3.com"
$sites = $site1, $site2, $site3

# 收集每个站点的测试结果
$results = foreach ($site in $sites) {
    [PSCustomObject]@{
        Site       = $site
        StatusInfo = try {
            # 请求成功则返回状态码
            (Invoke-WebRequest $site -Method Head -ErrorAction Stop).StatusCode
        } catch {
            # 请求失败则返回错误信息
            $_.Exception.Message
        }
    }
}

# 筛选并输出失败的站点
$failedSites = $results | Where-Object { $_.StatusInfo -ne 200 }

if ($failedSites) {
    Write-Host "The following sites are not working:"
    $failedSites | ForEach-Object {
        Write-Host "- $($_.Site): $($_.StatusInfo)"
    }
} else {
    Write-Host "All sites are working correctly!"
}

这种方式的优势是可以对结果进行二次处理,比如通过$results | Export-Csv -Path "SiteStatus.csv" -NoTypeInformation把结果导出为CSV文件。

为什么你的原代码无法定位站点?

原代码中if ($request.StatusCode -ne "200")是在检查整个$request数组的StatusCode属性,这会返回一个包含所有站点状态码的数组(比如200,404,200),而不是逐个站点判断。所以当你用这个条件时,PowerShell会检查数组中的所有元素是否都不等于200,显然没法定位到具体哪个站点出问题。

内容的提问来源于stack exchange,提问作者Tomer Leibovich

火山引擎 最新活动