powershell - 从两个对象创建对象的最佳方式

标签 powershell optimization foreach properties

我构建了这个,运行良好,运行和显示大约需要 7-9 秒。 我想知道是否有更快/最佳的方式来构建这个自定义对象?

如您所见,我想要来自 Win32_PNPsigneddriver 的所有驱动程序信息,但为此,我添加了 Win32_PNPentity 中的另外两个属性 (configmanagererrorcode状态)基于DeviceID。

这样,最终对象包含所有驱动程序,并显示使用该驱动程序的设备是否存在错误。

$poste = "COMPUTER1234"

$DriversUp = Get-WmiObject -computername $poste Win32_PNPsigneddriver |
             Where-Object {$_.DeviceName -ne $null} 
$Devices = Get-WmiObject -computername $poste Win32_PNPentity

$DriversDevices = foreach ($driver in $DriversUp) {
    $driver |
        Select-Object DeviceClass, Manufacturer, DeviceName,
            FriendlyName, DriverName, InfName,
            @{name='Status';expression={$Devices | Where-Object {$_.DeviceID -eq "$($driver.DeviceID)"} | Select-Object -ExpandProperty status}},
            @{name='ConfigManagerErrorCode';expression={$Devices | Where-Object {$_.DeviceID -eq "$($driver.DeviceID)"} | Select-Object -ExpandProperty ConfigManagerErrorCode}},
            @{name='DriverDate';expression={[DateTime]::ParseExact(($_.DriverDate).Split('.')[0], "yyyyMMddHHmmss", [System.Globalization.CultureInfo]::InvariantCulture)}},
            DriverVersion
}

$DriversDevices |
    Sort-Object DeviceClass |
    Out-GridView -Title "$poste - Drivers utilisés"

就像我说的,一切都已经正常了。不过,我很想知道是否有更快的方法!

最佳答案

从 PowerShell 3.0 开始,Get-WmiObject cmdlet 已被 Get-CimInstance 取代.

$poste = "COMPUTER1234"
$cimses = New-CimSession -ComputerName $poste
$p = & {$args} DeviceClass Manufacturer DeviceName FriendlyName DriverName `
               InfName DriverVersion DeviceID DriverDate
Get-CimInstance -CimSession $cimses -ClassName Win32_PnPSignedDriver `
                -Property $p -Filter 'DeviceName != NULL' |
  ForEach-Object {
    $dev = Get-CimInstance -CimSession $cimses -ClassName Win32_PnPEntity `
                           -Property Status, ConfigManagerErrorCode `
                           -Filter "PNPDeviceID='$($_.DeviceID.Replace('\', '\\'))'"
    [pscustomobject]@{
      DeviceClass = $_.DeviceClass
      Manufacturer = $_.Manufacturer
      DeviceName = $_.DeviceName
      FriendlyName = $_.FriendlyName
      DriverName = $_.DriverName
      InfName = $_.InfName
      Status = $dev.Status
      ConfigManagerErrorCode = $dev.ConfigManagerErrorCode
      DriverDate = '{0:yyyyMMddHHmmss}' -f $_.DriverDate
      DriverVersion = $_.DriverVersion
    }
  } | Sort-Object DeviceClass | Out-GridView -Title "$poste - Drivers utilisés"
Remove-CimSession -CimSession $cimses

在我的计算机上,Win32_PnPSignedDriver.DriverDate 成员的类型是 DateTime

Get-CimClass -ClassName Win32_PnPSignedDriver |
  Select-Object -ExpandProperty CimClassProperties |
  Where-Object Name -eq 'DriverDate' |
  Select-Object CimType | Format-Table -AutoSize

 CimType
 -------
DateTime

关于powershell - 从两个对象创建对象的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56330668/

相关文章:

用优化编译得到一个错误的条件

c++ - 为什么 `std::pair` 将 `std::tuple` 作为 ctor 参数类型而不是 `const std::tuple&`?

javascript - .forEach 循环 : use variable

regex - 使用indexof获取第三个斜杠

powershell - 是否可以在Powershell中创建自定义(结构化)数据类型?

c - 如何在 Visual Studio Code 集成终端中接受用户输入?

powershell - 重命名Powershell中的文件

python - 最小化组数,其中组元素的总和低于特定值

c# - 获取由 foreach 循环 mvc 生成的选中复选框

codeigniter - * foreach 里面的 foreach codeigniter 2?