![Powershell where-object 速度改进](https://linux22.com/image/646631/Powershell%20where-object%20%E9%80%9F%E5%BA%A6%E6%94%B9%E8%BF%9B.png)
我想从运行 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”那样接收一个列表和一个要查找的项目)。