【问题标题】:How to Scan multiple Hostnames to resolve Ip addresses Powershell script如何扫描多个主机名以解析 IP 地址 Powershell 脚本
【发布时间】:2020-09-24 09:33:50
【问题描述】:

我正在寻求有关脚本的帮助,该脚本将读取包含服务器名称的文本文件并解析 IP 地址并将其导出到 csv 文件中。我为此使用 powershell 和 Test-Connection 命令。请参阅下面的代码 - 我收到错误 - 命令管道位置 1 的 cmdlet ForEach-Object 提供以下参数的值:Process[0]:

(删除了我的用户名并换成了 ***)

$array=@()
$computer=Get-Content -Path c:\Users\****\Desktop\ping_IP_host\computers.txt
ForEach ($server in $computer){
if(Test-Connection $server -Quiet)
{
try {
$IP=
[System.net.dns]::GetHostEntry($server).AddressList | %
{$_.IpAddressTostring}
}
catch {"Invalid HostName" - $server}

$obj = New-Object PSObject -Property @{
    Hostname=$server
    IP=$IP
    }
$array += $obj

else {
$IP="Invalid Host"
}
$obj = New-Object PSObject -Property @{
    Hostname=$server
    IP=$IP
    }
$array += $obj
}
}
$array | Export-Csv C:\Users\****\Desktop\ping_IP_host\results.csv

【问题讨论】:

  • 如果您缩进代码并正确设置括号,您可能会发现错误。因为现在是 else 块在 if 块完成之前出现,并且结束括号太多。
  • 感谢缩进提醒 - 设法识别错误:)

标签: powershell


【解决方案1】:

有错位的大括号、重复的代码、逻辑错误和未包装的对象。

正确缩进将帮助您找到错误和重复代码。

您构建的自定义对象确实包含 IPv4 和 IPv6 地址,因此您可能想要加入这 2 个地址或只选择 IPv4 地址 - 我不知道您的要求。

编辑:

不需要try..catch 块,因为它依赖于GetHostEntry() 获得$server 的DNS 查找结果,该结果已由test-connection 验证。简而言之,当主机不存在或主机不响应 ICMP 时,您的代码默认为 else 子句“无效主机”。 $IP = ([System.net.dns]::GetHostEntry($server).AddressList 周围的 try..catch 块应位于 Test-Connection 之前,因为错误意味着主机名无效,因此尝试 ping 没有意义。

注意:下面的代码没有考虑上面的编辑。

工作代码:

$array=@()
$computer=Get-Content -Path $env:userprofile\Desktop\ping_IP_host\computers.txt
ForEach ($server in $computer) {
    if (Test-Connection $server -Quiet -count 1) {
        try {
            $IP = ([System.net.dns]::GetHostEntry($server).AddressList | ForEach-Object {$_.IPAddressToString} ) -join ";"
        }
        catch {"Invalid HostName" - $server}
    }
    else {
        $IP="Invalid Host"
    }
    $obj = New-Object PSObject -Property @{
        Hostname = $server
        IP = $IP
    }
    $array += $obj
}

$array | Export-Csv -NoTypeInformation $env:userprofile\Desktop\ping_IP_host\results.csv

输出:

"IP","Hostname"
"216.58.206.68;2a00:1450:4002:803::2004","www.google.com"
"Invalid Host","jupiter"
"Invalid host","microsoft.com"

仅选择 IPv4 地址

$array=@()
$computer=Get-Content -Path $env:userprofile\computers.txt
ForEach ($server in $computer) {
    if (Test-Connection $server -Quiet -count 1) {
        try {
            $IP = [System.net.dns]::GetHostEntry($server).AddressList | Where-Object {$_.AddressFamily -eq 'InterNetwork'} | ForEach-Object {$_.IPAddressToString}
        }
        catch {"Invalid HostName" - $server}
    }
    else {
        $IP="Invalid Host"
    }
    $obj = New-Object PSObject -Property @{
        Hostname = $server
        IP = $IP
    }
    $array += $obj
}

$array | Export-Csv -NoTypeInformation $env:userprofile\Desktop\ping_IP_host\results.csv

输出:

"IP","Hostname"
"216.58.206.68","www.google.com"
"Invalid Host","jupiter"
"Invalid host","microsoft.com"

【讨论】:

  • 感谢上述麦克并指出错误。我现在能够获得所需的输出。虽然当我添加一个无效的主机时,catch 不起作用,但我得到了持续的错误 - 测试连接:测试与计算机的连接“测试”失败:在 C:\Users****\Desktop 中不知道这样的主机\ping_IP_host\scan_hosts.ps1:6 char:8 + if(Test-Connection $server){ + ~~~~~~~~~~~~~~~~ + CategoryInfo : ResourceUnavailable: (DVTEST108:String) [Test -Connection], PingException + FullyQualifiedErrorId : TestConnectionException,Microsoft.PowerShell.Commands.TestConnectionCommand
  • 确认,逻辑错误,让我用修正版编辑
猜你喜欢
  • 2014-10-13
  • 2013-03-25
  • 1970-01-01
  • 2019-09-29
  • 2017-06-20
  • 2011-03-12
  • 2014-02-26
  • 2013-01-29
  • 2016-07-05
相关资源
最近更新 更多