IP-calc.ps1


<#PSScriptInfo
 
.VERSION 1.0.3
 
.GUID cb059a0e-09b6-4756-8df4-28e997b9d97f
 
.AUTHOR saw-friendship@yandex.ru
 
.COMPANYNAME
 
.COPYRIGHT
 
.TAGS IP Subnet Calculator WildCard CIDR
 
.LICENSEURI
 
.PROJECTURI https://sawfriendship.wordpress.com/
 
.ICONURI
 
.EXTERNALMODULEDEPENDENCIES
 
.REQUIREDSCRIPTS
 
.EXTERNALSCRIPTDEPENDENCIES
 
.RELEASENOTES
 
 
#>


<#
 
.DESCRIPTION
IP Calculator for calculation IP Subnet
 
 .EXAMPLE
IP-Calc -IPAddress 192.168.0.0 -Mask 255.255.255.0
 
IP : 192.168.0.0
Mask : 255.255.255.0
PrefixLength : 24
WildCard : 0.0.0.255
IPcount : 256
Subnet : 192.168.0.0
Broadcast : 192.168.0.255
CIDR : 192.168.0.0/24
ToDecimal : 3232235520
IPBin : 11000000.10101000.00000000.00000000
MaskBin : 11111111.11111111.11111111.00000000
SubnetBin : 11000000.10101000.00000000.00000000
BroadcastBin : 11000000.10101000.00000000.11111111
 
 
 .EXAMPLE
IP-Calc -IPAddress 192.168.3.0 -PrefixLength 23
 
IP : 192.168.3.0
Mask : 255.255.254.0
PrefixLength : 23
WildCard : 0.0.1.255
IPcount : 512
Subnet : 192.168.2.0
Broadcast : 192.168.3.255
CIDR : 192.168.2.0/23
ToDecimal : 3232236288
IPBin : 11000000.10101000.00000011.00000000
MaskBin : 11111111.11111111.11111110.00000000
SubnetBin : 11000000.10101000.00000010.00000000
BroadcastBin : 11000000.10101000.00000011.11111111
 
 
 .EXAMPLE
IP-Calc -IPAddress 192.168.0.0 -WildCard 0.0.3.0
 
IP : 192.168.0.0
Mask : 255.255.252.255
PrefixLength : 30
WildCard : 0.0.3.0
IPcount : 4
Subnet : 192.168.0.0
Broadcast : 192.168.3.0
CIDR : 192.168.0.0/30
ToDecimal : 3232235520
IPBin : 11000000.10101000.00000000.00000000
MaskBin : 11111111.11111111.11111100.11111111
SubnetBin : 11000000.10101000.00000000.00000000
BroadcastBin : 11000000.10101000.00000011.00000000
 
 .EXAMPLE
IP-Calc -IPAddress 172.16.0.0 -PrefixLength 12
 
IP : 172.16.0.0
Mask : 255.240.0.0
PrefixLength : 12
WildCard : 0.15.255.255
IPcount : 1048576
Subnet : 172.16.0.0
Broadcast : 172.31.255.255
CIDR : 172.16.0.0/12
ToDecimal : 2886729728
IPBin : 10101100.00010000.00000000.00000000
MaskBin : 11111111.11110000.00000000.00000000
SubnetBin : 10101100.00010000.00000000.00000000
BroadcastBin : 10101100.00011111.11111111.11111111
 
 
 .EXAMPLE
IP-Calc -IPAddress 192.0.2.48 -PrefixLength 30 -CreateIParrayPassThru
 
192.0.2.48
192.0.2.49
192.0.2.50
192.0.2.51
 
#>
 


[CmdletBinding(DefaultParameterSetName="ParameterSet1")]
    param(
        [parameter(ParameterSetName="ParameterSet1",Position=0)][Alias("IP")][IPAddress]$IPAddress,
        [parameter(ParameterSetName="ParameterSet1",Position=1)][IPAddress]$Mask,
        [parameter(ParameterSetName="ParameterSet1",Position=1)][ValidateRange(0,32)][int]$PrefixLength,
        [parameter(ParameterSetName="ParameterSet1",Position=1)][Alias("Joker")][IPAddress]$WildCard,
        [Parameter(ParameterSetName="ParameterSet2",Position=2,ValueFromPipeline = $true)][string]$CIDR,
        [Parameter(Position=3)][switch]$CreateIParray,
        [Parameter(Position=4)][switch]$CreateIParrayPassThru
    )

    if($CIDR){
        [IPAddress]$IPAddress,[int]$PrefixLength = $CIDR -split '[^\d\.]' -match "\d"
    }
    if($PrefixLength){
        [IPAddress]$Mask = (([string]'1'*$PrefixLength + [string]'0'*(32-$PrefixLength)) -split "(\d{8})" -match "\d" | % {[convert]::ToInt32($_,2)}) -split "\D" -join "."
    }
    if($WildCard){
        $SplitWildCard = $WildCard -split "\." -match "\d"
        [IPAddress]$Mask = ($SplitWildCard | % {255 - $_}) -join "."
    }
    if($Mask){
        $SplitIPAddress = [int[]]@($IPAddress -split "\." -match "\d")
        $ToDecimal = ($SplitIPAddress | % -Begin {$i = 3} -Process {([Math]::Pow(256,$i))*$_; $i--} | measure -Sum).Sum
        $SplitMask = $Mask -split "\." -match "\d"
        $PrefixLength = 32 - ($SplitMask | % {256-$_} | % {[math]::Log($_,2)} | measure -Sum).Sum
        $IPBin = ($SplitIPAddress | % {[convert]::ToString($_,2).PadLeft(8,"0")}) -join "."
        $MaskBin = ($SplitMask | % {[convert]::ToString($_,2).PadLeft(8,"0")}) -join "."
        if((($MaskBin -replace "\.").TrimStart("1").Contains("1")) -and (!$WildCard)){
            Write-Warning "Mask Length error, you can try put WildCard"; break
        }
        $WildCard = ($SplitMask | % {255 - $_}) -join "."
        $Subnet = ((0..31 | % {@($IPBin -split "" -match "\d")[$_] -band @($MaskBin -split "" -match "\d")[$_]}) -join '' -split "(\d{8})" -match "\d" | % {[convert]::ToInt32($_,2)}) -join "."
        $SplitSubnet = [int[]]@($Subnet -split "\." -match "\d")
        $SubnetBin = ($SplitSubnet | % {[convert]::ToString($_,2).PadLeft(8,"0")}) -join "."
        $Broadcast = (0..3 | % {[int]$(@($Subnet -split "\." -match "\d")[$_]) + [int]$(@($WildCard -split "\." -match "\d")[$_])}) -join "."
        $SplitBroadcast = [int[]]@($Broadcast -split "\." -match "\d")
        $BroadcastBin = ($SplitBroadcast | % {[convert]::ToString($_,2).PadLeft(8,"0")}) -join "."
        $CIDR = $Subnet + '/' + $PrefixLength
        $IPcount = [math]::Pow(2,$(32 - $PrefixLength))
    }

    $Object = [ordered]@{
    'IP' = $IPAddress.IPAddressToString
    'Mask' = $Mask.IPAddressToString
    'PrefixLength' = $PrefixLength
    'WildCard' = $WildCard.IPAddressToString
    'IPcount' = $IPcount
    'Subnet' = $Subnet
    'Broadcast' = $Broadcast
    'CIDR' = $CIDR
    'ToDecimal' = $ToDecimal
    'IPBin' = $IPBin
    'MaskBin' = $MaskBin
    'SubnetBin' = $SubnetBin
    'BroadcastBin' = $BroadcastBin
    }
    
    if ($CreateIParray -or $CreateIParrayPassThru){
        $SplitSubnet = $Subnet -split "\." -match "\d"
        $SplitBroadcast = $Broadcast -split "\." -match "\d"
        $w,$x,$y,$z =  @($SplitSubnet[0]..$SplitBroadcast[0]),@($SplitSubnet[1]..$SplitBroadcast[1]),@($SplitSubnet[2]..$SplitBroadcast[2]),@($SplitSubnet[3]..$SplitBroadcast[3])
        $IParray = $w | % {$wi = $_; $x | % {$xi = $_; $y | % {$yi = $_; $z | % {$zi = $_; $wi,$xi,$yi,$zi -join '.'}}}}
        $Object.IParray = $IParray
    }
    
    
    if(!$CreateIParrayPassThru){[pscustomobject]$Object}else{$IParray}