如何修改PowerShell脚本以支持主机名/IP地址的主机连通性检查
修改后的PowerShell脚本(支持主机名/IP地址检查)
没问题,我帮你调整这个脚本,让它同时兼容主机名和IP地址的连通性检查。原脚本里的[System.Net.Dns]::GetHostByAddress()只能处理IP地址,遇到主机名就会抛出异常,所以我们先通过IP地址验证来区分输入类型,再选择对应的DNS查询逻辑。
以下是完整的修改后脚本:
$ComputersFile = "HostName.txt" $OutputFile = "Output.txt" $Computers = Get-Content $ComputersFile # 清空或创建输出文件 if (Test-Path $OutputFile) { Remove-Item $OutputFile } foreach ($Computer in $Computers) { $Computer = $Computer.Trim() # 去除首尾空格,避免空行干扰 if ([string]::IsNullOrEmpty($Computer)) { continue } # 跳过空行 $dnsInfo = $null $isIP = $false $ipAddress = $null # 先判断是否是有效的IP地址(兼容IPv4/IPv6) if ([System.Net.IPAddress]::TryParse($Computer, [ref]$ipAddress)) { $isIP = $true try { # IP地址反向解析主机名 $dnsInfo = [System.Net.Dns]::GetHostByAddress($ipAddress) } catch { $dnsInfo = "反向解析失败" } } else { # 主机名正向解析IP地址 try { $dnsInfo = [System.Net.Dns]::GetHostEntry($Computer) } catch { $dnsInfo = "正向解析失败" } } # 测试连通性 $isReachable = Test-Connection $Computer -Count 1 -ErrorAction SilentlyContinue # 构造输出行,保持你原来的分隔符格式 if ($isReachable) { if ($isIP) { $outputLine = "$Computer^Yes^$($dnsInfo.HostName)" } else { # 优先取IPv4地址(如果需要IPv6可调整筛选条件) $resolvedIP = $dnsInfo.AddressList | Where-Object { $_.AddressFamily -eq 'InterNetwork' } | Select-Object -First 1 $outputLine = "$Computer^Yes^$($resolvedIP.IPAddressToString)" } } else { $outputLine = "$Computer^No^$dnsInfo" } # 写入输出文件 Add-Content $OutputFile $outputLine } Write-Host "检查完成,结果已保存到 $OutputFile"
关键修改点说明:
- IP地址验证:用
[System.Net.IPAddress]::TryParse()来判断输入是否是有效的IP地址,比正则表达式更可靠,还能自动兼容IPv6 - DNS解析逻辑分支:
- 如果是IP地址,尝试反向解析获取主机名
- 如果是主机名,尝试正向解析获取IP地址
- 容错处理:添加了DNS解析失败的捕获,避免脚本中断,同时在输出里标注解析失败的情况
- 空行处理:添加了去除空格和跳过空行的逻辑,避免处理无效的输入行
- 输出格式兼容:保持了你原来的
^分隔符格式,方便后续导出或分析
内容的提问来源于stack exchange,提问作者Hassan
相关产品推荐
相关产品推荐

