上下文输出到CSV文件

时间:2015-11-03 11:43:07

标签: csv powershell powershell-v2.0 export-to-csv

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

$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

任何人都可以帮助我如何获得此输出?请建议是否有其他方法可以获得所需的输出。

1 个答案:

答案 0 :(得分: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]是后置词语的第一行。