Mejora de la velocidad del objeto donde Powershell

Mejora de la velocidad del objeto donde Powershell

Quiero obtener una lista de mis reservas de DHCP desde mi servidor DHCP que ejecuta Windows Server 2012R2. La lista debe contener la IP, MAC, nombre, descripción y el estado del arrendamiento de la reserva (sólo para comprobar si el cliente está en línea o no). Sé que hay un CMDLet para obtener las reservas.

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

El resultado no contiene el estado del arrendamiento. Pero hay otro CMDLet para conseguirlo:

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

Ahora mi idea era crear un objeto personalizado que contenga todos los atributos que necesito.

$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)
}

Desafortunadamente, Where-Object es bastante lento cuando es necesario comparar datos de gran tamaño.
¿Existe alguna posibilidad de mejorar la velocidad del objeto dónde?

Respuesta1

Aquí hay un código queencontróy modificado para esto.

$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

Aunque no puedo probarlo, me inclino a pensar que Group-Object es un método más rápido (debido a que recibe ambas listas, puede usar métodos de búsqueda más rápidos, a diferencia de 'dónde', que recibe una lista y un elemento para encontrar) .

información relacionada