
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가 더 빠른 방법이라고 생각하는 경향이 있습니다(목록과 찾을 항목을 하나씩 받는 '어디'와는 달리 두 목록을 모두 받기 때문에 더 빠른 검색 방법을 사용할 수 있습니다). .