2015-11-20 18 views
0

我正在尋找一種更有效的方式來從用戶獲取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.

回答

2

爲什麼你要在最後一個八位字節中輸入用戶類型,只是爲了切斷它並丟棄它?鑑於網絡不是全部/ 24,你確定這是一個很好的設計嗎?

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

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

替換擺脫的最後一位數字。循環爲數組中的三個數字中的每一個放入一個字符串。多重賦值將管道中出現的三個值放入三個變量中。 (PowerShell確實具有基本的IP地址類型,[ipaddress]"192.168.0.1",但它們太基本了,無法在這裏獲得很多幫助)。

2

我同意是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]也是這樣的,這是不幸的。