如何在PowerShell中将VM的IP地址与子网前缀以斜杠拼接为一列?
最优实现:合并Azure VM IP地址与子网前缀到同一列
以下是修改后的完整PowerShell脚本,同时优化了执行效率(减少重复Azure API调用),实现IP地址与子网前缀的合并:
Connect-AzAccount -Confirm # 报告路径与文件名 $reportFile = "C:\Users\john\Desktop\Inventory\Final Scripts\IP Address Details_$(Get-Date -f dd.MM.yyyy).csv" # 预加载所有虚拟网络和子网的地址前缀到哈希表,避免重复API调用 $allVnets = Get-AzVirtualNetwork $subnetPrefixMap = @{} foreach ($vnet in $allVnets) { foreach ($subnet in $vnet.Subnets) { $subnetPrefixMap[$subnet.Id] = $subnet.AddressPrefix.Split("/")[-1] } } # 获取所有VM $vms = Get-AzVM # 获取关联了VM的网卡 $nics = Get-AzNetworkInterface | Where-Object { $null -ne $_.VirtualMachine } $ReportDetails = foreach ($nic in $nics) { $vm = $vms | Where-Object { $_.Id -eq $nic.VirtualMachine.Id } foreach ($ipConfig in $nic.IpConfigurations) { # 从哈希表快速获取子网前缀长度 $prefixLength = $subnetPrefixMap[$ipConfig.Subnet.Id] [PSCustomObject]@{ vm_name = $vm.Name ip_with_prefix = "$($ipConfig.PrivateIpAddress)/$prefixLength" interface_name = $nic.Name # 如需保留原单独字段,可取消注释以下两行 # ip_address = $ipConfig.PrivateIpAddress # netmask_prefix = $prefixLength } } } # 输出表格预览并导出CSV $ReportDetails | Sort-Object vm_name | Format-Table vm_name, ip_with_prefix, interface_name $ReportDetails | Export-Csv -NoTypeInformation -Path $reportFile
关键修改说明
- 性能优化:预加载子网前缀哈希表
原脚本在循环中反复调用Get-AzVirtualNetwork和Get-AzVirtualNetworkSubnetConfig,会产生大量重复API请求。通过提前一次性获取所有VNet和子网信息并存储到哈希表,后续只需通过子网ID直接查询,大幅提升执行速度。 - 字段合并逻辑
在创建自定义对象时,直接将私有IP地址与子网前缀长度拼接为ip_with_prefix字段,完全符合10.1.1.1/26的格式要求。若需保留原单独的IP和前缀字段,取消注释脚本中对应行即可。 - 代码简化
将原脚本中单独遍历IP地址的逻辑改为直接遍历网卡IP配置,同时获取IP地址和子网ID,逻辑更清晰,避免了IP与子网信息脱节的问题。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

