IPNetCalc.psm1

function Get-IPv4Network {
    <#
    .DESCRIPTION
    calculation of an ip network
 
    .EXAMPLE
    Get-IPv4Network -CIDR 198.18.0.0/28
 
    IPAddress CIDR Subnet Mask Count
    --------- ---- ------ ---- -----
    198.18.0.0 198.18.0.0/28 198.18.0.0 255.255.255.240 16
 
 
    .EXAMPLE
    Get-IPv4Network -CIDR 198.18.0.0/15 | % Contains 198.19.1.1
    True
 
    .EXAMPLE
    Get-IPv4Network -CIDR 198.18.0.0/30 | % GetIPArray | ft IPAddressToString
 
    IPAddressToString
    -----------------
    198.18.0.0
    198.18.0.1
    198.18.0.2
    198.18.0.3
 
    .EXAMPLE
    Get-NetRoute -AddressFamily IPv4 | Get-IPv4Network | ? PrefixLength -ge 25
 
    CIDR Subnet Mask Count
    ---- ------ ---- -----
    127.0.0.1/32 127.0.0.1 255.255.255.255 1
    127.255.255.255/32 127.255.255.255 255.255.255.255 1
    192.168.36.17/32 192.168.36.17 255.255.255.255 1
 
    .EXAMPLE
    Get-NetRoute -AddressFamily IPv4 | Select-Object -Property *,@{n='net';e={Get-IPv4Network -CIDR $_.DestinationPrefix}} | ? {$_.net.Contains('8.8.8.8')} | Sort-Object -Property @{e={$_.net.PrefixLength};asc=$false},ifMetric | ft InterfaceMetric,DestinationPrefix,NextHop
 
    InterfaceMetric DestinationPrefix NextHop
    --------------- ----------------- -------
    35 0.0.0.0/0 192.168.0.1
    25 0.0.0.0/0 192.168.0.1
 
    .EXAMPLE
    [ipv4Network]'10.0.0.0/30' | % GetIPArray | % ToString
 
    10.0.0.0
    10.0.0.1
    10.0.0.2
    10.0.0.3
 
    .EXAMPLE
    [ipv4Network]::get_subnet('198.19.1.1','255.254.0.0') | % ToString
 
    198.18.0.0
 
    .EXAMPLE
    [ipv4Network]::get_mask_from_prefixlength(23) | % ToString
 
    255.255.254.0
 
    .EXAMPLE
    [ipv4Network]::get_wildcard('255.255.248.0') | % ToString
 
    0.0.7.255
 
    .EXAMPLE
    [ipv4Network]::check_mask('240.240.240.0')
 
    False
 
    .EXAMPLE
    ([ipv4Network[]]('10.0.1.0/24','10.0.2.0/24','10.0.3.0/24')).Includes('10.0.2.100')
 
    False
    True
    False
 
    .EXAMPLE
    ([ipv4Network[]]('10.0.1.0/24','10.0.2.0/24','10.0.3.0/24')).WhereIncludes('10.0.2.100')
 
    IPAddress CIDR Subnet Mask Count
    --------- ---- ------ ---- -----
    10.0.2.0 10.0.2.0/24 10.0.2.0 255.255.255.0 256
 
    #>


    [CmdletBinding()]
    [Alias("ipcalc")]
    param(
        [Parameter(Mandatory, ParameterSetName = 'CIDR', Position = 0, ValueFromPipelineByPropertyName)][Alias('DestinationPrefix')][string]$CIDR,
        [Parameter(Mandatory, ParameterSetName = 'Mask', Position = 1)][Parameter(Mandatory, ParameterSetName = 'PrefixLength', Position = 1)][IPAddress]$IPAddress,
        [Parameter(Mandatory, ParameterSetName = 'Mask', Position = 2)][IPAddress]$Mask,
        [Parameter(Mandatory, ParameterSetName = 'PrefixLength', Position = 2)][int]$PrefixLength
    )
    process {
        New-Object -TypeName IPv4Network -ArgumentList ([object[]]$PSBoundParameters.Values)
    }
}