Powershell – sorting对象,IP地址列表

我有一个/ 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是正确的