IP-Calc.ps1


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


<#
 
.DESCRIPTION
 IP Calculator
 
#>
 


[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
    )
    $Hash = @{}
    $Property = @("IP,Mask,PrefixLength,WildCard,IPcount,IPBin,MaskBin,SubnetBin,BroadcastBin,Subnet,Broadcast,CIDR,ToDecimal" -split ",")
    if($CreateIParray){$Property += 'IParray'}
    $Property | % {$Hash.Add($_, $Null)}
    $Object = New-Object -TypeName PSCustomObject -Property $Hash | select $Property
    
    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))
    }
    
    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.IP = $IPAddress.IPAddressToString
    $Object.Mask = $Mask.IPAddressToString
    $Object.PrefixLength = $PrefixLength
    $Object.WildCard = $WildCard.IPAddressToString
    $Object.IPcount = $IPcount
    $Object.IPBin = $IPBin
    $Object.SubnetBin = $SubnetBin
    $Object.BroadcastBin = $BroadcastBin
    $Object.MaskBin = $MaskBin
    $Object.Subnet = $Subnet
    $Object.Broadcast = $Broadcast
    $Object.CIDR = $CIDR
    $Object.ToDecimal = $ToDecimal
    
    if($CreateIParray){$Object.IParray = $IParray}
    if(!$CreateIParrayPassThru){$Object}else{$IParray}