Search code examples
powershelldriverinf

Parsing *.inf and output table


Please help me in solving non-standard tasks (Powershell). Need to read *.inf files: C:\Windows\System32\DriverStore\FileRepository" and to bring to the table: Manufacter, DeviceID, VerDRV.

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 }

Grateful for the help.


Solution

  • Thanks to all! Special thanks to 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