2016-06-12 12 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

모두에게 감사드립니다! 파벨 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

I을 는 설치된 하드웨어의 GUID와 드라이버 파일의 GUID를 비교하기 위해 만들어진 Invoke-InstallDrivers (Link to Github)라는 함수를 작성했습니다. 일치하지 않으면 건너 뛸 일치 항목이있는 경우 설치합니다. 기본적으로 그 기능을 조금 변경하여 찾고있는 데이터를 찾았지만 지정한 위치의 .INF 파일 중 일부에 "제조업체"값이 포함되어 있지 않은 것을 발견했습니다. re는 가치가 없다. 마지막으로, 테스트 워크 스테이션의 해당 경로에있는 inf 파일에는 DeviceID 필드가 표시되지 않으므로 ClassGUID는 사용자가 언급 한 것으로 가정합니다.

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

당신은 당신의 취향에 서식 출력을 조정할 필요가 있습니다하지만이 문제를 해결하는 올바른 경로에 당신을 넣어해야합니다

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" 
     } 

} 

을 실행하면 위의 기능을 사용할 수 있습니다.

편집 I 출력이 어떻게 보일까 추가 할 생각은, 첫 번째 부분은 (경로가 읽기 쉽도록 단축되었다) 제조 업체없이 제조 업체 및 기타 쇼와 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

쿨하지만 적합하지 않습니다. Model = "HP Photosmart 2570"또는 "HP Color LaserJet 2820"(걱정하지 마세요) DriverVer = "제조업체 ="HP ", 모델 ="HP Photosmart 2570 " 6.1.7600.16385 " –

+0

당신이 할 수없는 것을 요구하고있는 것처럼 들릴 수 있습니다. 위의 출력에 나와있는 버전과 제조업체 이외에는 다른 것을 선택할 수 없을 것입니다. 마지막으로 모델은 일반적으로 드라이버에 없습니다. 드라이버가 광범위한 하드웨어 세트에 적용 할 수있는 설치 파일 (inf). inf 파일을 notepad ++ 또는 비슷한 정보로 열 수 있습니다. 거기에없는 정보를 얻으십시오. –

+0

정확합니다! * .inf의 모든 모델이 필요합니다. 결국 제조업체, 가능한 모든 모델 및 드라이버 버전을 나열하는 테이블을 만듭니다. –