0

Powershell で Windows Sever 2008 マシンの予期しないシャットダウン時間を取得しようとしていますGet-EventLogEventID6008のイベントを検索して のみを選択することで近づくことができますがmessage、フィールド内で解析して、発生した時間 (イベントが発生した時間ではありません) を取得する必要があります。

使ってみたのですが、使用replacementstrings[x]するフィールドの指定方法が分からず( messages)、結果が得られません。

get-eventlog -LogName System -ComputerName svr-name | Where-Object {$_.EventID -eq 6008 -AND $_.timegenerated -gt (get-date).adddays(-30)}| select message

これを生成します:

Message
-------
The previous system shutdown at 3:35:32 AM on ‎7/‎29/‎2014 was unexpected.
The previous system shutdown at 3:40:06 PM on ‎7/‎10/‎2014 was unexpected.`
4

3 に答える 3

3

リモート ホストからすべてのイベントを取得し、ローカル マシンでそれらをフィルター処理する方法は、通常、あまりうまく機能しません。その方法では、大量の無関係なイベントをネットワーク経由で送信し、それらを破棄するためです。Get-EventLogイベント ID またはソースの特定のタイムスタンプの前後でメッセージをフィルタリングするオプションがあるため、実際に関心のあるメッセージを事前に選択するためにそれらを使用することをお勧めします。クラッシュのタイムスタンプはMessage、通常のフィールドから抽出できます。式を使用してDateTime値に解析ParseExact():

$log     = 'System'
$server  = 'svr-name'
$id      = [uint64]"0x80000000" + 6008
$date    = (Get-Date).AddDays(-30)

$fmt     = 'h:mm:ss tt on M\/d\/yyyy'
$culture = [Globalization.CultureInfo]::InvariantCulture

Get-EventLog -LogName $log -ComputerName $server -InstanceId $id -After $date | ? {
  $_.Message -match 'at (\d+:\d+:\d+ [ap]m on \d+/\d+/\d+) was unexpected'
} | select MachineName, TimeGenerated,
           @{n='Crashtime';e={[DateTime]::ParseExact($matches[1], $fmt, $culture)}}

パイプラインは、プロパティMachineNameTimeGeneratedおよびCrashtime(最後の 1 つは計算されたプロパティ) を持つオブジェクトのリストを生成します。パイプラインの出力を変数 (例: ) に収集すると、次のように 3 番目のオブジェクトのプロパティに$evtアクセスできます。Crashtime

$evt = .\script.ps1
$evt[2].Crashtime
于 2014-08-08T23:36:45.510 に答える
1

もっと簡単に

get-eventlog system  | where-object {$_.EventID -eq  "6008"} | fl
于 2016-04-19T16:12:04.460 に答える