You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell批量获取主机IP导出CSV:解决无效主机名中断问题

解决PowerShell DNS查询遇到无效主机名停止运行的问题

原脚本的核心问题是:[System.Net.Dns]::GetHostByName()遇到无法解析的主机名时会直接抛出异常,而非返回null,导致脚本终止执行。要实现跳过无效主机或标记为N/A,需要用try/catch块捕获异常并处理。

以下是两种优化方案,按需选择:

方案1:为无效主机名标记IP为"N/A"(保留记录)

这种方式会把所有主机名都写入CSV,无法解析的IP列填N/A:

$Servers = Get-Content -Path "./complist.txt"
$results = foreach ($Server in $Servers) {
    $Server = $Server.Trim()
    $ipAddress = "N/A"
    
    try {
        # 推荐用GetHostEntry替代过时的GetHostByName
        $dnsCheck = [System.Net.Dns]::GetHostEntry($Server)
        if ($dnsCheck.AddressList) {
            $ipAddress = $dnsCheck.AddressList[0].ToString()
        }
    }
    catch {
        # 捕获解析异常,保持IP为N/A
    }

    [PSCustomObject]@{
        "Server name" = $Server
        "IP Address"  = $ipAddress
    }
}

$results
$results | Export-Csv -Path "./pingstatus.csv" -NoTypeInformation

方案2:直接跳过无效主机名(不保留记录)

如果不需要记录无法解析的主机,可在异常捕获时跳过当前循环:

$Servers = Get-Content -Path "./complist.txt"
$results = foreach ($Server in $Servers) {
    $Server = $Server.Trim()
    
    try {
        $dnsCheck = [System.Net.Dns]::GetHostEntry($Server)
        if ($dnsCheck.AddressList) {
            [PSCustomObject]@{
                "Server name" = $Server
                "IP Address"  = $dnsCheck.AddressList[0].ToString()
            }
        }
    }
    catch {
        # 跳过无效主机,不添加到结果集
        continue
    }
}

$results
$results | Export-Csv -Path "./pingstatus.csv" -NoTypeInformation

关键改进说明

  • 用try/catch捕获DNS解析异常,避免脚本中途终止
  • 替换微软已标记为过时的GetHostByName为GetHostEntry
  • 用foreach直接输出对象到结果集,比数组累加+=效率更高

内容的提问来源于stack exchange,提问作者Ken Robertson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 08:09:24