使用out-file时避免换行

时间:2010-04-20 13:44:33

标签: powershell line-breaks

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

基本上我循环遍历文本文件,以针对正则表达式模式数组检查每一行。 结果通过管道传递给外部文件cmdlet,后者将其附加到另一个文本文件。

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

我的问题是我无法输出文件以省略它在$ csvpath后面的文件中创建的额外换行符(每行后三个)。 我可以使用.NET框架类来实现相同的功能,但我宁愿坚持使用纯PowerShell; - )

非常感谢任何帮助。

凯文

2 个答案:

答案 0 :(得分:14)

请记住,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

答案 1 :(得分:10)

为什么不使用Add-Content

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

您不需要指定宽度和-append开关,默认情况下文件大小不会加倍(尽管您可以指定编码)并且似乎空行没有问题,就像您有