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)
Ваш вывод не имеет никакого смысла. Как вы связали эти файлы с этими устройствами? Или откуда взялось «ACPI \ PNP0C0A \ 1»? Это не в вашем справочном тексте. – TheMadTechnician
Это результат использования утилиты devcon.exe. «devcon.exe driverfiles *» перечисляет всю информацию выше. – Imsa