在要导出的csv中的列中添加文件名

时间:2016-10-31 12:43:01

标签: powershell csv

我从文件中获取了我需要的信息,但是我需要一个列来显示它从中提取的实际日志。

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]!>

2 个答案:

答案 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变量。

    < / LI>