我正在制作一个脚本来设置本地主机上的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
答案 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]?)