PowerShell过滤多值ServerAddresses获取非企业DNS地址问题
问题分析
你的原命令逻辑存在漏洞:ServerAddresses是一个数组,当直接用$_.serveraddresses -notlike "*10.*"时,PowerShell会对数组每个元素分别判断并返回布尔数组。只要数组里有一个元素满足-notlike条件,整个表达式就会被视为$true,导致同时包含企业DNS(10.、148.)和运营商DNS的条目被错误保留。
你需要的是**过滤掉所有包含10.或148.类IP的网卡DNS配置,只保留ServerAddresses中全为运营商IP的条目。
修正后的命令
兼容所有PowerShell版本的写法
Get-DnsClientServerAddress | Where-Object { $_.InterfaceAlias -eq "Ethernet" -and (@($_.ServerAddresses) | Where-Object { $_ -like "*10.*" -or $_ -like "*148.*" }).Count -eq 0 }
PowerShell 7+简洁写法
Get-DnsClientServerAddress | Where-Object { $_.InterfaceAlias -eq "Ethernet" -and $_.ServerAddresses -NotAny { $_ -like "*10.*" -or $_ -like "*148.*" } }
命令说明
- 先筛选出网卡别名是
Ethernet的条目 - 对每个条目的
ServerAddresses数组做校验:- 兼容写法:过滤出所有匹配企业DNS规则的IP,若结果数量为0,说明该网卡的DNS全是运营商IP,保留此条目
- 简洁写法:
-NotAny会直接检查数组中是否没有任何元素满足企业DNS规则,返回布尔值判断是否保留
内容的提问来源于stack exchange,提问作者Johnny Cakes
相关产品推荐
相关产品推荐

