Functions/Get-SubnetMaskIPv4.ps1
function Get-SubnetMaskIPv4 { <# .SYNOPSIS Gets a dotted decimal subnet mask given the number of bits in the mask .DESCRIPTION Gets a dotted decimal subnet mask given the number of bits in the mask. Can optionally include the number of bits. .PARAMETER Length A mandatory [int] or array of [int] for which you want the subnet mask. Can be fed from the pipeline. Aliased to both 'NetworkLength' and 'CIDR' .PARAMETER IncludeInput A switch controlling whether you want to see the CIDR length. Aliased to 'IncludeCIDR' for backward compatibility .EXAMPLE Get-SubnetMaskIPv4 -Length 22 -IncludeInput Length SubnetMask ------ ---------- 22 255.255.252.0 .EXAMPLE 22..25 | Get-SubnetMaskIPv4 -IncludeInput Length SubnetMask ------ ---------- 22 255.255.252.0 23 255.255.254.0 24 255.255.255.0 25 255.255.255.128 .EXAMPLE Get-SubnetMaskIPv4 23 Would return: 255.255.254.0 .OUTPUTS [psobject] if -IncludeInput switch specified [string] default .LINK https://www.Google.com #> [CmdletBinding()] [alias('Get-SubnetMaskIP')] param( [Parameter(ValueFromPipeline,Mandatory,HelpMessage='Enter the length of the subnet mask (1-32). Press ENTER with no other input to finish.')] [Alias('NetworkLength','CIDR')] [ValidateRange(1,32)] [int[]] $Length, [Alias('IncludeCIDR')] [switch] $IncludeInput ) begin { Write-Verbose -Message "Starting [$($MyInvocation.Mycommand)]" } process { foreach ($curLength in $Length) { $MaskBinary = ('1' * $curLength).PadRight(32, '0') $DottedMaskBinary = $MaskBinary -replace '(.{8}(?!\z))', '${1}.' $SubnetMask = ($DottedMaskBinary.Split('.') | foreach-object { [Convert]::ToInt32($_, 2) }) -join '.' if ($IncludeInput) { New-Object -typename PsObject -Property ([ordered] @{ Length = $curLength SubnetMask = $SubnetMask }) } else { Write-Output -InputObject $SubnetMask } } } end { Write-Verbose -Message "Ending [$($MyInvocation.Mycommand)]" } } |