有!长话短说,Select-Object 在这里进行截断。这是在 Select-String 输出中获取第一条未截断行的一种方法
$(Select-String -Path $logDir -Pattern "SRVE0242I:")[0].Line
当你遇到这样的事情时,你可以分解各个步骤,通过管道传递给 Get-Member 来确定发生了什么。这是上面代码中发生的事情:
Select-String <# args #> | Get-Member
Select-String 为我们提供了一个 MatchInfo 对象,该对象(正如您已正确确定的那样)具有“Line”属性。当它自己运行时,Select-String 实际上会吐出您正在寻找的所有信息,并且默认情况下不会截断它(至少在 v6.0.0-beta 上)。如果找到多个匹配项,它确实会为您提供一个 MatchInfo 对象数组,因此如果您只想要第一个匹配项(就像我在上面所做的那样),则必须对该数组进行索引。
Select-String <# args #> | Select-Object Line | Get-Member
Select-Object 对对象应用 PowerShell 的默认格式,在大多数情况下,这些格式会截断您的输出以便于查看。对于具有一堆成员的对象(如 MatchInfo 对象),默认情况下它会尝试每行一个。
Select-String <# args #> | Select-Object Line | Out-String | Get-Member
Out-String直接将其输入转换为字符串。也就是说,与其尝试将某些内容强制转换为字符串或将字符串属性从传递给它的对象中提取出来,它只是将接收到的任何内容更改为对象。在这种情况下,它将已经格式化的 MatchInfo 输出转换为字符串。终端上的输出没有任何反应,但 Get-Member 将显示一个 String 而不是 MatchInfo 对象。
它在这里不直接相关,但如果您对修改默认格式感兴趣,它由types.ps1xml文件管理。