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
相关产品推荐
相关产品推荐

