You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 10:02:55