通过PowerShell调用WMI获取DNS配置时的重复及空值问题
解决PowerShell WMI获取DNS配置的重复值与空值问题
问题原因
- ComputerName重复:
Get-WmiObject返回了多个启用IP的网络适配器对象,直接访问$Result.DNSHostname会将所有适配器的主机名拼接成数组,若多个适配器对应同一主机名,就会出现重复值。 - DNSServerSearchOrder含空值:某个启用IP的适配器的DNS服务器配置中存在空条目,导致结果数组混入
$null。
修正方案
方案1:按单个适配器输出配置(保留每个适配器的独立信息)
遍历每个适配器对象,单独生成输出,同时过滤DNS服务器列表中的空值:
Get-WmiObject -Class Win32_NetworkAdapterConfiguration -Filter "IPEnabled = 'True'" -Property DNSServerSearchOrder,DNSHostname | ForEach-Object { [PSCustomObject]@{ ComputerName = $_.DNSHostname DNSServerSearchOrder = $_.DNSServerSearchOrder | Where-Object { $_ -ne $null } } }
方案2:合并所有适配器的配置(去重+去空)
提取唯一主机名,合并并过滤DNS服务器列表:
$Result = Get-WmiObject -Class Win32_NetworkAdapterConfiguration -Filter "IPEnabled = 'True'" -Property DNSServerSearchOrder,DNSHostname [PSCustomObject]@{ ComputerName = $Result.DNSHostname | Select-Object -Unique DNSServerSearchOrder = $Result.DNSServerSearchOrder | Where-Object { $_ -ne $null } | Select-Object -Unique }
原脚本问题说明
原脚本直接将整个结果集的属性赋值给单个PSObject的属性,导致属性值变为数组:
- 多个适配器的主机名重复时,数组出现重复元素;
- 部分适配器的DNS服务器配置有空值时,数组混入
$null。
内容的提问来源于stack exchange,提问作者Arbelac
相关产品推荐
相关产品推荐

