如何在Azure中获取NIC及关联虚拟机的实际名称?
这个问题很常见——你看到的Microsoft.Azure.Commands.Network.Models.PSResourceId其实是一个包含虚拟机资源ID的对象,而不是直接的名称。直接用Select Name, VirtualMachine只会显示对象类型,我们需要提取对象里的具体信息。下面给你几种实用的解决办法:
方法1:直接从资源ID中提取VM名称
Azure资源ID的格式是固定的:/subscriptions/{订阅ID}/resourceGroups/{资源组名}/providers/Microsoft.Compute/virtualMachines/{虚拟机名称},所以我们可以通过分割ID字符串来获取最后一段的VM名称。用PowerShell的计算属性就能实现:
Get-AzureRmNetworkInterface | Select-Object Name, @{ Name = "VirtualMachineName" Expression = { $_.VirtualMachine.Id.Split('/')[-1] } }
这段代码会给你返回两列:NIC名称和对应的VM名称,简洁高效。
方法2:关联VM命令获取完整信息
如果你需要VM的更多属性(比如资源组、虚拟机大小),可以把NIC和VM资源关联起来,遍历每个NIC并查询对应的VM:
$allNics = Get-AzureRmNetworkInterface foreach ($nic in $allNics) { $vmDetails = if ($nic.VirtualMachine.Id) { $vm = Get-AzureRmVM -ResourceId $nic.VirtualMachine.Id [PSCustomObject]@{ VMName = $vm.Name ResourceGroup = $vm.ResourceGroupName VmSize = $vm.HardwareProfile.VmSize } } else { [PSCustomObject]@{ VMName = "未绑定虚拟机" ResourceGroup = "N/A" VmSize = "N/A" } } [PSCustomObject]@{ NICName = $nic.Name VMName = $vmDetails.VMName VMResourceGroup = $vmDetails.ResourceGroup VMSize = $vmDetails.VmSize } }
这个方法还能处理那些没有绑定任何VM的NIC,返回更完整的状态信息。
方法3:使用Az模块(推荐,AzureRm已弃用)
如果你已经升级到最新的Az模块(AzureRm模块已经停止维护),可以用对应的Az命令实现同样的效果:
Get-AzNetworkInterface | Select-Object Name, @{ Name = "VirtualMachineName" Expression = { $_.VirtualMachine.Id.Split('/')[-1] } }
分割ID的方式依然是最直接的,如果你需要更复杂的资源关联,可以尝试Join-AzResource命令。
补充说明
为什么你原来的命令看不到VM名称?因为VirtualMachine字段是一个PSResourceId对象,它包含Id、ResourceGroupName等多个属性,直接用Select输出的话只会显示对象的类型名称,必须指定提取对象里的具体属性值才能看到实际名称。
内容的提问来源于stack exchange,提问作者Mohamed Wali

