2016-06-12 172 views
0

請幫我解決非標準任務(Powershell)。 需要讀取* .inf文件:C:\ WINDOWS \ SYSTEM32 \ DriverStore \ FileRepository文件」,並提請表:。Manufacter,的DeviceID,VerDRV解析* .inf和輸出表

ls "C:\Windows\System32\DriverStore\FileRepository" -Recurse -File -Filter *.inf | %{ 

$mtch = $_ |Select-String -AllMatches -Pattern "^\[(.+)\]$|^([^;].+)=(.+[^;])" 
$infObj = New-Object pscustomobject 
$mtch.Matches | % { 
if ($_.Groups[1].Success) { 
    $section = $_.Groups[1].Value 
    Add-Member -InputObject $infObj -MemberType NoteProperty -Name $section -Value (New-Object pscustomobject) 
} else { 
    Add-Member -InputObject $infObj.$section -MemberType NoteProperty -Name $_.Groups[2].Value -Value $_.Groups[3].Value 
} 
} 



$infObj.Version | Format-Table 
$infObj = $null 
$mtch = $null 
$section = $null } 

感謝您的幫助

回答

0

謝謝大家!特別感謝Pavel Pakhomov :)

Clear-Host 
Get-ChildItem "C:\Windows\System32\DriverStore\FileRepository" -Recurse -File -Filter '*.inf' | ForEach-Object { 
    $fileContent = Get-Content $_.FullName 
    #write-host ">>>>>" + $_.FullName 

    $dirverVer = ($fileContent | Select-String -SimpleMatch 'DriverVer=') -replace '.*=(.*)','$1' 
    #$Provider = ($fileContent | Select-String -SimpleMatch 'Provider=') -replace '.*=(.*)','$1' 
    $Provider = ($fileContent | Select-String '^\s*Provider\s*=.*') -replace '.*=(.*)','$1' 
    if ($Provider.Length -eq 0) { 
     $Provider = "" 
    } 
    elseif($Provider.Length -gt 0 -And $Provider -is [system.array]) { 
     if ($Provider.Length -gt 1 -And $Provider[0].Trim(" ").StartsWith("%")) { 
      $Provider = $Provider[1]; 
     } else { 
      $Provider = $Provider[0] 
     } 
    } 
    $Provider = $Provider.Trim(' ') 

    if ($Provider.StartsWith("%")) { 
     $Provider = $Provider.Trim('%') 
     #$Manufacter = ($fileContent | Select-String -SimpleMatch "%$Provider2%=") -replace '.*=(.*)','$1' 
     $Manufacter = ($fileContent | Select-String "^$Provider\s*=") -replace '.*=(.*)','$1' 
    } 
    else { 
     $Manufacter = "" 
    }  

    $ClassGUID = ($fileContent | Select-String -SimpleMatch 'ClassGUID=') -replace '.*=(.*)','$1' 

    if ($Manufacter.Length -eq 0) { 
     $Manufacter = $Provider 
    } elseif ($Manufacter.Length -gt 0 -And $Manufacter -is [system.array]) { 
     if ($Manufacter.Length -gt 1 -And $Manufacter[0].Trim(" ").StartsWith("%")) { 
      $Manufacter = $Manufacter[1]; 
     } 
     else { 
      $Manufacter = $Manufacter[0]; 
     } 
    } 
    $Manufacter = $Manufacter.Trim(' ').Trim('"') 

    New-Object -TypeName psobject -Property @{ 
     Name = $_.Name 
     Manufacturer = $Manufacter 
     GUID = $ClassGUID 
     Version = $dirverVer 
    } 
} | Format-Table -Property Name,Manufacturer,GUID,Version 
0

我編寫了一個名爲Invoke-InstallDrivers(Link to Github)的函數,該函數用於將驅動程序文件的GUID與已安裝硬件的GUID進行比較,如果安裝的匹配項匹配,如果沒有它將跳過的匹配項。我修改了這個函數來拉取你正在查找的數據,但是,我發現你指定位置的幾個.INF文件沒有包含「製造商」值,所以我添加了一些邏輯來說明重新沒有價值。最後,我沒有在我的測試工作站上的任何位於該路徑的inf文件中看到任何DeviceID字段,所以我認爲您所指的是ClassGUID。

Function Get-DriverInfo { 

     [CmdletBinding()] 
     param(

      [Parameter(Mandatory=$true)] 
      [String[]] $Source 

     ) 

    $Drivers = Get-ChildItem -Path "$Source\*" -Recurse | Where {$_.Extension -eq ".inf"} | Select -ExpandProperty FullName 

    Foreach ($Driver in $Drivers) 
     { 
      Write-Output "Processing File: $Driver" 
      $GUID = (Get-Content -Path "$Driver" | Select-String "ClassGuid").Line.Split('=')[-1].Split(' ').Split(';') 
      $Version = (Get-Content -Path "$Driver" | Select-String "DriverVer").Line.Split('=')[-1].Split(' ').Split(';') 

      if ((Get-Content -Path "$Driver" | Select-String "MfgName") -eq $null) 

       { 
        $Manufacturer = "No Manufactuer Listed in INF" 
       } 

      ELSE 

       { 
        $Manufacturer = (Get-Content -Path "$Driver" | Select-String "MfgName").Line.Split('=')[-1].Split(' ').Split(';') 
       } 

      Write-Output "$Manufacturer, $Version, $GUID" 
     } 

} 

您將通過運行使用上述功能:

Get-DriverInfo -Source "C:\Windows\System32\DriverStore\FileRepository" 

您可能需要調整輸出格式,以您的喜好,但是這應該讓你在正確的道路,以解決您的問題上。

編輯 思想我想補充的輸出將是什麼樣子,第一部分顯示了製造商和其他節目INF無製造商(路徑被縮短了可讀性):

PS C:\> Get-DriverInfo -Source "C:\Windows\System32\DriverStore\FileRepository" 
Processing File: C:\Windows\System32\DriverStore\FileRepository\...\bcbtumsLD.inf 
"Broadcom", 09/25/2013,6.5.1.4800, {e0cbf06c-cd8b-4647-bb8a-263b43f0f974} 

Processing File: C:\Windows\System32\DriverStore\FileRepositor\...\bcmhidnossr.inf 
No Manufactuer Listed in INF, 03/28/2013,1.0.0.101, {745a17a0-74d3-11d0-b6fe-00a0c90f57da} 

希望這有助於!

+0

很酷,但不適合。 (我想如果不是製造商,請跳過結果關於GUID,我的意思是model。例如Manufacter =「HP」,Model =「HP Photosmart 2570」或「HP Color LaserJet 2820」(不要緊)DriverVer =「 6.1.7600.16385「 –

+0

聽起來像是你要求的東西是不可能的,除了我上面輸出中列出的版本和製造商之外,你將無法得到任何不同的結果,最後模型通常不在驅動程序中安裝文件(inf),因爲驅動程序可以應用到一系列廣泛的硬件上,你可以使用notepad ++或類似的東西打開inf文件,看看它們包含的信息,不能得到那些不存在的信息 –

+0

準確!需要* .inf中的所有模型。最後製作一個表格,列出製造商,所有可能的型號和驅動程序版本。 –