Использование ConvertFrom-Csv -Delimiter для пробелов переменной длины - PullRequest
0 голосов
/ 07 января 2019

У меня есть отчет, который генерирует CSV-файл событий безопасности Windows. С помощью этого отчета я хочу получить конкретную информацию.

Следующий ниже код анализирует каждую строку данных по пробелам между полями. Это работает правильно:

$InStuff = Get-Content -Path 'SecurityEvents.csv'

$ColCount = $InStuff[1].Split(' ').Count

$Collection = $InStuff | ConvertFrom-Csv -Delimiter ' ' -Header     (1..$ColCount).ForEach({"Column_$_"})

$Collection |
    Select-Object -Property 'Column_17', 'Column_83'

Примеры строк CSV:

<134>Dec 13 13:50:23 10.137.119.42 MSWinEventLog 1 Security 123456789 Thu Dec 13 13:50:23 2018 4662 Microsoft-Windows-Security-Auditing MyCompany\dy625 N/A Success Audit mydc1.dy625.com Directory Service Access  An operation was performed on an object.    Subject :   Security ID:  S-123456  Account Name:  dy625 Account Domain:  MyCompany   Logon ID:  XXXXXXXX   Object:   Object Server:  DS   Object Type:  %{XXXXXXXX-XXXXXXXX-XXXXXXXX}   Object Name:  %{XXXXXXXX-XXXXXXXX-XXXXXXXX}   Handle ID:  0x0    Operation:   Operation Type:  Object Access   Accesses:  Write Property  Access Mask:  0x20   Properties:  Write Property {XXXX-XXXX-XXXXX}  {XXXX-XXXX-XXXXX} {XXXX-XXXX-XXXXX}  {XXXX-XXXX-XXXXX}   Additional Information:   Parameter 1:  -   Parameter 2:   123456
<134>Dec 13 13:50:18 10.137.119.42 MSWinEventLog 1 Security 123456789 Thu Dec 13 13:50:18 2018 4662 Microsoft-Windows-Security-Auditing MyCompany\dy626 N/A Success Audit mydc1.dy625.com Directory Service Access  An operation was performed on an object.    Subject :   Security ID:  S-123456  Account Name:  dy626 Account Domain:  MyCompany   Logon ID:  XXXXXXXX   Object:   Object Server:  DS   Object Type:  %{XXXXXXXX-XXXXXXXX-XXXXXXXX}   Object Name:  %{XXXXXXXX-XXXXXXXX-XXXXXXXX}   Handle ID:  0x0    Operation:   Operation Type:  Object Access   Accesses:  Write Property  Access Mask:  0x20   Properties:  Write Property {XXXX-XXXX-XXXXX}  {XXXX-XXXX-XXXXX} {XXXX-XXXX-XXXXX}  {XXXX-XXXX-XXXXX}   Additional Information:   Parameter 1:  -   Parameter 2:   123456
<134>Jan  4 13:50:14 10.137.118.22 MSWinEventLog 1 Security 123456789 Thu Dec 13 13:50:14 2018 4662 Microsoft-Windows-Security-Auditing MyCompany\dy627 N/A Success Audit mydc1.dy625.com Directory Service Access  An operation was performed on an object.    Subject :   Security ID:  S-123456  Account Name:  dy627 Account Domain:  MyCompany   Logon ID:  XXXXXXXX   Object:   Object Server:  DS   Object Type:  %{XXXXXXXX-XXXXXXXX-XXXXXXXX}   Object Name:  %{XXXXXXXX-XXXXXXXX-XXXXXXXX}   Handle ID:  0x0    Operation:   Operation Type:  Object Access   Accesses:  Write Property  Access Mask:  0x20   Properties:  Write Property {XXXX-XXXX-XXXXX}  {XXXX-XXXX-XXXXX} {XXXX-XXXX-XXXXX}  {XXXX-XXXX-XXXXX}   Additional Information:   Parameter 1:  -   Parameter 2:   123456

Непредвиденная проблема заключается в том, что Windows не форматирует свои даты, как я ожидал. Например, см. Ниже

<134>Dec 13
<134>Jan  4

Если вы заметили, между 'Jan' и '4 есть два пробела, а между' Dec 'и' 13 '- один пробел. Это означает, что мне нужно запустить два разных скрипта, в зависимости от дня месяца.

Мне было интересно, можно ли сделать разделители «переменным» пробелом, а не одним определенным ' ' в данном конкретном случае. Похоже, что эта функция не поддерживается в команде ConvertFrom-Csv - и я не уверен, как бы я переписал свой код, чтобы приспособиться к этому.

Ответы [ 2 ]

0 голосов
/ 07 января 2019

вам нужно будет добавить еще один шаг, который заменяет «два или более пробельных символа» одним пробелом. как то так ...

# fake reading in a text file
#    in real life, use Get-Content
$Test = @'
dec 13 qwerty
jan  4 asdfgh
'@ -split [environment]::NewLine

$Test -replace '\s{2,}', ' ' |
    ConvertFrom-Csv -Delimiter ' ' -Header 'One', 'Two'

вывод ...

 One Two
 --- ---
 dec 13 
 jan 4 
0 голосов
/ 07 января 2019

Просто замените все двойные пробелы одним:

$InStuff = $InStuff.Replace('  ',' ')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...