问题
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
回答1:
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.
来源:https://stackoverflow.com/questions/40321069/formating-an-object-as-a-neatly-looking-list