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

时间:2018-01-02 10:18:23

标签: powershell

这是一个最小的复制示例。

预期结果:

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输出,并且我得到了与虚假换行相同的问题。)

1 个答案:

答案 0 :(得分: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关于类似的问题。