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