上下文输出到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
任何人都可以请帮助我如何能得到这个输出?请建议是否有其他方式获得所需的输出。
如果要导出为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文件中的输出只在一列中。通过删除它,输出在列中正确输出。谢谢你的帮助。 –
哦,我的坏。问题是,我需要在PowerShell 2.0上运行它,我无法使用'-append'你有没有其他选择? –
嗯,从头开始。 'Export-Csv'在每个单词的管道末尾,所以在这里不需要'-Append'。固定。 –
问问自己:如果你不能费力去解决你的问题,为什么还有其他人?更何况,正确的格式对于理解你期望的结果是至关重要的。 –
真的很抱歉格式化。我按照说明尝试过,但没有奏效。感谢您以适当的格式编辑它,非常感谢。 –