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} |