Powershell
Powershell - 排序對象,IP 地址列表
我有一個 /20 網路,我想知道所有使用的 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
範常式式碼:
$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" } }
上面的程式碼創建了 19.0.0.0 到 19.0.15.255 之間的地址
現在我需要獲取我使用過的地址:
$usedAddresses = Get-DhcpServerv4Reservation -ComputerName $env:computername -ScopeId ((Get-DhcpServerv4Scope -ComputerName $env:computername).IPAddress.IPAddressToString)
為了查看女巫地址是免費的,我正在考慮比較地址。我不太確定對象列表是否已排序。所以我嘗試使用以下算法對它們進行排序:
$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 個排序列表,我只需要在其中進行比較。第一個列表包含所有地址,第二個列表僅包含使用的地址。
現在我需要比較這兩個列表。我試圖這樣管理它:
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 }
現在我得到了一個大名單,希望能被排序。
但不幸的是,我遇到了一些錯誤。某些地址與其他屬性不匹配,某些地址的順序不正確。我想知道為什麼……我的程式碼錯了嗎?我是否認為太複雜或powershell有時會設法以錯誤的順序放置這麼多地址並且它有時“只是發生”?
使用時,
Sort-Object
您正在對 IP 地址進行排序,因為它是一個字元串。考慮:
19.0.9.234 19.0.15.5
當範例按字元串升序排序時,19.0.15.5 排在 19.0.9.234 之前。
雖然 15 大於 9,但當對字元串進行排序時,僅考慮相同字元串位置的字元,即 1 對 9。
一種解決方案是用 0 填充 IP 八位字節,從而使字元串具有相同的長度並將八位字節排列起來。即015、009。
您可以將其
Sort-Object
作為計算屬性或在儲存每個源數據集之前執行此操作。是的
Sort-Object -Property @{ Expression = { [String]::Join('.', $_.IPAddress.IPAddressToString.Split('.').PadLeft('0', 3)); } }
希望有幫助。