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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 04:50:26