将一个对象格式化为一个整齐的列表 [英] Formating an Object as a neatly looking List
问题描述
通过
Format-List
管道包含对象的变量会产生空行,这会产生问题。在使用 $ obj = $ obj |时,由于某些原因,我无法删除空行? {$ _}
我希望包含对象的变量包含正确的对象数量。
有趣的是当我运行 $ Host
第一个(它有我正在寻找的格式),然后运行变量 $ obj
,然后我得到我正在寻找的结果。
$ p
$ b $ p
$ b
$ String = @
文件名:O:\iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii
iiiiiiiiiiiiiii.txt
:`$ DATA 9
SummaryInformation 128
{4c8cc155-6c1e-11d1-8e41-00c04fb9386d} 0
FileName:O:\ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss
sssssssssssssss.txt
$ b $:$ data 9
SummaryInformation 128
{4c8cc155-6c1e-11d1-8e41-00c04fb9386d} 0
$ b文件名:
O:\aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.txt
:`$ DATA 0
Lzip7
@
[regex] $ pattern1 ='(?s)\s +文件名:\s +(?< ; FullName>。*?)\s +:\ $ DATA'
$ Match1 = $ String | Select-String -Pattern $ pattern1 -AllMatches |
%{$ _。Matches}
[regex] $ pattern2 ='(?sm)(?:(?< Stream> ^:\ $ DATA。*?)\\ \\ s + FileName |(?< Stream> ^:。*))'
$ Match2 = $ String | Select-String -Pattern $ pattern2 -AllMatches |
%{$ _。匹配}
$ obj = 0 ..($ Match1.Count -1)| %{
New-Object -TypeName PsObject -Property @ {
FullName = $ Match1 [$ _]。Groups ['FullName']。Value
Streams = $ Match2 [$ _]。价值
}
}
$ obj
编辑:这是我得到的输出,即使在删除换行符时也是如此:
FullName
---- ----
○:\iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii ...
○:\ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss ...
○:\aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.txt
您不会从您从字符串解析的文件名中删除换行符。这很可能就是为什么你的列表输出没有按照你想要的方式换行。
改变这个:
$ obj = 0 ..($ Match1.Count -1)| %{
New-Object -TypeName PsObject -Property @ {
FullName = $ Match1 [$ _]。Groups ['FullName']。Value
Streams = $ Match2 [$ _]。价值
}
}
对此:
$ obj = 0 ..($ Match1.Count -1)| %{
$ p $ > b
New-Object -TypeName PsObject -Property @ {
FullName = $ Match1 [$ _]。Groups ['FullName']。Value -replace'[\r\\\
] +'
Streams = $ Match2 [$ _]。Groups ['Stream']。Value
}
}
,问题应该消失。
I'm trying to output the objects as such:
Piping the variable containing the objects thru
Format-List
produces empty lines which creates problems. I'm not able to remove the empty lines for some reason when using$obj = $obj | ? {$_}
I expect the variable containing the objects to contain the right count of objects.
Interesting enough when I run
$Host
first (which has the formatting I'm looking for) and then run the variable$obj
, then I get the results I'm looking for.Any help is much appreciated.
Here's the code:
$String = @" FileName: O:\iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii iiiiiiiiiiiiiii.txt :`$DATA 9 SummaryInformation 128 {4c8cc155-6c1e-11d1-8e41-00c04fb9386d} 0 FileName: O:\ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss sssssssssssssss.txt :`$DATA 9 SummaryInformation 128 {4c8cc155-6c1e-11d1-8e41-00c04fb9386d} 0 FileName: O:\aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.txt :`$DATA 0 Lzip 7 "@ [regex]$pattern1 = '(?s)\s+FileName:\s+(?<FullName>.*?)\s+:\$DATA' $Match1 = $String | Select-String -Pattern $pattern1 -AllMatches | % { $_.Matches } [regex]$pattern2 = '(?sm)(?:(?<Stream>^:\$DATA.*?)\s+FileName|(?<Stream>^:.*))' $Match2 = $String | Select-String -Pattern $pattern2 -AllMatches | % { $_.Matches } $obj = 0..($Match1.Count -1) | % { New-Object -TypeName PsObject -Property @{ FullName = $Match1[$_].Groups['FullName'].Value Streams = $Match2[$_].Groups['Stream'].Value } } $obj
Edit: Here is the output I get even when removing line breaks as suggested:
FullName -------- O:\iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii... O:\ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss... O:\aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.txt
解决方案You don't remove linebreaks from the filenames you parsed from the string. That's most likely why your list output doesn't wrap the way you want it to.
Change this:
$obj = 0..($Match1.Count -1) | % { New-Object -TypeName PsObject -Property @{ FullName = $Match1[$_].Groups['FullName'].Value Streams = $Match2[$_].Groups['Stream'].Value } }
to this:
$obj = 0..($Match1.Count -1) | % { New-Object -TypeName PsObject -Property @{ FullName = $Match1[$_].Groups['FullName'].Value -replace '[\r\n]+' Streams = $Match2[$_].Groups['Stream'].Value } }
and the problem should disappear.
这篇关于将一个对象格式化为一个整齐的列表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!