PowerShell选择弦输出为1行中的CSV



我试图将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,但即使失败了。语法应该是什么?我敢肯定它很简单,但似乎无法使我的头变得相同。

您可以写一些简单的内容。

"REFNO=0FWEB8,STRTDATE=030119" | select-string -Pattern '=[A-Za-z0-9]+' -AllMatches | foreach { $_.Matches.Value.SubString(1) -join ", " }

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

大约_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

您可以将结果添加到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

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

@('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://learn.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://learn.microsoft.com/en-us/dotnet/api/system.text.regularexpressions.regex.matches?view = netframework-4.7.7.2。

相关内容

  • 没有找到相关文章

最新更新