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

Hyper-V中Get-VM加-ExpandProperty NetworkAdapters时Notes字段不返回问题

嘿,我帮你捋捋这个Hyper-V虚拟机信息采集的问题,针对你遇到的Notes字段返回异常,还有需要采集的那几项信息,给你两个实用的解决方案:

问题分析:为什么-ExpandProperty NetworkAdapters会导致Notes异常?

当你用-ExpandProperty NetworkAdapters的时候,PowerShell会把每个虚拟机的网卡数组「展开」——简单说就是一个虚拟机有N个网卡,就会生成N条记录,每条对应一个网卡。这时候Notes字段虽然会被复制到每条记录里,但如果虚拟机没有网卡,这条记录就可能丢失Notes;另外Notes本质是虚拟机对象的属性,不是网卡对象的属性,展开后系统可能无法正确关联,就会出现Notes字段为空的情况,这就是你遇到的「并非总能正常返回」的核心原因。

解决方案1:获取单条虚拟机汇总信息(包含所有IPv4地址)

如果希望每个虚拟机只显示一行,同时汇总它的所有IPv4地址、状态和Notes,可以用计算属性来替代-ExpandProperty,这样能完美保留Notes字段:

Get-VM | Select-Object `
    VMName,
    @{Name='VM状态'; Expression={$_.State.ToString().Replace('Running','运行').Replace('Off','停止')}},
    @{Name='IPv4地址'; Expression={$_.NetworkAdapters.IPAddresses | Where-Object {$_ -match '^(\d{1,3}\.){3}\d{1,3}$'} -join ';'}},
    Notes
  • 把状态字段转成你需要的「运行/停止」中文表述
  • 用正则过滤出纯IPv4地址,多个地址用分号拼接展示
  • 直接调用虚拟机对象的Notes属性,完全不会出现丢失或异常
解决方案2:获取网卡明细并关联Notes

如果需要查看每个虚拟机的单网卡明细,同时保留Notes信息,可以通过遍历虚拟机对象来绑定属性:

Get-VM | ForEach-Object {
    $currentVM = $_
    $currentVM.NetworkAdapters | Select-Object `
        @{Name='虚拟机名称'; Expression={$currentVM.VMName}},
        @{Name='虚拟机状态'; Expression={$currentVM.State.ToString().Replace('Running','运行').Replace('Off','停止')}},
        @{Name='IPv4地址'; Expression={$_.IPAddresses | Where-Object {$_ -match '^(\d{1,3}\.){3}\d{1,3}$'} -join ';'}},
        @{Name='虚拟机备注'; Expression={$currentVM.Notes}}
}
  • 先把当前虚拟机的信息存到变量$currentVM里
  • 遍历每个网卡时,通过计算属性把虚拟机的Notes绑定到网卡记录上,确保每条网卡信息都能正确关联到对应的备注

至于虚拟机的主机名(ComputerName/Hostname),你可以后续排查的时候注意:得确保虚拟机处于运行状态,而且Guest OS的Hyper-V集成服务已经启用,之后可以尝试用Get-VMGuestNetworkInterface或者远程执行hostname命令来获取,这个你说自行排查,我就不多啰嗦啦~

内容的提问来源于stack exchange,提问作者Alex Kwitny

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 09:07:55