Public/Network/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-Invocation $MyInvocation
  }

  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 {
    Out-Verbose $fxn "Complete."
  }
}