Powershell where-object 速度改進

Powershell where-object 速度改進

我想從執行 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的速度?

答案1

這是我的程式碼成立並為此進行了修改。

$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」接收一個列表和一個要尋找的項目) 。

相關內容