2010-04-20 105 views
16

我在写一个小小的PowerShell脚本时感到有些沮丧。使用out-file时避免换行

基本上,我通过文本文件循环检查每一行对正则表达式模式的数组。 将结果传送到将其附加到另一个文本文件的out-file 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

'foreach {Select-String -InputObject $ _}'?为什么不直接直接输入'Select-String'呢? – Joey 2010-04-20 13:55:25

+0

嗨约翰内斯, 说实话,我不知道这可能会有所帮助。 – bitfrickler 2010-04-20 14:11:33

+0

这不是你的问题的答案(因此对你的问题发表评论,而不是*回答);只是记录你如何在你的指挥中减少混乱。 – Joey 2010-04-20 18:21:41

回答

9

你为什么不使用Add-Content您可以通过指定解决这一问题?

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

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

+0

很高兴提供帮助;)它可以工作,但通常格式化一些对象可能会很棘手。在这种情况下,我猜'每个'MatchInfo'对象都会调用'ToString()'。对于许多其他类型,'ToString()'只返回一个类型名称(没有有用的信息)。然后,Keith建议指定具体的属性是需要的。 – stej 2010-04-21 06:14:33

10

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