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