2017-07-04 114 views
2

我正在尝试编写一个简单的PS脚本来检查短字符串的大型.txt日志文件:“SRVE0242I:”Powershell中的Select-String只显示文本文件中的部分行,需要它显示整个事物

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

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

线
[28/06/17 13:48:27:839] 00000020 ServletWrappe我SRVE0242I:[用户] [用户] [ com_xxxxxxx _...

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

回答

1

还有!长话短说,Select-Object在这里进行截断。下面就来获得第一未截断线中选择字符串输出

$(Select-String -Path $logDir -Pattern "SRVE0242I:")[0].Line 

的一种方式。当你遇到这样的事情,你可以打破的各个步骤,以确定是什么通过管道事情的发生给Get-Member。这里发生的事情在上面的代码:

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

Select-String会为我们提供了一个MatchInfo对象,(因为你已经正确地确定)有一个“行”属性。当它自己运行时,Select-String实际上会吐出所有您要查找的信息,并且不会在默认情况下截断它(至少在v6.0.0-beta上)。如果发现多个匹配,它会为您提供一个MatchInfo对象数组,因此如果您只想要第一个匹配项(如上所述),则必须将其索引到该数组中。

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

选择,适用对象PowerShell的默认格式,在大多数情况下,将截断你的输出以方便查看的对象。对于有一堆成员的对象(比如MatchInfo对象),默认情况下它会尝试每行执行一个。

Select-String <# args #> | Select-Object Line | Out-String | Get-Member 

输出字符串直接翻译它输入一个字符串。也就是说,不是尝试将某些东西转换为字符串,或者将字符串属性从传递给它的对象中取出,只是将接收到的东西改变为对象。在这种情况下,它将已经格式化的MatchInfo输出转换为字符串。终端上的输出没有任何反应,但Get-Member将显示一个String而不是MatchInfo对象。

这里没有直接关系,但如果您有兴趣修改默认格式,则需要使用types.ps1xml文件进行管理。

2

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

而是执行此操作:

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

这将返回Line属性的值作为一个字符串变量$lines。你不需要使用Out-String

相关问题