使用Out-File时避免换行

18

我正在写一个小的PowerShell脚本,但遇到了一些困惑。

基本上,我通过循环遍历文本文件,检查每一行是否符合正则表达式模式数组。 然后将结果传输到out-file命令,将其附加到另一个文本文件中。

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;-) 非常感谢任何帮助。

Kevin


2
为什么不直接将管道传递到 Select-String,而是使用 foreach { Select-String -InputObject $_ } - Joey
嗨,约翰内斯,说实话,我不知道这可能有什么帮助。 - bitfrickler
这并不是针对你的问题的答案(因此是对你的问题的评论,而不是答案);只是一个关于如何减少命令中混乱的提示。 - Joey
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

12

为什么不使用 Add-Content

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

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


很高兴能帮忙 ;) 它运行正常,但通常格式化某些对象可能会有些棘手。在这种情况下,我猜每个MatchInfo对象都调用了 ToString()。对于许多其他类型,ToString()只返回一个类型名称(没有有用的信息)。那么,就像Keith建议的那样需要指定具体的属性。 - stej

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接