为什么Select-String会添加空行?

问题描述 投票:3回答:1

这是一个最小的repro示例。

预期结果:

PS C:\> ("a", "b")
a
b
PS C:\> ("a", "b") | Select-String "b"
b
PS C:\>

实际结果:

PS C:\> ("a", "b")
a
b
PS C:\> ("a", "b") | Select-String "b"

b


PS C:\>

如您所见,第二个输出前面有一个空行,匹配行后面有两个空行。

为什么会这样?我能做些什么呢?

(注意:这是一个最小的例子。在我的实际代码中,我正在为未提交的文件解析svn status输出,并且我得到了与虚假换行相同的问题。)

powershell
1个回答
5
投票

怪异输出的原因是Powershell完全是关于对象的。在这种特殊情况下,Select-String返回MatchInfo对象。像这样,

PS C:\> $o = ("a", "b") | Select-String "b"
PS C:\> $o

b


PS C:\> $o.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     False    MatchInfo                                System.Object

对于额外的混淆,显式调用ToString()不会输出换行符:

PS C:\> $o.ToString()
b
PS C:\>

对于解决方法,请查询MatchInfo的Line属性,如下所示,

PS C:\>  ("a", "b") | Select-String "b" | % { $_.Line }
b
PS C:\>

请参阅Keith Hill的answer关于类似的问题。

© www.soinside.com 2019 - 2024. All rights reserved.