Windows-Server-2012

Powershell where-object 速度提升

  • November 24, 2014

我想從執行 Windows Server 2012R2 的 DHCP 伺服器獲取我的 DHCP 保留列表。該列表應包含 IP、MAC、名稱、描述和預訂的租約狀態(只是為了檢查客戶端是否線上)。我知道有一個 CMDLet 來獲得預訂。

$IP_res = (Get-DhcpServerv4Reservation -ComputerName $env:COMPUTERNAME -ScopeId 10.10.0.0)

結果不包含租約狀態。但是還有另一個 CMDLet 可以得到它:

$IP_lease =(Get-DhcpServerv4Lease -ComputerName $env:COMPUTERNAME -ScopeId 10.10.0.0)

現在我的想法是建構一個包含我需要的所有屬性的自定義對象。

$save =  New-Object System.Collections.Generic.List[System.Object]
foreach($line in $IP_res)
{
  $new_IP_Obj = "" | Select IP, MAC, Name, Description, LeaseStatus
  $var = $IP_lease | Where-Object {$_.ClientId -eq $line.ClientId } 
  $new_IP_Obj.IP = $line.IPAddress.IPAddressToString
  $new_IP_Obj.MAC = $line.ClientId
  $new_IP_Obj.Name = $line.Name
  $new_IP_Obj.Description = $line.Description 
  $new_IP_Obj.LeaseStatus = $var.AddressState
  $save.add(new_IP_obj)
}

不幸的是,當您需要比較大量數據時,Where-Object 非常慢。

有沒有機會提高 where-object 的速度?

這是我為此找到並修改的程式碼。

$Merged = @()
$Scopes = Get-DhcpServerv4Scope -ComputerName dc2008 #-ScopeId '10.1.230.0'
Foreach ($Scope In $Scopes) {
   $IP_res = (Get-DhcpServerv4Reservation -ComputerName dc2008 -ScopeId $Scope.ScopeId)
   $IP_lease =(Get-DhcpServerv4Lease -ComputerName dc2008 -ScopeId $Scope.ScopeId)

   $IP_lease + $IP_res | Group-Object -Property ClientId | ForEach {
       If ($_.group[1].AddressState -ne $null) {
           $Record = New-Object -TypeName psCustomObject -Property @{
               IP=$_.group[0].IPAddress.IPAddressToString;
               MAC=$_.group[0].ClientId;
               Name=$_.group[1].Name;
               Description=$_.group[0].Description;
               LeaseStatus=$_.group[1].AddressState
               };
           $Merged += $Record
       }
   }
}
$Merged | ft -AutoSize

雖然我無法證明,但我傾向於認為 Group-Object 是一種更快的方法(因為它接收兩個列表,他可以使用更快的搜尋方法,不像 ‘where’ 接收一個列表和一個要查找的項目) .

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