非常感谢您帮助我修改下面的脚本,以便它可以检查并将 IP 地址和主机名列表转换为以下内容:
DomainController1 - 10.1.1.10 - UP
CoreGatewayRTR1 - 10.1.1.254 - DOWN
JohnPC01 - NO-IP-Address - DOWN
LindaLaptop02 - 10.1.1.234 - DOWN
.
.
.
对我来说,将 IP 转换为 DNSName,将 DNSName 转换为 IP,然后根据 Ping 检查在线状态是一项挑战,
以下是我目前能想到的脚本:
$computers= gc C:\ListOfDevices.txt
foreach ($computername in $computers) {
$DNS = [System.Net.Dns]::GetHostEntry($ComputerName)
$HostName = $DNS.HostName
$IP = $DNS.AddressList
Trap { Continue }
if (Test-Connection $DNS -erroraction SilentlyContinue -Count 1 ) {
write-host "$Hostname - $IP - UP" -ForegroundColor GREEN
}
else {
write-host "$Hostname - $IP - DOWN" -ForegroundColor RED
}
}
然而,上述脚本仍然有一个小的逻辑错误,如下所示:
所有结果总是显示为向下?
即使特定主机的 IP 地址只有一个,但结果总是会重复吗?
任何形式的帮助将不胜感激。
谢谢。
答案1
您的脚本失败,因为$DNS
变量不包含 DNS 名称。并且您正在将其发送到if
。
您应该发送$Hostname
至if
。
使用此代码它将起作用:
$computers= gc C:\ListOfDevices.txt
foreach ($computername in $computers) {
$DNS = [System.Net.Dns]::GetHostEntry($ComputerName)
$HostName = $DNS.HostName
$IP = $DNS.AddressList
Trap { Continue }
if (Test-Connection $HostName -erroraction SilentlyContinue -Count 1) {
write-host "$Hostname - $IP - UP" -ForegroundColor GREEN
}
else {
write-host "$Hostname - $IP - DOWN" -ForegroundColor RED
}
}
你将获得如下输出:
您的代码中还有另一个问题,您可能还没有发现。由于您定义变量的方式,$Hostname
当 DNS 名称不正确时,它不会改变。检查它并使用另一种技术定义它。
答案2
您可能希望在测试连接条件的末尾添加 -quiet,以便它仅返回布尔值。如果这样做,除了 $true 或 $false 之外,您还能获得更多数据。