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