Пользовательский объект сценариев Powershell

ниже набор данных хранится в текстовом файле, и первый - это имя сервера, второй - дата, а третий - история патчей.

WSUSCL02-2012

Monday, August 10, 2020 5:03:08 PM



X Status     KB          Size Title                                            
- ------     --          ---- -----                                            
2 Accepted   KB3172729  10 MB Security Update for Windows Server 2012 R2 (KB...
2 Accepted   KB3175024  12 MB Security Update for Windows Server 2012 R2 (KB...
3 Downloaded KB3172729  10 MB Security Update for Windows Server 2012 R2 (KB...
3 Downloaded KB3175024  12 MB Security Update for Windows Server 2012 R2 (KB...
4 Installed  KB3172729  10 MB Security Update for Windows Server 2012 R2 (KB...
4 Installed  KB3175024  12 MB Security Update for Windows Server 2012 R2 (KB...



WSUSCL01-2012

Monday, August 10, 2020 5:03:01 PM



X Status     KB          Size Title                                            
- ------     --          ---- -----                                            
2 Accepted   KB2962409  50 MB Update for Windows Server 2012 R2 (KB2962409)    
2 Accepted   KB3175024  12 MB Security Update for Windows Server 2012 R2 (KB...
3 Downloaded KB2962409  50 MB Update for Windows Server 2012 R2 (KB2962409)    
3 Downloaded KB3175024  12 MB Security Update for Windows Server 2012 R2 (KB...
4 Installed  KB2962409  50 MB Update for Windows Server 2012 R2 (KB2962409)    
4 Installed  KB3175024  12 MB Security Update for Windows Server 2012 R2 (KB...

Выше представлен набор данных, хранящийся в текстовом файле, и требуется проанализировать данные и выбрать имя сервера, дату, исправление и поместить эти данные в настраиваемый объект Power Shell с именем имени сервера, датой, деталями исправления. пожалуйста, помогите мне сделать это


person prabhat    schedule 12.08.2020    source источник
comment
Можете ли вы опубликовать немного больше информации - что вы пробовали до сих пор? Что в нем не сработало?   -  person mclayton    schedule 12.08.2020
comment
Просмотр этого видео может вам помочь: сложные методы анализа обычного текста   -  person Olaf    schedule 12.08.2020
comment
$data=Get-Content C:\data1.log $alldata=$data | Foreach { if ($_ -ilike ) {Write-Output $_} $server=$alldata | foreach { if ($_ -ilike *WSUS) {Write-Output $_} } $Patch = $alldata | foreach { if ($_ -inotlike WSUS) {Write-Output $_} } } $serverdetail = $server | foreach {[PSCustomObject]@{ SERVER = $_ } } только таким образом я получил информацию о сервере и смог поместить пользовательский объект   -  person prabhat    schedule 12.08.2020
comment
Пожалуйста, не добавляйте дополнительную информацию в качестве комментария. Вместо этого отредактируйте свой вопрос и добавьте его туда. Заранее спасибо.   -  person Olaf    schedule 12.08.2020


Ответы (1)


Использование switch -Regex -File для перебора каждой строки в текстовом файле должно помочь.

Код ниже анализирует все поля, но вы можете закомментировать любые свойства, которые вам не нужны в результате.

$result = switch -Regex -File 'D:\Test\patches.txt' {
    '^[-\w]+$' { $server = $_ }
    '[AP]M$'   { $date = [datetime]::ParseExact($_, 'F', [cultureinfo]'en-US') }
    '^(\d+)\s+(\w+)\s+(KB\d+)\s+(\d+\s[KM]B)\s+(.+)' {
        # create and output an object
        [PsCustomObject]@{
            Server = $server
            Date   = $date
            X      = $matches[1]
            Status = $matches[2]
            KB     = $matches[3]
            Size   = $matches[4]
            Title  = $matches[5]
        }
   }
}

# output on screen
$result | Format-Table -AutoSize

# output to CSV file
$result | Export-Csv -Path 'D:\Test\patchresults.csv' -NoTypeInformation

Вывод с использованием файла примера

Server        Date               X Status     KB        Size  Title                                            
------        ----               - ------     --        ----  -----                                            
WSUSCL02-2012 10-8-2020 17:03:08 2 Accepted   KB3172729 10 MB Security Update for Windows Server 2012 R2 (KB...
WSUSCL02-2012 10-8-2020 17:03:08 2 Accepted   KB3175024 12 MB Security Update for Windows Server 2012 R2 (KB...
WSUSCL02-2012 10-8-2020 17:03:08 3 Downloaded KB3172729 10 MB Security Update for Windows Server 2012 R2 (KB...
WSUSCL02-2012 10-8-2020 17:03:08 3 Downloaded KB3175024 12 MB Security Update for Windows Server 2012 R2 (KB...
WSUSCL02-2012 10-8-2020 17:03:08 4 Installed  KB3172729 10 MB Security Update for Windows Server 2012 R2 (KB...
WSUSCL02-2012 10-8-2020 17:03:08 4 Installed  KB3175024 12 MB Security Update for Windows Server 2012 R2 (KB...
WSUSCL01-2012 10-8-2020 17:03:01 2 Accepted   KB2962409 50 MB Update for Windows Server 2012 R2 (KB2962409)    
WSUSCL01-2012 10-8-2020 17:03:01 2 Accepted   KB3175024 12 MB Security Update for Windows Server 2012 R2 (KB...
WSUSCL01-2012 10-8-2020 17:03:01 3 Downloaded KB2962409 50 MB Update for Windows Server 2012 R2 (KB2962409)    
WSUSCL01-2012 10-8-2020 17:03:01 3 Downloaded KB3175024 12 MB Security Update for Windows Server 2012 R2 (KB...
WSUSCL01-2012 10-8-2020 17:03:01 4 Installed  KB2962409 50 MB Update for Windows Server 2012 R2 (KB2962409)    
WSUSCL01-2012 10-8-2020 17:03:01 4 Installed  KB3175024 12 MB Security Update for Windows Server 2012 R2 (KB...

P.S. моя система голландская, поэтому по умолчанию отображается формат даты «дд-м-гггг чч:мм:сс»

person Theo    schedule 12.08.2020
comment
Можем ли мы иметь только одну запись имени сервера вместо итерации? - person prabhat; 12.08.2020
comment
AUTOM01-AYEHU1:Нет доступных обновлений AUTOM01-AYEHU2:Нет доступных обновлений AUTOM01-AYEHU3:Нет доступных обновлений AUTOM01-AYEHU4:Нет доступных обновлений AUTOM01-AYEHU5:Нет доступных обновлений AUTOM01-AYEHU6:Нет доступных обновлений @Theo, что для этого набора данных i имеют аналогичные требования, но не могут получить результат, например, нужно 2 пользовательских объекта с именем (SERVERNAME, STATUS) и поместить в него данные - person prabhat; 13.08.2020
comment
@prabhat [1] Для вашего первого комментария: да, вы можете сгруппировать массив $result на сервере, например $servers = $result | Group-Object Server. [2] Что касается вашего второго комментария: это еле читаемо, но если я правильно понимаю, то на этих данных можно сделать: $result = $data -replace ':', '=' | ConvertFrom-StringData - person Theo; 13.08.2020
comment
для вторых комментариев, как я могу использовать этот существующий код для создания 2 объектов с помощью некоторого регулярного выражения '(\D*)\s' '[^-]*' - person prabhat; 13.08.2020