2015-06-26 2 views
0

Я пытаюсь разобрать этот текстовый файл. Было бы легко разобрать на стол, как в конце, если бы был пэтер.Powershell Parse Text File

И я новичок в 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

Ваш вывод не имеет никакого смысла. Как вы связали эти файлы с этими устройствами? Или откуда взялось «ACPI \ PNP0C0A \ 1»? Это не в вашем справочном тексте. – TheMadTechnician

+0

Это результат использования утилиты devcon.exe. «devcon.exe driverfiles *» перечисляет всю информацию выше. – Imsa

ответ

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} 

Edit: Хорошо, я буду считать, что вы на самом деле не пытаться изменить то, что я был здесь, так как добавление драйверов к списку других файлов должно быть действительно просто, изменив $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) 
+0

Фантастический, спасибо. :) Как мы можем комбинировать файл драйвера и обычные файлы всего за один столбец? Другими словами, он перечисляет файл .inf и все остальные файлы под ним. – Imsa

+0

Bascially, что я пытаюсь сделать, это найти файл-версию каждого файла и поместить int в следующий столбец, используя это: '[System.Diagnostics.FileVersionInfo] :: GetVersionInfo ($ files) .FileVersion' – Imsa

+0

thats interesting , , глядя на список, версия драйвера будет полезной информацией в столбце. что вы настраиваете в коде, чтобы получить версию драйвера? – Imsa