I wrote a PowerShell advanced function “Get-Subnet” to return a subnet mask for a given bit or bit range.
The cmdlet, with embedded help, including examples:
<# .Synopsis Returns a subnet mask for a given bit or bit range. .DESCRIPTION For a given number of bits, or range of bits, returns the equivilant subnet mask(s) and number of available hosts in that subnet. Returns NetworkBits, SubnetMask, NumberOfHosts for each bit. NetworkBits is provided for completeness, in the case of multiple objects returned. SubnetMask string is useful for situations where you know network bits and want to set a subnet mask on a network card. NumberOfHosts is useful for understanding implications of using a selected number of bits. .EXAMPLE PS C:\>Get-Subnet Returns: > NetworkBits SubnetMask NumberOfHosts > ----------- ---------- ------------- > 8 255.0.0.0 16777214 > 9 255.128.0.0 8388606 > 10 255.192.0.0 4194302 > 11 255.224.0.0 2097150 > 12 255.240.0.0 1048574 > 13 255.248.0.0 524286 > 14 255.252.0.0 262142 > 15 255.254.0.0 131070 > 16 255.255.0.0 65534 > 17 255.255.128.0 32766 > 18 255.255.192.0 16382 > 19 255.255.224.0 8190 > 20 255.255.240.0 4094 > 21 255.255.248.0 2046 > 22 255.255.252.0 1022 > 23 255.255.254.0 510 > 24 255.255.255.0 254 > 25 255.255.255.128 126 > 26 255.255.255.192 62 > 27 255.255.255.224 30 > 28 255.255.255.240 14 > 29 255.255.255.248 6 > 30 255.255.255.252 2 With no parameters, the command lists subnet masks for bit range 8 to 30. .EXAMPLE PS C:\>Get-Subnet -MinBits 20 -MaxBits 24 Returns: > NetworkBits SubnetMask NumberOfHosts > ----------- ---------- ------------- > 20 255.255.240.0 4094 > 21 255.255.248.0 2046 > 22 255.255.252.0 1022 > 23 255.255.254.0 510 > 24 255.255.255.0 254 Return a specific range of subnet masks. .EXAMPLE PS C:\>$a = (Get-Subnet -Bits 20).SubnetMask PS C:\>Write-Host "20 bit Subnet mask is $a" Returns: > 20 bit Subnet mask is 255.255.240.0 Store a specific subnet mask to a variable. #> function Get-Subnet { [CmdletBinding(DefaultParameterSetName='Parameter Set 1')] Param ( [Parameter(ParameterSetName='Parameter Set 1')] $Bits, [Parameter(ParameterSetName='Parameter Set 2')] $MinBits, [Parameter(ParameterSetName='Parameter Set 2')] $MaxBits ) if ($Bits -ne $null) { $MinBits = $Bits $MaxBits = $Bits } else { if ($MinBits -eq $null) { $MinBits = 8 } if ($MaxBits -eq $null) { $MaxBits = 30 } } foreach ($i in ($MinBits..$MaxBits)) { $binary = ([string]"1" * $i).PadRight(32,"0") $InvertedBinary = ([string]"0" * $i).PadRight(32,"1") $NumberOfHosts = [convert]::ToInt32($InvertedBinary,2) -1 $Oct1 = [string][convert]::ToInt32($binary.Substring(0,8),2) $Oct2 = [string][convert]::ToInt32($binary.Substring(8,8),2) $Oct3 = [string][convert]::ToInt32($binary.Substring(16,8),2) $Oct4 = [string][convert]::ToInt32($binary.Substring(24,8),2) $SubnetMask = $Oct1 + "." + $Oct2 + "." + $Oct3 + "." + $Oct4 [PsCustomObject]@{ "NetworkBits" = $i; "SubnetMask" = $SubnetMask; "NumberOfHosts" = $NumberOfHosts } } }