2

リモート サーバー上のアプリケーションおよびシステム イベント ログの過去 30 日間のレビューをスクリプト化し、警告、エラー、または重大なエントリのみを探しています。

ここや他のフォーラムで見つけたものを借りて、次のことを思いつきました。

$Date = Get-Date
$Range = $Date.AddDays(-30)
$Range = $range.ToShortDateString();
$LogName = Read-Host "Which Log? (Application, System)"
$Server = Read-Host "Please Enter Server Name"

get-eventlog $LogName -ComputerName $Server -After $range | where {$_.EntryType -eq "Error" -or $_.EntryType -eq "Warning" -or $_.EntryType -eq  "Critical"}

これはかなり速く実行されるように見えますが、プロンプトに戻る前に数分 (5 ~ 10 分以上) ハングします。

注: コードを削除すると:

-After $range

単に ctrl-c で出力を中断して 1 日を続けることもできますが、意図したとおりに実行してから停止したいのです...

だから:このハングを解消する方法についてのアイデアはありますか?
また、コードをよりエレガントに (そしてより速く) するためのアイデアも歓迎します! また、スクリプトを 2 回実行することなく、アプリケーション ログとシステム ログの両方をチェックしてもかまいません....

4

2 に答える 2

2

リモート システムの場合、同じコマンドを Invoke-Command にラップすると、複数のシステムを個別にクエリするよりも高速に一度に複数のシステムにクエリを実行できることがわかりました。これが私の解決策です。システムが増えるほど、時間の節約になります。YMMV

$command = {Get-EventLog -LogName Application -After (Get-Date).AddHours("-24")}
Invoke-Command -ComputerName "foo1","foo2","foo3","foo4" -ScriptBlock $command
于 2014-07-01T23:30:47.390 に答える
2

-EntryTypestring-array パラメーターを on に使用するGet-EventLogと、イベント ログ全体を取得してからフィルター処理するよりもはるかに高速です。Where-Object

試すget-eventlog -Logname System -EntryType ("Error", "Warning")

ただし...「クリティカル」を-EntryType配列に入れると、次のようになります。次The argument "Critical" does not belong to the set "Error,Information,FailureAudit,SuccessAudit,Warning" specified by the ValidateSet attribute.のアドバイスに注意する必要があるかどうか疑問に思いますGet-Help Get-EventLog

EventLog 名詞を含むコマンドレット (EventLog コマンドレット) は、従来のイベント ログでのみ機能します。Windows Vista 以降のバージョンの Windows で Windows イベント ログ テクノロジを使用するログからイベントを取得するには、Get-WinEvent を使用します。

代わりに使用Get-WinEventすると、これがあなたが望むものだと思います: Get-Winevent -FilterHashtable @{LogName="System","Application"; Level=1,2,3; startTime=$range}

これにより、レベル 1、2、または 3 (それぞれクリティカル、エラー、警告) のイベントがチェックされ、同じ呼び出しでアプリケーション ログとシステム ログの両方が検索されます。

于 2013-09-26T01:40:37.587 に答える