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

Select-String in Powershell only displaying part of the line from a text file, need it to display whole thing

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

$lines = Select-String -Path $logDir -Pattern "SRVE0242I:" | Select-Object line | Out-String

虽然在输出时,它只显示以下内容:


[28/06/17 13:48:27:839] 00000020 ServletWrappe I SRVE0242I: [用户] [用户] [com_xxxxxxx_...

而不是整行。这拉动的字符数有限制吗?我找不到有关 Select-String cmdlet 的任何限制的任何信息。有没有更好的方法来做到这一点,这样我就不会 a) 在我的行列表中拉出标题 "Line" (真的不想为这样一个简单的输出创建 table 格式)和b) 当我提取信息时得到整行?

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

改为这样做:

$lines = Select-String -Path $logDir -Pattern "SRVE0242I:" | Select-Object -ExpandProperty line

此returns Line 属性 的值作为字符串传递给$lines 变量。您不需要使用 Out-String.

有!长话短说,Select-Object 正在执行 t运行cating 操作。这是在 Select-String 输出

中获取第一个 unt运行cated 行的一种方法
$(Select-String -Path $logDir -Pattern "SRVE0242I:")[0].Line

当您 运行 遇到这样的事情时,您可以分解各个步骤以确定通过管道将事情传递给 Get-Member 发生了什么。以下是上面代码中发生的事情:

Select-String <# args #> | Get-Member

Select-String 为我们提供了一个 MatchInfo 对象,该对象(如您正确确定的那样)具有 'Line' 属性。当 运行 单独使用时,Select-String 实际上会吐出您要查找的所有信息,并且默认情况下不会 运行 对其进行分类(至少在 v6.1 上)。 0.0-测试版)。如果找到多个匹配项,它确实会为您提供一个 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 将显示一个字符串而不是 MatchInfo 对象。

它与此处没有直接关系,但如果您有兴趣修改默认格式,它由 types.ps1xml 文件管理。