1

我试图将输出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

尝试使用管道,Export-CSV但即使这样也失败了。应该是什么语法?我确信它很简单,但似乎无法让我的头脑相同。

4

4 回答 4

0

您可以将结果添加到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
于 2019-03-03T09:13:48.453 回答
0

你可以写得更简单一点,如下所示。

"REFNO=0FWEB8,STRTDATE=030119" | select-string -Pattern '=[A-Za-z0-9]+' -AllMatches | foreach { $_.Matches.Value.SubString(1) -join ", " }
于 2019-03-03T09:38:06.987 回答
0

我不认为我提供原创的东西,但为什么不试试呢?

@('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
  • 操作说明:https ://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/foreach-object?view=powershell-6#description ;
  • ForEach方法: https : //mcpmag.com/articles/2015/12/10/foreach-method-in-powershell.aspx ;
  • [regex]类型加速器:https : //mcpmag.com/articles/2015/09/30/regex-groups-with-powershell.aspx ;
  • Regex.Matches方法:https ://docs.microsoft.com/en-us/dotnet/api/system.text.regularexpressions.regex.matches ? view=netframework-4.7.2 。
于 2019-03-03T10:55:29.493 回答
0

这是可以根据用例使用 -Join 的地方。

关于_加入 | 微软文档

所以,你的意思是...

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
于 2019-03-03T09:05:27.880 回答