我从文件中获取了我需要的信息,但是我需要一个列来显示它从中提取的实际日志。
Get-ChildItem -recurse -filter *.log |
get-content | select-string -pattern "dummy" |
group path | select name | export-csv "c:\temp\kent.csv"
我每行都在寻找类似的东西: 两栏:
日志位置名称: c:\ temp \ logs \ 1.log
在日志中引用DUMMY备注: http://dummy.CORPORATE.LOCAL/SMS_DP_SMSPKG $ / bf91665c-4e7b-441a-8bda-87d60a5b8bbe] LOG]!>
答案 0 :(得分:1)
您的代码的一个关键是您使用Get-Content
断开与源文件的连接,这就是您应该看到" InputStream"在你的输出中。 Select-String
可以直接从管道中获取文件对象,因此不需要先将它们转换为字符串数组。
$path = "C:\temp"
$pattern = "dummy"
$outputPath = "c:\temp\kent.csv"
Get-ChildItem $path -Recurse -Filter *.txt | Select-String -Pattern $pattern -SimpleMatch |
Select-Object Path,Line | Export-Csv $path -NoTypeInformation
我还使用了-SimpleMatch
,因为支持正则表达式并且您的示例不使用它。
答案 1 :(得分:0)
试试这个:
Get-ChildItem -recurse -filter *.log `
| %{$LogFile = $_.FullName; $_} `
| get-content `
| select-string -pattern "dummy" `
| group path `
| select name, @{N='LogFileName'; E={$LogFile}} `
| export-csv "c:\temp\kent.csv"
您可以忽略反引号和新行;这些只是为了让代码更容易阅读。
| %{$LogFile = $_.FullName; $_}
- 在名为$LogFile
的变量中记录文件名,然后将收到的内容传递给管道中的下一个元素。
| select name, @{N='LogFileName'; E={$LogFile}}
- 我添加了一个名为LogFileName
的新列,其值(表达式)取自之前填充的$LogFile
变量。