0

プリンターログを読み取り(おそらくget-WMIコマンドレットを使用して)、ログを解析するPowerShellスクリプトを作成するための最初のステップに取り組んでいます。その後、スクリプトを.txtファイルに出力して、プリンターの名前、プリンターが使用された回数のカウンター(可能な場合)、およびログにある特定の情報を取得する予定です。

これを行うために、私は逆方向に作業することにしました。以下は、ログがどのように表示されるかのごく一部です。

10         Document 81, A361058/GPR0000151814_1: owned by A361058 was printed on R3556 via port IP_***.***.***.***.  Size in bytes: 53704; pages printed: 2                                                                  20130219123105.000000-300  
10         Document 80, A361058/GPR0000151802_1: owned by A361058 was printed on R3556 via port IP_***.***.***.***.  Size in bytes: 53700; pages printed: 2   

逆方向に作業して、最初に解析に集中するだけで、具体的に「/ GRP」、「R3446(通常、これはプリンター名であるためR * *)」を取得し、その方法を示すカウンターを取得できるようにしたいと思います。多くの場合、特定のプリンターがログファイルに表示されます。

最後にPowershellを使用してからしばらく経ちましたが、現時点では、目標を達成するためにこれを作成することができました。

Select-String -Path "C:\Documents and Settings\a411882\My Documents\Scripts\Print Parse Test.txt" -Pattern "/GPR", " R****" -AllMatches -SimpleMatch 

コードはエラーを生成しませんが、/GRPとプリンター名をキャプチャしているかどうかを確認するために画面に出力を表示することもできません。現時点では、カウンターについて心配する前に、正しい出力を収集していることを確認しようとしています。誰かが私を助けて、私のコードで何が間違っているのか教えてもらえますか?

ありがとう!

編集:画面にデータが表示されない原因となっていたコードの小さなエラーを修正しました。現時点では、このコードは/ GPRとサーバー名だけを出力するのではなく、2行のテストテキスト全体を出力します。新しい出力は次のとおりです。

My Documents\Scripts\Print Parse Test.txt:1:10         Document 81, A361058/GPR0000151814_1: owned by A361058 was printed on
 R3556 via port IP_***.***.***.***.  Size in bytes: 53704; pages printed: 2                                                  
                20130219123105.000000-300  
My Documents\Scripts\Print Parse Test.txt:2:10         Document 80, A361058/GPR0000151802_1: owned by A361058 was printed on
 R3556 via port IP_***.***.***.***.  Size in bytes: 53700; pages printed: 2  

最終的には次のようになってみてください。

/GPR, R****, count: ## (although for now I'm less concerned about the counter)
4

2 に答える 2

1

これを試すことができます。/GPR(および "printed on" の "on") が存在する場合にのみ行を返します。

Get-Content .\test.txt | % { 
    if ($_ -match '(?:.*)(/GPR)(?:.*)(?<=on\s)(\w+)(?:.*)') {
        $_ -replace '(?:.*)(/GPR)(?:.*)(?<=on\s)(\w+)(?:.*)', '$1,$2'
    }
}

出力:

/GPR,R3556
/GPR,R3556

より良い正規表現バージョンがあると確信しています。私はまだそれを学んでいます:-)

編集これは読みやすいです。select-string正規表現はまだ抽出用にありますが、代わりに/GPR を最初に使用して行を除外します。

Get-Content .\test.txt | Select-String -SimpleMatch -AllMatches -Pattern "/GPR" | % {
    $_.Line -replace '(?:.*)(/GPR)(?:.*)(?<=on\s)(\w+)(?:.*)', '$1,$2'
}
于 2013-02-21T19:12:25.133 に答える
0

私は通常、一致させる行の例から始めて、そこから正規表現を作成し、テキストの変数部分を正規表現のメタ文字に置き換えます。これにより、正規表現が長くなりますが、後で読むのがより直感的になります。

正規表現を変数に割り当て、その後のコードでその変数を使用して、正規表現の厄介な詳細が残りのコードを混乱させないようにします。

[regex]$DocPrinted = 
'Document \d\d, \w+/(\D{3})[0-9_]+: owned by \w+ was printed on (\w+) via port IP_[0-9.]+  Size in bytes: \d+; pages printed: \d+'

get-content <log file> |

foreach {
 if ($_ -match $DocPrinted)
   {
     $line -match $docprinted  > $null 
     $matches 
   }
 }                                                           
于 2013-02-21T19:59:29.197 に答える