【问题标题】:Avoid line breaks when using out-file使用 out-file 时避免换行
【发布时间】:2010-04-20 13:44:32
【问题描述】:

我对正在编写的一个小 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 ;-)

非常感谢任何帮助。

凯文

【问题讨论】:

  • foreach { Select-String -InputObject $_ }?为什么不直接通过管道输入Select-String
  • 嗨,Johannes,老实说,我不知道这有什么帮助。
  • 这不是您问题的答案(因此对您的问题发表评论并且不是答案);只是说明如何减少命令中的混乱。

标签: powershell line-breaks


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    你为什么不用Add-Content

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

    你不需要指定宽度和-append开关,文件大小默认不加倍(虽然你可以指定编码),看起来像你这样的空行没有问题。

    【讨论】:

    • 很高兴为您提供帮助;)它可以工作,但通常格式化某些对象可能会很棘手。在这种情况下,我猜 ToString() 会在每个 MatchInfo 对象上调用。对于许多其他类型,ToString() 只返回一个类型名称(没有有用的信息)。然后就像 Keith 建议的那样,需要指定具体的属性。
    猜你喜欢
    • 2017-01-07
    • 2013-03-08
    • 1970-01-01
    • 2020-01-26
    • 2021-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多