Imsa
Imsa

Reputation: 1125

PowerShell Parse INF file

I am trying to parse an INF; specifically, driver version from the file. I am new to PowerShell, so I've gotten only this far.

The file looks like this:

[Version]
Signature   = "$WINDOWS NT$"
Class       = Bluetooth
ClassGuid   = {e0cbf06c-cd8b-4647-bb8a-263b43f0f974}
Provider    = %PROVIDER_NAME%
CatalogFile = ibtusb.cat
DriverVer=11/04/2014,17.1.1440.02
CatalogFile=ibtusb.cat

The second last line has the information I am looking for. I am trying to parse out just 17.1.1440.02.

One file may contain multiple lines with DriverVer=..., but I am only interested in the first instance.

Right now I've the following script.

$path = "C:\FilePath\file.inf"
$driverVersoin = Select-String -Pattern "DriverVer" -path $path
$driverVersoin[0] # lists only first instance of 'DriverVer'
$driverVersoin    # lists all of the instances with 'DriverVer'

Output is:

Filepath\file.inf:7:DriverVer=11/04/2014,17.1.1440.02

But I am only looking for 17.1.1440.02

Upvotes: 1

Views: 2868

Answers (1)

Ansgar Wiechers
Ansgar Wiechers

Reputation: 200453

Make your expression more specific and make the part you want to extract a capturing group.

$pattern = 'DriverVer\s*=\s*(?:\d+/\d+/\d+,)?(.*)'
Select-String -Pattern $pattern -Path $path |
  select -Expand Matches -First 1 |
  % { $_.Groups[1].Value }

Regular expression breakdown:

  • DriverVer\s*=\s* matches the string "DriverVer" followed by any amount of whitespace, an equals sign and again any amount of whitespace.
  • (?:\d+/\d+/\d+,)? matches an optional date followed by a comma in a non-capturing group ((?:...)).
  • (.*) matches the rest of the line, i.e. the version number you want to extract. The parentheses without the ?: make it a capturing group.

Another option (if the version number is always preceded by a date) would be to just split the line at the comma and select the last field (index -1):

Get-Content $path |
  Where-Object { $_ -like 'DriverVer*' } |
  Select-Object -First 1 |
  ForEach-Object { $_.Split(',')[-1] }

Upvotes: 2

Related Questions