function Get-FirstFreeIP { [CmdletBinding(DefaultParameterSetName="ByID")] param ( [parameter( Mandatory=$true, ValueFromPipeline=$true, ValueFromPipelineByPropertyName=$true, Position=0, ParameterSetName="ByCIDR" )] [ValidateScript({[ipaddress] $_.Split("/")[0] -and $_.Split("/")[1] -match "\d{1,2}"})] [ValidateNotNullOrEmpty()] [string] $CIDR, [parameter( Mandatory=$true, ValueFromPipeline=$true, ValueFromPipelineByPropertyName=$true, Position=0, ParameterSetName="ByID" )] [ValidateNotNullOrEmpty()] [int] $Id, [parameter( Mandatory=$false, ValueFromPipeline=$true, ValueFromPipelineByPropertyName=$true, Position=0, ParameterSetName="BySubnetObject" )] [ValidateNotNullOrEmpty()] [PS.IPAM.Subnetwork] $SubnetObject ) process { $_params = @{ Controller = [PS.IPAM.controllers]::subnets Method = "GET" } switch ($PSCmdlet.ParameterSetName) { "ByID" { $_subnetId = $Id; break } "ByCIDR" { $_subnetId = (Get-Subnet -CIDR $CIDR).id if (!$_subnetId) { throw "Cannot find subnet!" } break } "BySubnetObject" { $_subnetId = $SubnetObject.Id; break } } $_identifiers = @($_subnetId,"first_free") $_params.Add("Identifiers",$_identifiers) return Invoke-Request @_params | Select-Object @{n="Ip";e={$_}} } } Export-ModuleMember -Function Get-FirstFreeIP