我对我正在编写的一个小 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
请记住,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
为什么不使用
Add-Content
?
gci $logdir -rec *.txt | gc | select-string $pattern | add-content $csvpath
你不需要指定宽度和
-append
开关,默认情况下文件大小不会加倍(尽管你可以指定编码)并且看起来像你这样的空行没有问题。