Вывод Powershell Select-String в виде CSV в 1 строку - PullRequest
0 голосов
/ 03 марта 2019

Я пытаюсь получить вывод Select-String в одну строку вместо нескольких строк, но просто не могу понять, как же.

Вот моя входная строка и чрезвычайнопростой шаблон для извлечения данных после '=',

'trailer data      [REFNO=0FWEB8,STRTDATE=030119,STRTTIME=075257,STRTINTIME=671442647590,IMPIND=184,CSP_MS_SRTIME_9580=21,CSP_MS
_SRTIME_9210=24229,P4=9777A611236814D8,P7=04,CD=PT,S0=TestB82PTResponseTags,R0=00,R1=0FWEB8,CSP_MS_SRTIME_9560=24,]' | select-string -Pattern '=[A-Za-z0-9]+' -AllMatches | % { $_.Matches } | % { $_.Value.SubString(1) }

Но вместо вывода, отображаемого в отдельной строке для каждого искомого шаблона,

0FWEB8

030119

075257

671442647590

184

21

24229

9777A611236814D8

04

PT

TestB82PTResponseTags

00

0FWEB8

24

Я пытаюсь отобразить вывод какCSV означает что-то вроде этого в одной строке,

0FWEB8, 030119, 075257, 671442647590, 184, 21, 24229, 9777A611236814D8, 04, PT, TestB82PTResponseTags, 00, 0FWEB8, 24

Пробовал использовать pipe для Export-CSV, но даже это не удалось.Какой должен быть синтаксис?Я уверен, что это просто, но, похоже, я не могу понять то же самое.

Ответы [ 4 ]

0 голосов
/ 03 марта 2019

Не думаю, что я предлагаю что-то оригинальное, но почему бы не попробовать?

@('trailer data      [REFNO=0FWEB8,STRTDATE=030119,STRTTIME=075257,STRTINTIME=671442647590,IMPIND=184,CSP_MS_SRTIME_9580=21,CSP_MS
_SRTIME_9210=24229,P4=9777A611236814D8,P7=04,CD=PT,S0=TestB82PTResponseTags,R0=00,R1=0FWEB8,CSP_MS_SRTIME_9560=24,]' |
Select-String -Pattern '(?<==)[^,]+' -AllMatches | Select-Object -ExpandProperty Matches | ForEach-Object Value) -join ','

или

[regex]::Matches('trailer data      [REFNO=0FWEB8,STRTDATE=030119,STRTTIME=075257,STRTINTIME=671442647590,IMPIND=184,CSP_MS_SRTIME_9580=21,CSP_MS
_SRTIME_9210=24229,P4=9777A611236814D8,P7=04,CD=PT,S0=TestB82PTResponseTags,R0=00,R1=0FWEB8,CSP_MS_SRTIME_9560=24,]', '(?<==)[^,]+').ForEach({$_.Value}) -join ','

Вывод:

0FWEB8,030119,075257,671442647590,184,21,24229,9777A611236814D8,04,PT,TestB82PTResponseTags,00,0FWEB8,24
0 голосов
/ 03 марта 2019

Вы можете добавить свой результат к ArrayList, а затем использовать оператор -join для получения желаемого результата

$values = New-Object System.Collections.ArrayList; 'trailer data      [REFNO=0FWEB8,STRTDATE=030119,STRTTIME=075257,STRTINTIME=671442647590,IMPIND=184,CSP_MS_SRTIME_9580=21,CSP_MS_SRTIME_9210=24229,P4=9777A611236814D8,P7=04,CD=PT,S0=TestB82PTResponseTags,R0=00,R1=0FWEB8,CSP_MS_SRTIME_9560=24,]' | select-string -Pattern '=[A-Za-z0-9]+' -AllMatches | % { $_.Matches } | % { $values.Add($_.Value.SubString(1)) > $null }; $values -join ","

Выход:

0FWEB8,030119,075257,671442647590,184,21,24229,9777A611236814D8,04,PT,TestB82PTResponseTags,00,0FWEB8,24
0 голосов
/ 03 марта 2019

Вы можете написать немного более просто следующим образом.

"REFNO=0FWEB8,STRTDATE=030119" | select-string -Pattern '=[A-Za-z0-9]+' -AllMatches | foreach { $_.Matches.Value.SubString(1) -join ", " }
0 голосов
/ 03 марта 2019

Здесь можно использовать -Join в зависимости от варианта использования.

about_Join |Документы Microsoft

Итак, вы имеете в виду это ...

Clear-Host
('trailer data      [REFNO=0FWEB8,STRTDATE=030119,STRTTIME=075257,STRTINTIME=671442647590,IMPIND=184,CSP_MS_SRTIME_9580=21,CSP_MS
_SRTIME_9210=24229,P4=9777A611236814D8,P7=04,CD=PT,S0=TestB82PTResponseTags,R0=00,R1=0FWEB8,CSP_MS_SRTIME_9560=24,]' | 
select-string -Pattern '=[A-Za-z0-9]+' -AllMatches | 
% { $_.Matches } | 
% { $_.Value.SubString(1) }) -join ', '

# Results
0FWEB8, 030119, 075257, 671442647590, 184, 21, 24229, 9777A611236814D8, 04, PT, TestB82PTResponseTags, 00, 0FWEB8, 24
...