If you build virtual machines in Azure you may find this script useful.
Currently it’s not the fastest it could likely be if you have a large subnet but it works for my needs.
It mixes two resources to make what I needed.
Resources:
1. List IP addresses in a range (Microsoft – https://gallery.technet.microsoft.com/scriptcenter/List-the-IP-addresses-in-a-60c5bb6b)
2. Check IP Addresses Available in Azure Virtual Network (IT Pro Windows – http://windowsitpro.com/azure/check-ip-addresses-available-azure-virtual-network)
function Get-IPrange { <# .SYNOPSIS Get the IP addresses in a range .EXAMPLE Get-IPrange -start 192.168.8.2 -end 192.168.8.20 .EXAMPLE Get-IPrange -ip 192.168.8.2 -mask 255.255.255.0 .EXAMPLE Get-IPrange -ip 192.168.8.3 -cidr 24 #> param ( [string] $start , [string] $end , [string] $ip , [string] $mask , [int] $cidr ) function IP-toINT64 () { param ( $ip ) $octets = $ip .split( "." ) return [int64] ( [int64] $octets [0]*16777216 + [int64] $octets [1]*65536 + [int64] $octets [2]*256 + [int64] $octets [3]) } function INT64-toIP() { param ( [int64] $int ) return (( [math] ::truncate( $int /16777216)).tostring()+ "." +( [math] ::truncate(( $int % 16777216)/65536)).tostring()+ "." +( [math] ::truncate(( $int % 65536)/256)).tostring()+ "." +( [math] ::truncate( $int % 256)).tostring() ) } if ( $ip ) { $ipaddr = [Net.IPAddress] ::Parse( $ip )} if ( $cidr ) { $maskaddr = [Net.IPAddress] ::Parse((INT64-toIP -int ( [convert] ::ToInt64(( "1" * $cidr + "0" *(32- $cidr )),2)))) } if ( $mask ) { $maskaddr = [Net.IPAddress] ::Parse( $mask )} if ( $ip ) { $networkaddr = new-object net.ipaddress ( $maskaddr .address -band $ipaddr .address)} if ( $ip ) { $broadcastaddr = new-object net.ipaddress (( [system.net.ipaddress] ::parse( "255.255.255.255" ).address -bxor $maskaddr .address -bor $networkaddr .address))} if ( $ip ) { $startaddr = IP-toINT64 -ip $networkaddr .ipaddresstostring $endaddr = IP-toINT64 -ip $broadcastaddr .ipaddresstostring } else { $startaddr = IP-toINT64 -ip $start $endaddr = IP-toINT64 -ip $end } for ( $i = $startaddr ; $i -le $endaddr ; $i ++) { INT64-toIP -int $i } } function Get-FirstAvailableIP { <# .SYNOPSIS Get the first available IP address in a range .EXAMPLE Get-FirstAvailableIP vNetworkName 10.60.0.128 26 #> param ( [string] $networkName , [string] $networkIP , [int] $networkCIDR ) $setIP =0 foreach ( $ip in $( Get-IPrange -ip $networkIP -cidr $networkCIDR )) { $Address = Test-AzureStaticVNetIP -VNetName $networkName -IPAddress $ip If ( $Address .IsAvailable –eq $False ) { #Write-Host "$ip is not available" -ForegroundColor Red } else { #Write-Host "$ip is available" -ForegroundColor Green $setIP = $ip break } } Write-Output $setIP } |