Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/EmptyTag/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell-我只想从ipconfig/displaydns返回空记录_Powershell - Fatal编程技术网

Powershell-我只想从ipconfig/displaydns返回空记录

Powershell-我只想从ipconfig/displaydns返回空记录,powershell,Powershell,这个主题是我的最终目标。使用Powershell,我成功地将“ipconfig/displaydns”的内容格式化为一个表,但我使用了一些公开发布的代码,而且我是Powershell的新手,所以我不完全理解它是如何工作的。我使用的问题是,它只返回以文本“recordname”开头的结果。这意味着任何没有记录或记录不存在的条目都不会被返回。我正在使用此代码尝试获取这些记录: Function Get-FailedDNSClientCache{ Invoke-Expression "IPC

这个主题是我的最终目标。使用Powershell,我成功地将“ipconfig/displaydns”的内容格式化为一个表,但我使用了一些公开发布的代码,而且我是Powershell的新手,所以我不完全理解它是如何工作的。我使用的问题是,它只返回以文本“recordname”开头的结果。这意味着任何没有记录或记录不存在的条目都不会被返回。我正在使用此代码尝试获取这些记录:

Function Get-FailedDNSClientCache{ 
    Invoke-Expression "IPConfig /DisplayDNS" | Select-String -Pattern "-----" -Context 2,1 |

        ForEach-Object{
            "" + $_.Context.PreContext[1]
            "" + $_.Line
            "" + $_.Context.Postcontext[0]
            "" + $_.Context.PreContext[2]
           }
       }
上面的代码为我提供了如下输出:

pagead.l.doubleclick.net
----------------------------------------
No records of type AAAA

s0-2mdn-net.l.google.com
----------------------------------------
Record Name . . . . . : s0-2mdn-net.l.google.com    

www.redditstatic.com
----------------------------------------
No records exist

s0-2mdn-net.l.google.com
----------------------------------------
Record Name . . . . . : s0-2mdn-net.l.google.com
pagead.l.doubleclick.net
----------------------------------------
No records of type AAAA

www.redditstatic.com
----------------------------------------
No records exist
我一直在尝试我找到的所有不同的过滤方法,但最终我没有返回任何数据、空字段,或者我只过滤掉以“Record Name”开头的文本行,而不是整个记录。我认为问题在于我需要将每个返回的记录创建为对象,而不是每一行,但我的尝试也失败了。我基本上希望我的输出像这样:

pagead.l.doubleclick.net
----------------------------------------
No records of type AAAA

s0-2mdn-net.l.google.com
----------------------------------------
Record Name . . . . . : s0-2mdn-net.l.google.com    

www.redditstatic.com
----------------------------------------
No records exist

s0-2mdn-net.l.google.com
----------------------------------------
Record Name . . . . . : s0-2mdn-net.l.google.com
pagead.l.doubleclick.net
----------------------------------------
No records of type AAAA

www.redditstatic.com
----------------------------------------
No records exist
在整个论坛上,我都看到了我的问题的点点滴滴得到了回答,我尝试了提供的大多数解决方案,但我认为我不理解一些基本的东西,无法正确地将它们组合在一起。请记住,我真的在努力理解我在做什么,所以信息越多越好。
TIA

您可以使用Get-DnsClientCache cmdlet并传入要搜索的状态标志。例如:

Get-DnsClientCache -Status NotExist

如果没有此功能,则可以基于

上述功能的代码为:

Function Get-DNSClientCache{ 
$DNSCache = @() 

Invoke-Expression "IPConfig /DisplayDNS" | 
Select-String -Pattern "Record Name" -Context 0,5 | 
    %{ 
        $Record = New-Object PSObject -Property @{ 
        Name=($_.Line -Split ":")[1] 
        Type=($_.Context.PostContext[0] -Split ":")[1] 
        TTL=($_.Context.PostContext[1] -Split ":")[1] 
        Length=($_.Context.PostContext[2] -Split ":")[1] 
        Section=($_.Context.PostContext[3] -Split ":")[1] 
        HostRecord=($_.Context.PostContext[4] -Split ":")[1] 
        } 
        $DNSCache +=$Record 
    } 
    return $DNSCache 
}

这些方法中的任何一种都将返回一个对象,您可以根据需要对其进行进一步操作。

使用
Where object
后上下文[0]
值包含字符串“No records”的匹配项进行筛选:

使用简单的正则表达式:

  • 单行线

    ([regex]'(?s)(\s+\n\s+-+\s+(.+?)\n')。匹配((ipconfig/displayDNS)-join“`n”)|?{$.groups[2]。value-notlike‘Record Name*’}}{$孤儿=@{}{$孤儿[$}.groups[1]。value]=${.groups[2]。value}{$孤儿}

  • 更具可读性,使用

输出:

键值
---                                          -----                  
mpa.one.microsoft.com没有AAAA类型的记录
我的路由器不存在任何记录
onlineconfigservice.ubi.com没有AAAA类型的记录
static3.cdn.ubi.com没有AAAA类型的记录
ubisoft-orbit.s3.amazonaws.com没有AAAA型记录
育碧软件-orbit-savegames.s3.amazonaws.com没有AAAA类型的记录

对不起,我应该提到……主要是Windows 7桌面环境。Get-DNSClientCache cmdlet不可用,并且我使用的函数可能不是以相同的方式编写的,因此状态查询失败。正则表达式很有希望,但如果我正确理解它,它将查找与“无记录”匹配的项。当DNS缓存中没有记录时,我一直在尝试寻找可能的结果列表,并且我在该位置看到了多种数据变化。我可以把一个不喜欢的“记录名”放在哪里?这是我用来获取DNS缓存的函数。正如您所说的,它非常适合在进行分析时操纵到更易于阅读的表中。但是,它使用字符串“recordname”作为起始参考点,并将其与接下来的五行文本一起用于剩余的解析。我需要的文本不包含该字符串,因此它看不到该字符串。基本上,我想要的是相反的结果。我测试了您推荐的交换机以确保安全,它返回了我已经获得的其余缓存。
$output = (ipconfig /displayDNS) -join "`n"
$rx = [regex]'(?s)(\S+)\n\s+-+\s+(.+?)\n'
$orphansSorted = [Collections.Generic.SortedDictionary[string,string]]::new()

forEach ($match in $rx.matches($output)) {
    $url = $match.groups[1].value
    $msg = $match.groups[2].value
    if ($msg -notlike 'Record Name*') {
        $orphansSorted[$url] = $msg
    }
}
$orphansSorted