Windows-Server-2012
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 的速度?
這是我為此找到並修改的程式碼。
$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’ 接收一個列表和一個要查找的項目) .