PowerShell解析INF文件

时间:2015-07-06 22:26:48

标签: parsing powershell powershell-ise

我正在尝试解析INF;特别是,文件中的驱动程序版本。我是PowerShell的新手,所以我只有这么远。

该文件如下所示:

[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

第二行包含我正在寻找的信息。我试图解析17.1.1440.02

一个文件可能包含多行DriverVer=...,但我只对第一个实例感兴趣。

现在我有以下脚本。

$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'

输出是:

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

但我只是在寻找17.1.1440.02

1 个答案:

答案 0 :(得分:2)

使您的表达更具体,并使您想要提取捕捉组的部分。

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

正则表达式细分:

  • DriverVer\s*=\s*匹配字符串" DriverVer"接下来是任意数量的空格,等号以及任何数量的空格。
  • (?:\d+/\d+/\d+,)?匹配非捕获组((?:...))中的可选日期后跟逗号。
  • (.*)匹配该行的其余部分,即您要提取的版本号。没有?:的括号使其成为捕获组。

另一个选项(如果版本号始终以日期开头)将仅用逗号分隔行并选择最后一个字段(索引-1):

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