如何在文本文件中搜索字符串并使用结果和CSV文件的内容执行查找?

时间:2016-12-21 14:03:17

标签: powershell csv powershell-remoting

我一直在使用PowerShell脚本来读取文件并提取错误代码。它快速,简单,完成了我想要的工作,但我现在被要求与广大读者分享,所以我需要让它更加健壮。

我遇到的问题是我需要从我的脚本中获取输出并使用它来查找CSV文件,以便我在最后列出一个用户友好的表:

  1. 每个错误发生的次数(按降序排列)
  2. 错误代码
  3. 它向最终用户显示的相应错误消息
  4. 这是源文件中的行格式,通常在2000行以上

    17-12-2016,10:17:44:487{String=ERROR->(12345678)<inData:{device=printer, formName=blah.frm, eject=FALSE, operation=readForm}><outData:{fields=0, CODE=, field1=}> <outError:{CODE=Error103102, extendedErrorCode=-1, VARS=0}>}
    

    这是我目前的剧本:

    $WS = Read-Host "Enter computer name"
    $date = Read-host "Enter Date"
    
    # Search pattern for select-string (date always at the beginning of the line and the error code somewhere further in)
    $Pattern = $date+".*<outError:{CODE="
    
    # This find the lines in the files that contain the search pattern
    $lines = select-string -path "\\$WS\c$\folder\folder\file.dat" -pattern $Pattern
    
    # This is the specific Error code pattern that I'm looking for in each line
    $regex = [regex] 'Error\d{1,6}'
    $Var = @()
    
    # Loops through each line and extracts Error code
    foreach ($line in $lines) { $a = $line -match $regex 
    # Adds each match to variable
    $Var += $matches.Values
    
     }
    
    # Groups and sorts results in to easy to read format 
    $Var | group | Sort-Object -Property count -descending
    

    这是它给我的结果:

    Count Name                      Group
    ----- ----                      -----
       24 Error106013                {Error106013, Error106013, Error106013, Error106013...}
       14 Error106109                {Error106109, Error106109, Error106109, Error106109...}
       12 Error203002                {Error203002, Error203002, Error203002, Error203002...}
    

    我需要查找的CSV非常简单,每行只有2个值:

    Code,Error message
    

    我需要做的是这样的事情:

    Count Name                      Error Message
    ----- ----                      -----
       24 Error106013                Error:blah
       14 Error106109                Error:blah,blah
       12 Error203002                Error:blah,blah,balh
    
    谷歌让我失望,所以我希望那里有人能够至少指出我正确的方向。

1 个答案:

答案 0 :(得分:1)

未经测试但应使用简单的计算属性 - 只需将最后一行替换为:

$errorMap = Import-Csv 'your_errorcode.csv'
$Var | Group-Object | Sort-Object -Property count -descending | 
    Select-Object Count, Name, @{l='Error Message'; e={($errorMap | Where-Object Code -eq $_.Name)."Error message"}}

注意:您还必须替换CSV的路径。