Powershell

Powershell - 排序對象,IP 地址列表

  • June 27, 2021

我有一個 /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)); } }

希望有幫助。

引用自:https://serverfault.com/questions/638752