这是一个最小的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完全是关于对象的。在这种特殊情况下,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关于类似的问题。