我正在尝试解析此文本文件。如果有啪啪声,那么很容易就像最后一样解析成一张桌子。
我是Powershell的新手,所以不确定如何解决这个问题。
感谢任何帮助。
USB\ROOT_HUB20\4&361B340A&0
Name: USB Root Hub
Driver installed from C:\windows\INF\usbport.inf [ROOTHUB.Dev]. 2 file(s) used by driver:
C:\windows\system32\drivers\usbhub.sys
C:\windows\system32\drivers\usbd.sys
ACPI\PNP0C09\1
USB\ROOT_HUB20\4&361B340A&1
Name: USB Root Hub
Driver installed from C:\windows\INF\usbport.inf [ROOTHUB.Dev]. 2 file(s) used by driver:
C:\windows\system32\drivers\usbhub.sys
C:\windows\system32\drivers\usbd.sys
ACPI\PNP0C09\2
USB\ROOT_HUB20\4&361B340A&2
Driver installed from C:\windows\INF\cmbatt.inf [CmBatt_Inst]. 2 file(s) used by driver:
C:\windows\system32\DRIVERS\CmBatt.sys
C:\windows\system32\DRIVERS\battc.sys
ACPI\PNP0C0A\2
Name: Microsoft ACPI-Compliant Control Method Battery
Driver installed from C:\windows\INF\cmbatt.inf [CmBatt_Inst]. 2 file(s) used by driver:
C:\windows\system32\DRIVERS\CmBatt.sys
C:\windows\system32\DRIVERS\battc.sys
输出
HardwareID Name File(s)
---------- ---- -------
USB\ROOT_HUB20... USB Root Hub C:\windows\INF\usbport.inf
USB\ROOT_HUB2... USB Root Hub C:\windows\system32\drivers\usbhub.sys
USB\ROOT_HUB20.. USB Root Hub C:\windows\system32\drivers\usbd.sys
ACPI\PNP0C09\1 C:\windows\INF\machine.inf
ACPI\PNP0C0A\1 Microsoft AC... C:\windows\INF\cmbatt.inf
Microsoft AC... C:\windows\system32\DRIVERS\CmBatt.sys
答案 0 :(得分:1)
RegEx可以做出相当简单的工作。导入文件,将其连接在一起,使其成为单个多行字符串,然后将其拆分为不以空格开头的行。这会让你获得个人记录。然后在新行字符上拆分它们,并根据其中的内容解析每一行。同样,RegEx将帮助定义每一行。此代码将为每个部分输出一个对象,其中包含4个属性,HardwareID,Name,Driver和Files。 Files属性是一个文件数组。
(Get-Content C:\Path\To\File.txt) -join "`r`n" -Split "(?m)^(?=\S)" |
Where{$_} |
ForEach{
Clear-Variable Files,Driver,Name,HardwareID
$Files = @()
$HardwareID = ($_ -split "`r`n")[0].trim()
Switch -regex ($_ -split "`r`n"){
"^\s+Name:" {$Name = ($_ -split ':',2)[-1].trim();Continue}
"^\s+.:\\" {$Files += $_.trim();continue}
"^\s+Driver" {$Driver = [RegEx]::Matches($_,"(?<=Driver installed from )(.+?)(?= \[)").value;continue}
}
[PSCustomObject]@{'HardwareID' = $HardwareID;'Name' = $Name; 'Driver' = $Driver; 'Files' = $Files}
}
这样会输出如下内容:
HardwareID Name Driver Files
---------- ---- ------ -----
USB\ROOT_HUB20\4&361B340A&0 USB Root Hub C:\windows\INF\usbport.inf {C:\windows\system32\drivers\usbhub.sys, C:\windows\system32\drivers\usbd.sys}
ACPI\PNP0C09\1 {}
USB\ROOT_HUB20\4&361B340A&1 USB Root Hub C:\windows\INF\usbport.inf {C:\windows\system32\drivers\usbhub.sys, C:\windows\system32\drivers\usbd.sys}
ACPI\PNP0C09\2 {}
USB\ROOT_HUB20\4&361B340A&2 C:\windows\INF\cmbatt.inf {C:\windows\system32\DRIVERS\CmBatt.sys, C:\windows\system32\DRIVERS\battc.sys}
ACPI\PNP0C0A\2 Microsoft ACPI-Compliant Control Method Battery C:\windows\INF\cmbatt.inf {C:\windows\system32\DRIVERS\CmBatt.sys, C:\windows\system32\DRIVERS\battc.sys}
编辑:好的,我会假设您没有真正尝试修改我在这里所拥有的内容,因为将驱动程序添加到其他文件列表应该是真的通过将$Driver =
更改为$Files +=
就像上面的行一样简单,将该文件添加到文件数组中。虽然看起来你想为每个文件添加一行,包括驱动文件,所以也许有一个文件阵列不是最适合你的。您可以做的是为驱动程序文件输出一个对象,然后为每个支持文件输出一个对象,您可以在制作对象时随时获取每个文件的版本号。因此,您可以使用以下内容替换上面的[PSCustomObject]
行:
[PSCustomObject]@{'HardwareID' = $HardwareID;'Name' = $Name; 'Files' = $Driver; 'FileVersion' = If(Test-Path $_.Trim()){[System.Diagnostics.FileVersionInfo]::GetVersionInfo($_.trim()).FileVersion}}
$Files | ForEach{ [PSCustomObject]@{'HardwareID' = $HardwareID;'Name' = $Name; 'Files' = $_; 'FileVersion' = If(Test-Path $_.Trim()){[System.Diagnostics.FileVersionInfo]::GetVersionInfo($_.trim()).FileVersion}Else{'File Not Found'}}}
这将输出为:
HardwareID Name Files FileVersion
---------- ---- ----- -----------
USB\ROOT_HUB20\4&361B340A&0 USB Root Hub C:\windows\INF\usbport.inf
USB\ROOT_HUB20\4&361B340A&0 USB Root Hub C:\windows\system32\drivers\usbhub.sys 6.3.9600.17238 (winblue_gdr.140723-2018)
USB\ROOT_HUB20\4&361B340A&0 USB Root Hub C:\windows\system32\drivers\usbd.sys 6.3.9600.17195 (winblue_gdr.140530-1506)
ACPI\PNP0C09\1
USB\ROOT_HUB20\4&361B340A&1 USB Root Hub C:\windows\INF\usbport.inf
USB\ROOT_HUB20\4&361B340A&1 USB Root Hub C:\windows\system32\drivers\usbhub.sys 6.3.9600.17238 (winblue_gdr.140723-2018)
USB\ROOT_HUB20\4&361B340A&1 USB Root Hub C:\windows\system32\drivers\usbd.sys 6.3.9600.17195 (winblue_gdr.140530-1506)
ACPI\PNP0C09\2
USB\ROOT_HUB20\4&361B340A&2 C:\windows\INF\cmbatt.inf
USB\ROOT_HUB20\4&361B340A&2 C:\windows\system32\DRIVERS\CmBatt.sys 6.3.9600.16384 (winblue_rtm.130821-1623)
USB\ROOT_HUB20\4&361B340A&2 C:\windows\system32\DRIVERS\battc.sys 6.3.9600.16384 (winblue_rtm.130821-1623)
ACPI\PNP0C0A\2 Microsoft ACPI-Compliant Control Method Battery C:\windows\INF\cmbatt.inf
ACPI\PNP0C0A\2 Microsoft ACPI-Compliant Control Method Battery C:\windows\system32\DRIVERS\CmBatt.sys 6.3.9600.16384 (winblue_rtm.130821-1623)
ACPI\PNP0C0A\2 Microsoft ACPI-Compliant Control Method Battery C:\windows\system32\DRIVERS\battc.sys 6.3.9600.16384 (winblue_rtm.130821-1623)