解决-DNS名称 - 格式化和错误捕获

7
我有一个域名列表,需要为每个域名列出名称服务器和名称服务器的IP地址。
格式化/更好的方法?
Resolve-DnsName google.com -Type NS -DnsOnly | Select Name, NameHost, IP4Address

Name           NameHost       IP4Address
----           --------       ----------
google.com     ns1.google.com
google.com     ns4.google.com
ns4.google.com                216.239.38.10
ns1.google.com                216.239.32.10

我已经简化了结果。我希望IP地址与其他数据出现在同一行上。快速的谷歌搜索告诉我如何向现有对象添加哈希。

$dl = gc C:\domains.txt
$result = $dl |
    Resolve-DnsName -Type NS -DnsOnly |
        Where { $_.IP4Address -like '' } |
        Select Name, NameHost, @{l="IPAddress";e={Resolve-DnsName google.com -Type A | Select -ExpandProperty IPAddress}}

对于上述问题,这是“正确/最佳的方式”吗?还是您建议其他方法。

其次,一些结果会失败并显示大量红色,我想捕获的重要信息是“DNS名称不存在”、“DNS服务器故障”,还有其他几个。如何捕获相关错误?我可以将其添加到新的哈希“列”中。我无法想出在我的代码中使用try,catch块的方法?

1个回答

9

将结果捕获到一个变量中,这样你就不必多次执行查询。来自变量的数据可以根据需要进行任意分割和处理。

如果您有大量主机名需要查询,请将以下整个块放入foreach循环中。

$name = 'google.com'

try{
    $dns = Resolve-DnsName -Name $name -Type NS -DnsOnly -ErrorAction Stop

    $IPhash = @{}

    $dns |
        Where-Object Section -eq Additional | 
        ForEach-Object {
            $IPhash.Add($_.name, $_.IP4Address)
        }

    $dns | 
        Where-Object Section -eq Answer | 
        Sort-Object NameHost |
        Select-Object Name, NameHost,
            @{N='IP';     E={$IPhash[$_.NameHost]}},
            @{N='Status'; E={'Resolved'}}
} Catch{
    [pscustomobject]@{
        Name = $name
        NameHost = ''
        IP = ''
        Status = $Error[0].Exception.Message
    }
}

我有一种感觉,直接将完整的域名列表传输到resolve-dnsname中无法完成任务。是否可以在catch块中向$dns对象添加另一个“列/字段”?这样,如果查询失败,它将是: 名称 名称主机 IP地址 错误 blahblah.com DNS查询失败。请注意,我无法格式化评论,blahblah.com应该位于名称标题下,“DNS查询失败”应该位于错误标题下,名称主机和IP地址为空。 - Aftab
就个人而言,出于报告的原因,我会将好的数据与坏的数据分开存储,但无论如何,请检查已编辑的解决方案。当解决方案成功时,添加一个“错误”列是没有意义的,所以我建议改为添加一个“状态”列,如下所示。 - Kiran Reddy
完美,正是我想要的。它将被导出为CSV文件,因此可以根据需要进行过滤。 - Aftab

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接