PowerShell解析DNS后用ExpandProperty取NameHost报错的解决方法
解决PowerShell解析DNS后获取可用主机名数组的问题
问题分析
你遇到的报错是因为部分DNS解析结果不存在NameHost属性(比如解析失败返回的错误对象),导致Select-Object -ExpandProperty执行时抛出异常,但仍能收集到有该属性的有效结果。直接用未展开的对象数组传给Restart-Computer会失败,因为该 cmdlet 只接受字符串类型的主机名。
修复方案
方案1:过滤有效解析结果再提取属性
先筛选出包含NameHost属性的对象,再提取属性值,彻底消除报错:
# 读取DNS名称列表并解析,忽略解析失败的记录 $Hostname = foreach($Server in (Get-Content -Path "E:\PLM\tc_deploy.net\template\OnePLM_PROD_Servers.txt")) { Resolve-DnsName -Name $server -Type A -ErrorAction SilentlyContinue } # 仅提取存在NameHost属性的对象的属性值 $Resolved = $Hostname | Where-Object { $_.PSObject.Properties.Name -contains 'NameHost' } | Select-Object -ExpandProperty NameHost # 验证结果并执行重启 Write-Host "待重启主机:$($Resolved -join ', ')" Restart-Computer -ComputerName $Resolved -Force
方案2:直接用ForEach-Object安全提取属性
用ForEach-Object遍历,仅当属性存在时才收集值,逻辑更简洁:
$Resolved = Get-Content -Path "E:\PLM\tc_deploy.net\template\OnePLM_PROD_Servers.txt" | ForEach-Object { $result = Resolve-DnsName -Name $_ -Type A -ErrorAction SilentlyContinue if ($result.NameHost) { $result.NameHost } } # 此时$Resolved直接是字符串数组,可直接传给Restart-Computer Restart-Computer -ComputerName $Resolved -Force
关键说明
- 添加
-ErrorAction SilentlyContinue到Resolve-DnsName,可以忽略无效DNS名称、网络问题导致的解析失败记录,避免生成错误对象干扰后续处理。 - 两种方案最终都会生成纯字符串类型的主机名数组,完全符合
Restart-Computer的参数要求,同时彻底消除报错。
内容的提问来源于stack exchange,提问作者DelPantalone
相关产品推荐
相关产品推荐

