Вы можете использовать командлет Select-String
с параметром -Context
для поиска в файле, а затем выбрать, сколько строк контекстной информации вы хотите получить в результате поиска.
Например, если мы возьмем ваш входной файл и сохраним его в переменной с именем $input
, например, так:
$inputFile= Get-Content C:\Path\To\YourFile.txt
$inputFile| Select-string 'machine no'
>Machine no 1234
Затем мы можем найти совпадения для фразы «offline» следующим образом:
$inputFile| Select-String offline -Context 0,1
Это означает, что я хочу, чтобы вы искали слово «офлайн» и дали мне ноль строк после него и одну строку после него, давая нам такой вывод:
> offline
12
> offline
37
> offline
65
Мы можем собрать все это вместе, чтобы создать это и сгенерировать новый выходной файл, который будет выглядеть следующим образом.
$out= ''
$out += $inputFile| Select-string 'machine no'
$out += "`n"
$out += $inputFile| Select-String offline -Context 0,1 | ForEach-Object {$_.Context.DisplayPostContext}
#Resulting file would look this, just the name of the machine and then the number of each offline...uh, whatever it is.
Machine no 1234
12 37 65
На вашем месте я бы адаптировал этот поток для создания объектов и свойств PowerShell, например:
$Report = [pscustomobject]@{ID='';MachineNo='';OfflineMembers=@()}
$Report.ID = ($inputFile | select-string page -Context 0 ).ToString().Split('page')[-1]
$Report.MachineNo = ($inputFile | Select-string 'machine no').ToString().Trim().Split()[-1]
$Report.OfflineMembers = $inputFile | Select-String offline -Context 0,1 | ForEach-Object {
[pscustomobject]@{Value='Offline';ID=$_.Context.DisplayPostContext.Trim()}
}
>$Report
ID MachineNo OfflineMembers
-- --------- --------------
1 1234 {@{Value=Offline; ID=12}, @{Value=Offline; ID=37}, @{Value=Offline; ID=65}}
$Report.OfflineMembers
Value ID
----- --
Offline 12
Offline 37
Offline 65