you can modify the following
Connect-AzAccount
# Get all VNets
$vnets = Get-AzVirtualNetwork
# Initialize an empty array for the results
$results = @()
foreach ($vnet in $vnets) {
foreach ($subnet in $vnet.Subnets) {
$usedIPs = (Get-AzNetworkInterface -VirtualNetwork $vnet).IpConfigurations | Where-Object { $_.Subnet.Id -eq $subnet.Id } | Select-Object -ExpandProperty PrivateIpAddress
$ipAddressSpace = [System.Net.IPAddress]::Parse($subnet.AddressPrefix.Split("/")[0])
$subnetMask = [Convert]::ToInt32($subnet.AddressPrefix.Split("/")[1])
$ipRange = 1..([Math]::Pow(2, (32 - $subnetMask)) - 2)
$freeIPs = $ipRange | ForEach-Object { $ipAddressSpace.Address += 1; $ipAddressSpace } | Where-Object { $_.ToString() -notin $usedIPs }
$results += [PSCustomObject]@{
"VNetName" = $vnet.Name
"VNetAddressSpace" = ($vnet.AddressSpace.AddressPrefixes -join ', ')
"SubnetName" = $subnet.Name
"SubnetAddressSpace" = $subnet.AddressPrefix
"UsedIPs" = ($usedIPs -join ', ')
"FreeIPs" = ($freeIPs -join ', ')
}
}
}
# Export the results to a CSV file
$results | Export-Csv -Path "VNetIPReport.csv" -NoTypeInformation