【问题标题】:Context Output into CSV file上下文输出到 CSV 文件
【发布时间】:2016-02-03 13:18:59
【问题描述】:

我需要在整个应用程序代码(超过 10000 个程序)中搜索 10-15 个字符串,因此我已将需要搜索的字符串插入到文本文件“strings.text”中。我还需要知道匹配字符串行的上一行和下一行,所以我在下面的脚本中使用“上下文 1”。但是,以下脚本仅将输出作为匹配的字符串行。

$content = Get-Content strings.txt
ForEach ($Word in $content){
  Get-ChildItem -recurse |
    Select-String -pattern $Word -Context 1 |
    Select-  path,line,linenumber,filename |
    Export-csv -Path "\result_$word.csv"
}

输出:

Path                Line          LineNumber   FileName
desktop\prog1.txt   Server(xyz)   3            prog1.txt
desktop\prog2.txt   Server(xyz)   6            prog2.txt

我真正想要的是:

Path                Line          LineNumber   FileName
                    Connect       2            prog1.txt
desktop\prog1.txt   Server(xyz)   3            prog1.txt
                    stop          4            prog1.txt

                    Connect       8            prog2.txt
desktop\prog2.txt   Server(xyz)   9            prog2.txt
                    stop          10           prog2.txt

谁能帮助我如何获得这个输出?请建议是否有任何其他方法可以获得所需的输出。

【问题讨论】:

  • 扪心自问:如果你懒得去解决你的问题,为什么其他人会这样做?更不用说正确的格式对于理解你想要的结果是至关重要的。
  • 真的很抱歉格式化。我按照说明试过了,但没有用。感谢您以正确的格式编辑它,非常感谢。

标签: csv powershell powershell-2.0 export-to-csv


【解决方案1】:

如果您想导出为 CSV,您需要为每个 CSV 行创建单独的对象。试试这样的:

foreach ($Word in $content){
  Get-ChildItem -Recurse |
    Select-String -Pattern $Word -Context 1 |
    ForEach-Object {
      New-Object -Type PSCustomObject -Property @{
        Path       = ''
        Line       = $_.Context.PreContext[-1]
        LineNumber = $_.LineNumber - 1
        Filename   = $_.FileName
      }
      New-Object -Type PSCustomObject -Property @{
        Path       = $_.Path
        Line       = $_.Line
        LineNumber = $_.LineNumber
        Filename   = $_.FileName
      }
      New-Object -Type PSCustomObject -Property @{
        Path       = ''
        Line       = $_.Context.PostContext[0]
        LineNumber = $_.LineNumber + 1
        Filename   = $_.FileName
      }
    } | Export-Csv -Path "\result_$word.csv" -NoType
}

$_.Context.PreContext[-1] 是前置上下文的最后一行,$_.Context.PostContext[0] 是后置上下文的第一行。

【讨论】:

  • 是的,它奏效了。我只需要删除 -Append -NoType -Delimiter "t"` 与此一样,CSV 文件中的输出仅在一列中。通过删除它,输出在列中正确输出。感谢您的帮助。
  • 哦,我的错。问题是,我需要在无法使用-append 的 powershell 2.0 上运行它,你有什么替代方法吗?
  • 嗯,从头开始。 Export-Csv 位于每个单词的管道末尾,因此此处不需要 -Append。固定。
  • 谢谢安斯加尔。我应该不问你就第二次检查。是的,它是固定的。再次感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-06
  • 1970-01-01
相关资源
最近更新 更多