17

我对我正在编写的一个小 PowerShell 脚本感到有点沮丧。

基本上,我遍历文本文件以检查每一行是否符合正则表达式模式的数组。结果通过管道传送到输出文件 cmdlet,该 cmdlet 将其附加到另一个文本文件。

Get-ChildItem $logdir -Recurse -Include @('*.txt') | Get-Content | ForEach-Object { 
Select-String $patterns -InputObject $_ | Out-File $csvpath -Append -Width 1000 }

我的问题是我无法通过 out-file 忽略它在 $csvpath 后面的文件中创建的那些额外的换行符(每行后三个)。我可以使用 .NET 框架类来实现相同的目标,但我宁愿坚持使用纯 PowerShell ;-)

任何帮助是极大的赞赏。

凯文

4

2 回答 2

16

请记住,Select-String 输出 MatchInfo 对象而不是字符串 - 如以下命令所示:

gci $logdir -r *.txt | gc | select-string $patterns | format-list *

您要求在输出到文件之前将 MatchInfo 对象隐式呈现为字符串。出于某种我不明白的原因,这会导致输出额外的空白行。您可以通过指定您只希望 Line 属性输出到文件来解决此问题,例如:

gci $logdir -r *.txt | gc | select-string $patterns | %{$_.Line} | 
    Out-File $csvpath -append -width 1000
于 2010-04-20T15:22:12.117 回答
11

你为什么不使用Add-Content

gci $logdir -rec *.txt | gc | select-string $pattern | add-content $csvpath

您不需要指定宽度和-append开关,默认情况下文件大小不会翻倍(尽管您可以指定编码)并且看起来像您一样的空行没有问题。

于 2010-04-20T19:37:35.817 回答