上下文输出到CSV文件

问题描述:

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

$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 

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

+0

问问自己:如果你不能费力去解决你的问题,为什么还有其他人?更何况,正确的格式对于理解你期望的结果是至关重要的。 –

+0

真的很抱歉格式化。我按照说明尝试过,但没有奏效。感谢您以适当的格式编辑它,非常感谢。 –

如果要导出为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]是上下文后的第一道防线。

+0

是的,它工作。我只需要移除'-Append -NoType -Delimiter“'t”'就像这样,CSV文件中的输出只在一列中。通过删除它,输出在列中正确输出。谢谢你的帮助。 –

+0

哦,我的坏。问题是,我需要在PowerShell 2.0上运行它,我无法使用'-append'你有没有其他选择? –

+0

嗯,从头开始。 'Export-Csv'在每个单词的管道末尾,所以在这里不需要'-Append'。固定。 –