IP-Calc.ps1
<#PSScriptInfo .VERSION 1.0.1 .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 ) 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} |