# .SYNOPSIS check-ipv6-address.ps1 [
] .DESCRIPTION Checks the given IPv6 address for validity .EXAMPLE PS> .\check-ipv6-address.ps1 fe80::200:5aee:feaa:20a2 .LINK https://github.com/fleschutz/PowerShell .NOTES Author: Markus Fleschutz License: CC0 #> param([string]$Address = "") function IsIPv6AddressValid { param([string]$IP) $IPv4Regex = '(((25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})\.){3}(25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2}))' $G = '[a-f\d]{1,4}' $Tail = @(":", "(:($G)?|$IPv4Regex)", ":($IPv4Regex|$G(:$G)?|)", "(:$IPv4Regex|:$G(:$IPv4Regex|(:$G){0,2})|:)", "((:$G){0,2}(:$IPv4Regex|(:$G){1,2})|:)", "((:$G){0,3}(:$IPv4Regex|(:$G){1,2})|:)", "((:$G){0,4}(:$IPv4Regex|(:$G){1,2})|:)") [string] $IPv6RegexString = $G $Tail | foreach { $IPv6RegexString = "${G}:($IPv6RegexString|$_)" } $IPv6RegexString = ":(:$G){0,5}((:$G){1,2}|:$IPv4Regex)|$IPv6RegexString" $IPv6RegexString = $IPv6RegexString -replace '\(' , '(?:' # make all groups non-capturing [regex] $IPv6Regex = $IPv6RegexString if ($IP -imatch "^$IPv6Regex$") { return $true } else { return $false } } try { if ($Address -eq "" ) { $Address = read-host "Enter IPv6 address to validate" } if (IsIPv6AddressValid $Address) { write-host -foregroundColor green "OK - IPv6 address $Address is valid" exit 0 } else { write-warning "Invalid IPv6 address: $Address" exit 1 } } catch { write-error "⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])" exit 1 }