Powershell解析文本文件

时间:2015-06-26 23:59:38

标签: parsing powershell text

我正在尝试解析此文本文件。如果有啪啪声,那么很容易就像最后一样解析成一张桌子。

我是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

1 个答案:

答案 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)