Powershell中的Select-String仅显示文本文件中的部分行,需要它来显示整个内容

use*_*504 5 powershell cmdlet select-string

我试图编写一个简单的PS脚本来检查大型.txt日志文件中的短字符串:“ SRVE0242I:”

$lines = Select-String -Path $logDir -Pattern "SRVE0242I:" | Select-Object line | Out-String
Run Code Online (Sandbox Code Playgroud)

但是在输出时,它仅显示以下内容:


[28/06/17 13:48:27:839] 00000020 ServletWrappe I SRVE0242I:[User] [User] [com_xxxxxxx _...

而不是全线。提取的字符数是否有限制?我找不到有关Select-String cmdlet的任何限制的任何信息。有没有更好的方法可以做到这一点,所以我不会a)在行列表中拉标题“ Line”(不想真的为这种简单的输出创建表格格式),b)获得整行当我提取信息时?

Mar*_*agg 5

您之所以会看到它,是因为它Line使用默认Format-Table视图显示属性并将其缩短到控制台的宽度。

改为这样做:

$lines = Select-String -Path $logDir -Pattern "SRVE0242I:" | Select-Object -ExpandProperty line
Run Code Online (Sandbox Code Playgroud)

这会将Line属性的值作为字符串返回给$lines变量。您无需使用Out-String


小智 2

有!长话短说,Select-Object 在这里进行截断。这是获取 Select-String 输出中第一个未截断行的方法

$(Select-String -Path $logDir -Pattern "SRVE0242I:")[0].Line
Run Code Online (Sandbox Code Playgroud)

当您遇到类似的情况时,您可以通过将事情通过管道传递给 Get-Member 来分解各个步骤来确定发生的情况。以下是上面代码中发生的情况:

Select-String <# args #> | Get-Member
Run Code Online (Sandbox Code Playgroud)

Select-String 为我们提供了一个 MatchInfo 对象,它(正如您所正确确定的)具有“Line”属性。当单独运行时,Select-String 实际上会输出您正在查找的所有信息,并且默认情况下不会截断它(至少在 v6.0.0-beta 上)。如果它找到多个匹配项,它确实会为您提供一个 MatchInfo 对象数组,因此如果您只想要第一个匹配项,则必须索引到该数组(就像我上面所做的那样)。

Select-String <# args #> | Select-Object Line | Get-Member
Run Code Online (Sandbox Code Playgroud)

Select-Object 对对象应用 PowerShell 的默认格式,在大多数情况下,这会截断输出以便于查看。对于具有一堆成员的对象(如 MatchInfo 对象),默认情况下它将尝试每行执行一个成员。

Select-String <# args #> | Select-Object Line | Out-String | Get-Member
Run Code Online (Sandbox Code Playgroud)

Out-String直接将其输入转换为字符串。也就是说,它不是尝试将某些内容转换为字符串或从传递给它的对象中提取字符串属性,而是将接收到的任何内容更改为对象。在本例中,它将已格式化的 MatchInfo 输出转换为字符串。终端上的输出没有任何变化,但 Get-Member 将显示一个 String 而不是 MatchInfo 对象。

它与此处不直接相关,但如果您有兴趣修改默认格式,则它由types.ps1xml文件控制。