验证用户输入的IP地址

时间:2017-04-11 03:48:39

标签: powershell

我正在制作一个脚本来设置本地主机上的IP,子网掩码,网关和DNS服务器地址。我有一个工作脚本,但我想确保输入的IP地址是数字字符,并且每个Octet的范围在0-255之间。 任何帮助将不胜感激。

     $IP = Read-Host -Prompt 'Please enter the Static IP Address.  Format 192.168.x.x'
                $MaskBits = 24 # This means subnet mask = 255.255.255.0
                $Gateway = Read-Host -Prompt 'Please enter the defaut gateway IP Address.  Format 192.168.x.x'
                $Dns = Read-Host -Prompt 'Please enter the DNS IP Address.  Format 192.168.x.x'
                $IPType = "IPv4"

            # Retrieve the network adapter that you want to configure
               $adapter = Get-NetAdapter | ? {$_.Status -eq "up"}

           # Remove any existing IP, gateway from our ipv4 adapter
 If (($adapter | Get-NetIPConfiguration).IPv4Address.IPAddress) {
    $adapter | Remove-NetIPAddress -AddressFamily $IPType -Confirm:$false
}

If (($adapter | Get-NetIPConfiguration).Ipv4DefaultGateway) {
    $adapter | Remove-NetRoute -AddressFamily $IPType -Confirm:$false
}

 # Configure the IP address and default gateway
$adapter | New-NetIPAddress `
    -AddressFamily $IPType `
    -IPAddress $IP `
    -PrefixLength $MaskBits `
    -DefaultGateway $Gateway

# Configure the DNS client server IP addresses
$adapter | Set-DnsClientServerAddress -ServerAddresses $DNS

3 个答案:

答案 0 :(得分:6)

检查link。您可以将给定字符串强制转换为[ipaddress]

PS C:\Windows\system32> [ipaddress]"192.168.1.1"

以上示例不会产生错误。如果您使用的IP地址无效:

PS C:\Windows\system32> [ipaddress]"260.0.0.1"
Cannot convert value "260.0.0.1" to type "System.Net.IPAddress". Error: "An 
invalid IP address was specified."
At line:1 char:1
+ [ipaddress]"260.0.0.1"
+ ~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : InvalidArgument: (:) [], RuntimeException
+ FullyQualifiedErrorId : InvalidCastParseTargetInvocation

您将收到可以捕获的异常。

答案 1 :(得分:1)

这是结合上述两个答案的方法。
对于基本验证,此 oneliner 可以提供帮助

[bool]("text" -as [ipaddress])

但是用户可以输入类似 "100" 的内容,它会成功验证到 IP 地址 0.0.0.100
这可能不是您所期望的。
所以我喜欢结合使用正则表达式和类型验证:

function IsValidIPv4Address ($ip) {
    return ($ip -match "^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$" -and [bool]($ip -as [ipaddress]))
}

答案 2 :(得分:-1)

使用正则表达式

$ipRegEx="\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}"
if($ip -notmatch $ipRegEx)
{
   #error code
}

您可以在线搜索有关IP的正则表达式和示例。请记住,powershell是建立在.NET之上的,因此在搜索和读取正则表达式时,请关注.NET或C#。例如this

<强>更新 正如之后通过注释指出的那样,正则表达式是不正确的,但它是作为正则表达式验证的示例发布的。替代方案可以是((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)