Functions/Test-IsValidIPv6.ps1
function Test-IsValidIPv6 { <# .SYNOPSIS Verifies if passed parameter is a valid IP v6 address .DESCRIPTION Verifies if passed parameter is a valid IP v6 address. Can take single string or array of strings. Can also accept input from the pipeline. .EXAMPLE Test-IsValidIPv6 '::1' Would return True .EXAMPLE Test-IsValidIPv6 -IPAddress '::1' -Verbose Would return VERBOSE: Starting Test-IsValidIPv6 VERBOSE: The string being tested if a valid IPv6 address is [::1] True VERBOSE: Ending Test-IsValidIPv6 .EXAMPLE '::1','invalid' | Test-IsValidIPv6 -IncludeInput Input Result ----- ------ ::1 True invalid False #> #region Param [CmdletBinding(ConfirmImpact = 'None')] [Outputtype('bool')] Param ( [parameter(ValueFromPipeLine, ValueFromPipeLineByPropertyName)] [Alias('IP')] [string[]] $IPAddress, [switch] $IncludeInput ) #endregion Param begin { Write-Verbose -Message "Starting [$($MyInvocation.Mycommand)]" } process { foreach ($i in $IPAddress) { try { Write-Verbose -Message "The string being tested if a valid IPv6 address is [$i]" $check = [ipaddress] $i # added check below to cover issue if enter only 3 octets # [ipaddress] "10.1.4" resolves to "10.1.0.4" if (($i -eq $check) -and ($check.AddressFamily -eq 'InterNetworkV6')) { if ($IncludeInput) { New-Object -TypeName psobject -Property ([ordered] @{Input = $i; Result = $true }) } else { Write-Output -InputObject $true } } else { if ($IncludeInput) { New-Object -TypeName psobject -Property ([ordered] @{Input = $i; Result = $false }) } else { Write-Output -InputObject $false } } } catch { if ($IncludeInput) { New-Object -TypeName psobject -Property ([ordered] @{Input = $i; Result = $false }) } else { Write-Output -InputObject $false } } } } end { Write-Verbose -Message "Ending [$($MyInvocation.Mycommand)]" } } |