我一直在使用PowerShell脚本来读取文件并提取错误代码。它快速,简单,完成了我想要的工作,但我现在被要求与广大读者分享,所以我需要让它更加健壮。
我遇到的问题是我需要从我的脚本中获取输出并使用它来查找CSV文件,以便我在最后列出一个用户友好的表:
这是源文件中的行格式,通常在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
谷歌让我失望,所以我希望那里有人能够至少指出我正确的方向。
答案 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的路径。