2016-12-21 3 views
1

私は、ファイルを読み取り、エラーコードを抽出するPowerShellスクリプトを使用しています。それはすばやくシンプルで、私が望む仕事はしていますが、私はこれを幅広い聴衆と共有するよう求められていますので、もう少し堅牢にする必要があります。文字列のテキストファイルを検索し、結果とCSVファイルの内容を使用して検索を実行するにはどうすればよいですか?

私が持っている問題は、私は私のスクリプトからの出力を取り、私が一覧表示されます最後にユーザーフレンドリーテーブルを取得するようにCSVファイルに対してルックアップするためにそれを使用する必要があるということです。

  1. (降順に)各エラーが発生したどのように多くの時間をカウント
  2. エラーコード
  3. それはこれがライン形式はである

エンドユーザに表示する対応するエラーメッセージソースファイルは、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ルックアップするのは簡単ですが、1行に2つの値を入力するだけです。

Code,Error message 

私はに取得する必要がどのような次のようなものです:

Count Name      Error Message 
----- ----      ----- 
    24 Error106013    Error:blah 
    14 Error106109    Error:blah,blah 
    12 Error203002    Error:blah,blah,balh 

Googleが、私は少なくとも正しい方向に私を指すことができますそこに誰かがあることを望んでいるので、私が失敗しました。

答えて

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へのパスを交換する必要があります。

+1

ありがとうございました。私は計算されたプロパティを行うとは思わなかった。 – MattP

+0

ようこそ。選択文字列のパターンを拡張して情報を取得すると、スクリプトを改善できます。これを1行で行うことができ、繰り返し処理を繰り返す必要はありません。 –

+0

私はそれについて考えましたが、.datファイルが1つのドメイン上にあり、アクセスするには管理者特権が必要で、エラーコードcsvは別のドメインにあります。私はパターンを拡張しようとしたときに、私は – MattP

関連する問題