我有一个/ 20networking,我想知道所有使用的IP地址和他们的属性,如MAC,名称和说明加上所有使用之间的免费地址,以便我有一个很长的名单,我可以看到地址是否被采取。 幸运的是我有一个Server2012,以便我可以使用Microsoft的CMDLets。 我的意见是要生成所有可能的地址。 最后我想要一个看起来像这样的清单:
IP, Mac, Name, Comment 19.0.0.0, 00:00:11:11:11:01, TestUser_1, This is the 1st Testuser . (here are some used and some free) . 19.0.2.45 (this one is free) . 19.0.6.3 (this one is free, too) 19.0.11.201, 11:22:33:44:55:66, TestUser_N, This is just another comment
Sampe代码:
$x=0 $y=0 $ipstring = "19.0." for ($i=$x;$i -le 15; $i++) { for ($j=$y;$j -le 255;$j++) { $gesIP = $ipstring+"$i"+"."+"$j" } }
上面的代码创build了19.0.0.0到19.0.15.255之间的地址
现在我需要得到我用过的地址:
$usedAddresses = Get-DhcpServerv4Reservation -ComputerName $env:computername -ScopeId ((Get-DhcpServerv4Scope -ComputerName $env:computername).IPAddress.IPAddressToString)
为了看女巫地址是免费的,我正在考虑比较地址。 我不太确定对象列表是否被sorting。 所以我尝试使用以下algorithm对它们进行sorting:
$IP_sort = $IPv4_res | Sort-Object {"{0:d3}.{1:d3}.{2:d3}.{3:d3}" -f @([int[]]$_.IPAddress.IPAddressToString.split('.'))}
之后,我救了他们
foreach ($ine in $IP_sort) { write-output ("{0} {1} {2} {3}" -f ($ine).IPAddress.IPAddressToString, ($ine).ClientId, ($ine).Description, ($ine).Name) | ac EnterPlaceAndTextfileHere }
现在我得到了2个sorting列表,我只需要比较对方。 第一个列表包含所有地址,第二个列表只包含使用的地址。
现在我需要比较这两个列表。 我试图像这样pipe理它:
if ($ges_IP -eq $IP_sort[$k].IPAddress.IPAddressToString) { write-output ("{0} {1} {2} {3}" -f ($IPv4_res[$k]).IPAddress.IPAddressToString, ($IPv4_res[$k]).ClientId, ($IPv4_res[$k]).Name, ($IPv4_res[$k]).Description) | ac EnterPlaceAndTextfileHere } else { $ges_IP | ac EnterPlaceAndTextfileHere }
现在我得到了一个可以sorting的大名单 – 希望。
但不幸的是我有一些错误。 有些地址与其他属性不匹配,有些地址的顺序不正确。 我想知道为什么…我的代码错了吗? 我是否觉得太复杂,或者PowerShell有时候会把这么多的地址放在错误的顺序,而这个“恰好发生”呢?
当使用Sort-Object您正在对IP地址进行sorting,因为它是一个string。
考虑:
19.0.9.234 19.0.15.5
当例子按string升序sorting时,19.0.9.234之前是19.0.15.5。
当15大于9时,当一个stringsorting时,只考虑同一string中的字符,即1到9。
一种解决scheme是将IP八位字节填充0,通过使string长度相同并将八位字节组合起来。 即015,009。
您可以使用Sort-Object作为计算属性或在存储每个源数据集之前执行此操作。
即
Sort-Object -Property @{ Expression = { [String]::Join('.', $_.IPAddress.IPAddressToString.Split('.').PadLeft('0', 3)); } }
希望有所帮助。
我知道这已经解决了,但我只是想在Google上find这个页面的人添加这个选项。
这种方式不使用任何string操作:
Get-DhcpServerv4Reservation -ComputerName $env:computername -ScopeId ((Get-DhcpServerv4Scope -ComputerName $env:computername).IPAddress.IPAddressToString) | sort -Property { [Version]$_.IPAddress.IPAddressToString }
要么
$dhcpreservations | sort -Property { [Version]$_.IPAddress.IPAddressToString }
编辑:删除系统Ryan Bolgar是正确的