Private/SplitNetwork.ps1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
function SplitNetwork { [CmdletBinding(DefaultParameterSetName='Mask')] param( [ipaddress]$IPAddress, [Parameter(ParameterSetName='Mask')] [ValidateScript({$_ -in $(GetValidMask)})] [ipaddress]$Mask, [Parameter(ParameterSetName='MaskLength')] [ValidateRange(0,32)] [int]$MaskLength, [int32]$SubnetCount ) begin{ # } process{ try{ $SNMask = switch ($PSCmdlet.ParameterSetName) { 'Mask' { $Mask } 'MaskLength' { $(GetValidMask)[$MaskLength] } } $MaxCount = GetMaxSubnetCount -Mask $SNMask $ParentNetworkID = GetNetworkID -IPAddress $IPAddress -Mask $SNMask if($SubnetCount -gt $MaxCount){throw "SubnetCount may not be greater than $MaxCount for mask $($SNMask.IPAddressToString)"} $bits = -1 do { $bits++ $splitCount = [math]::Pow(2,$bits) } until ($splitCount -ge $SubnetCount) $NewMask = $(GetValidMask).IndexOf($SNMask) + $bits $PartialSubnets = @(0..($splitCount-1)).ForEach({[ipaddress]($_ * [math]::Pow(2,(32-$NewMask)))}) $subnets = $PartialSubnets.foreach({@{IPAddress = [ipaddress]($ParentNetworkID.Address -bor $_.Address); MaskLength = $NewMask}}) $subnets } catch { $PSCmdlet.ThrowTerminatingError($_) } } end{} } |