从用户输入获取IP地址,生成3个其他静态IP

问题描述:

我正在寻找一种更有效的方式来从用户获取IP地址,将IP地址拆分成数组,敲掉最后一个字节,替换为特定数字,然后将数组加回到新的IP地址。从用户输入获取IP地址,生成3个其他静态IP

例如:用户输入IP:10.1.1.50。从这个输入中,我取前3个八位字节,然后生成10.1.1.1,10.1.1.10和10.1.1.11。我可以程序化地做到这一点,但似乎我做了相同的操作3次迭代,一个函数可能是有益的,但我的尝试失败。

$ip= $(read-host "Enter any IP Address") 

$gateway = $ip.split('.') 
$gateway[-1] = 1 
$gateway = $ipArray -join '.' 

$dns1 = $ip.split('.') 
$dns1[-1] = 10 
$dns1 = $dns1 -join '.' 

$dns2 = $ip.split('.') 
$dns2[-1] = 11 
$dns2 = $dns2 -join '.' 

我已经分离出的第一个3个字节与$threeOctets = $ip | Select-Object -First 3,工作正常,什么任何时候我操作就可以了,我似乎只是加上了1,那么10,然后是11而不是添加的在1上,然后回到前3个八位字节并添加一个10,然后返回并添加一个11.

为什么你要在最后一个八位字节中输入用户类型,只是为了切断它并丢弃它?鉴于网络不是全部/ 24,你确定这是一个很好的设计吗?

反正,没有真正的需要分割和加入,你可以:

$ip = (Read-Host "Enter an IP") -replace '\d+$' 
$gateway, $dns1, $dns2 = ('1','10','11' | foreach {"$ip$_"}) 

替换摆脱的最后一位数字。循环为数组中的三个数字中的每一个放入一个字符串。多重赋值将管道中出现的三个值放入三个变量中。 (PowerShell确实具有基本的IP地址类型,[ipaddress]"192.168.0.1",但它们太基本了,无法在这里获得很多帮助)。

我同意是TessellatingHeckler's answer说。但是我想用另一种方式来展示一些基本的错误修正,使用[ipaddress]

do{ 
    $ip = $(read-host "Enter any IP Address") 
} while(!($ip -as [ipaddress])) 

$octets = ([ipaddress]$ip).Getaddressbytes() 
$gateway, $dns1, $dns2 = '1','10','11' | ForEach-Object{$octets[3] = $_; $octets -join "."} 

这绝不是一个更好的方法。只是另一个。纠错并不完美,可以打破,但在某些情况下,它比裤子中的踢更好。

获取IP。将它转换为一个数组的八位字节。用管道值替换数组的最后一个元素。再次加入一段时间,使其再次成为有效的IP。

这是一个耻辱,[Ipaddress]类不会让你编辑八位字节到位。 [version]也是这样的,这是不幸的。