将一个对象格式化为一个整齐的列表 [英] Formating an Object as a neatly looking List

查看:182
本文介绍了将一个对象格式化为一个整齐的列表的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述





通过 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)| %{
New-Object -TypeName PsObject -Property @ {
FullName = $ Match1 [$ _]。Groups ['FullName']。Value -replace'[\r\\\
] +'

Streams = $ Match2 [$ _]。Groups ['Stream']。Value
}
}
b

,问题应该消失。


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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆