Анализирайте изхода на pnputil до публикувано име за конкретен клас

В PowerShell, след като напиша "pnputil.exe -e", получавам списък с информация за драйвера, както е показано по-долу. Трябва да получа публикуваното име на монитора на класа от списъка и да съхраня "oem8.inf" в $monitor_name. Коя команда мога да използвам за търсене на class = monitor и извличане на публикуваното му име в променлива. Тъй като атрибутът "публикувано име" има място, така че нямам представа как да направя това да работи.

Published name :            oem8.inf    
Driver package provider :   HP
Class :                     Monitors
Driver date and version :   07/25/2013 2.2.0.0    
Signer name :               Microsoft Windows Hardware Compatibility Publisher

Published name :            oem6.inf
Driver package provider :   Canon
Class :                     Printers
Driver date and version :   06/21/2006 6.1.7600.16385
Signer name :               Microsoft Windows

Published name :            oem1.inf
Driver package provider :   Microsoft
Class :                     Printers
Driver date and version :   06/21/2006 10.0.14393.0
Signer name :               Microsoft Windows

person John    schedule 07.06.2017    source източник
comment
Моля, вижте помощната страница Как да зададете добър въпрос. Какво сте опитвали досега и с какви грешки/проблеми сте се сблъсквали? StackOverflow не е услуга за писане на код. В идеалния случай предоставете минимален, пълен и проверим пример   -  person G42    schedule 07.06.2017


Отговори (3)


Можете да направите това с помощта на WMI, чрез Get-WMIObject cmdlet (псевдоним gwmi):

gwmi Win32_PnPSignedDriver | ? DeviceClass -eq "MONITOR"

ще върне някои подробности, можете да го стесните до InfName, като използвате това:

gwmi win32_PnPSignedDriver | ? DeviceClass -eq "MONITOR" | Select InfName

InfName
-------
oem30.inf
oem30.inf
person colsw    schedule 07.06.2017

Полезният отговор на ConnorLSW е правилният начин и неговият подход илюстрира важна точка:

Ако използвате PowerShell cmdlets, няма няма нужда от манипулиране на низове, за да извлечете информация - обектно-ориентираният характер на PowerShell позволява решения, които са както по-здрави, така и по-удобни в сравнение с традиционните техники за разбор на изходен текст.

Въпреки това, ако е необходимо, PowerShell също има мощни функции за анализ на низове:

$monitor_name = pnputil.exe -e | Select-String -Context 2 'Class :\s+ Monitors' | 
  ForEach-Object { ($_.Context.PreContext[0] -split ' : +')[1] }

С вашия примерен вход това дава:

oem8.inf
person mklement0    schedule 07.06.2017

Маркиране и на mklement0 полезен отговор. Ако някога имате нужда от всички обектни данни само за монитори, можете да направите това.

Clear-Host
(PNPUtil /Enum-Drivers /class Display | 
Select-Object -Skip 2) | 
Select-String -Pattern 'Monitors' -Context 3,4
# Results
<#
  Published Name:     oe...
  Original Name:      tpl...
  Provider Name:      L...
> Class Name:         Monitors
  Class GUID:         {4d36e...
  Driver Version:     11/...
  Signer Name:        Microsof...

  Published Name:     oem...
  Original Name:      tp...
  Provider Name:      L....
> Class Name:         Monitors
  Class GUID:         {4d36...
  Driver Version:     06/...
  Signer Name:        Microsof...
#>

Изберете черешката, ако е необходимо, или създайте и използвайте customobject, за да получите вашите свойства по същия начин, и след това просто изберете. Например:

Clear-Host
((PNPUtil /Enum-Drivers /class Display | 
Select-Object -Skip 2) | 
Select-String -Pattern 'Class Name:' -Context 3,4) | 
ForEach {
    [PSCustomObject]@{
        PublishedName = $PSItem.Context.PreContext[0] -replace '.*:\s+'
        OriginalName  = $PSItem.Context.PreContext[1] -replace '.*:\s+'
        ProviderName  = $PSItem.Context.PreContext[2] -replace '.*:\s+'
        ClassName     = ($PSitem | Select-String -Pattern 'Class Name:') -replace '.*:\s+'
        ClassGUID     = $PSItem.Context.PostContext[0] -replace '.*:\s+'
        DriverVersion = $PSItem.Context.PostContext[1] -replace '.*:\s+'
        SignerName    = $PSItem.Context.PostContext[2] -replace '.*:\s+'   
    }
}
# Results
<#
PublishedName : oe...
OriginalName  : amd...
ProviderName  : AMD
ClassName     : Sys...s
ClassGUID     : {4d...
DriverVersion : 02/...
SignerName    : Microsof...
...
PublishedName : oem4...
OriginalName  : w...
ProviderName  : West...
ClassName     : WD D...
ClassGUID     : {8496e8....
DriverVersion : 11...
SignerName    : Microsoft W...
#>

Или формат на таблица, или запишете в csv.

Clear-Host
((PNPUtil /Enum-Drivers /class Display | 
Select-Object -Skip 2) | 
Select-String -Pattern 'Class Name:' -Context 3,4) | 
ForEach {
    [PSCustomObject]@{
        PublishedName = $PSItem.Context.PreContext[0] -replace '.*:\s+'
        OriginalName  = $PSItem.Context.PreContext[1] -replace '.*:\s+'
        ProviderName  = $PSItem.Context.PreContext[2] -replace '.*:\s+'
        ClassName     = ($PSitem | Select-String -Pattern 'Class Name:') -replace '.*:\s+'
        ClassGUID     = $PSItem.Context.PostContext[0] -replace '.*:\s+'
        DriverVersion = $PSItem.Context.PostContext[1] -replace '.*:\s+'
        SignerName    = $PSItem.Context.PostContext[2] -replace '.*:\s+'   
    }
} | 
Format-Table -AutoSize
# Results
<#
PublishedName OriginalName   ProviderName                   ClassName                         ClassGUID                              DriverVersion         SignerName                        
------------- ------------   ------------                   ---------                         ---------                              -------------         ----------                        
...

Clear-Host
((PNPUtil /Enum-Drivers /class Display | 
Select-Object -Skip 2) | 
Select-String -Pattern 'Class Name:' -Context 3,4) | 
ForEach {
    [PSCustomObject]@{
        PublishedName = $PSItem.Context.PreContext[0] -replace '.*:\s+'
        OriginalName  = $PSItem.Context.PreContext[1] -replace '.*:\s+'
        ProviderName  = $PSItem.Context.PreContext[2] -replace '.*:\s+'
        ClassName     = ($PSitem | Select-String -Pattern 'Class Name:') -replace '.*:\s+'
        ClassGUID     = $PSItem.Context.PostContext[0] -replace '.*:\s+'
        DriverVersion = $PSItem.Context.PostContext[1] -replace '.*:\s+'
        SignerName    = $PSItem.Context.PostContext[2] -replace '.*:\s+'   
    }
} | 
Where-Object -Property ClassName -EQ 'Monitors' |
Select-Object -Property PublishedName
# Results
<#
PublishedName
-------------
oem11.inf    
oem67.inf 
#>
person postanote    schedule 12.03.2021