2017-05-21 30 views
0

これは特定の時間のイベントログを取得するスクリプトです。スクリプトを実行すると遅延が発生します

$time = Get-WinEvent microsoft-windows-dns-client/operational -MaxEvents 1 | 
Select-Object @{name="time"; expression={$_.timecreated.tostring("yyyy-MM-dd hh:mm:ss")}} | 
Select-Object -ExpandProperty time 

Get-WinEvent microsoft-windows-dns-client/operational | 
Where-Object {$_.timecreated.tostring("yyyy-MM-dd hh:mm:ss") -eq "$time"} 

私がスクリプトを実行すると、結果が表示されます。

60秒以上経過するとスクリプトが終了します。

私の間違いは何ですか?

enter image description here

[2つ目の質問]

このPowerShellのバグですか?

この状況では、ショーの結果後にスクリプトが終了しないことがあります。

enter image description here

3秒以下、画像のこの結果のために必要とされます。

enter image description here

なぜ遅いですか?

powershellには時間条件に関するバグがありますか?

私はこの問題を解決したと思います。ありがとうgms0ulman。

while($true) { 

    $QUERY = @" 
    <QueryList><Query><Select Path='Microsoft-Windows-DNS-Client/Operational'> 
     *[System/EventID = 3006] and 
     *[System/TimeCreated[timediff(@SystemTime) &lt;= 60000]] and 
     *[EventData/Data[@Name='QueryType'] != 28] 
    </Select></Query></QueryList> 
"@ 

    $CMD = (Get-WinEvent -FilterXml $QUERY).count 2>$null 

    if($CMD -ne 0) { 
     $LOG_LIST = Get-WinEvent -FilterXml $QUERY | Select-Object timecreated, processid, message | Sort-Object timecreated 

     foreach($LOG in $LOG_LIST) { 
      $TIMESTAMP = $LOG | Select-Object -ExpandProperty timecreated 
      $TIMESTAMP_SPLIT = $TIMESTAMP -split " " 
      $LOG_DATE = $TIMESTAMP_SPLIT[0] 
      $LOG_TIME = $TIMESTAMP_SPLIT[1] 
      $PROC_ID = $LOG | Select-Object -ExpandProperty processid 
      $PROC_NAME = Get-Process -id $PROC_ID | Select-Object -ExpandProperty processname 
      $MSG = $LOG | Select-Object -ExpandProperty message 
      $URL_1 = $MSG -replace '^\S{2}\s([^,]+).+','$1' 
      $URL_2 = $URL_1 -replace '^.*?([^.]+\.[^.]+\.?|[^.]+\.(ac|co|go|ne|nm|or|pe|re)\.[^.]+\.?)$','$1' 
      $LOG_SET = "$LOG_DATE`t$LOG_TIME`t$PROC_ID`t$PROC_NAME`t$URL_1`t$URL_2" 
      $LOG_SET >> C:\dns.csv 
      } 
     } 

    Start-Sleep 60 
    } 
+0

次のコマンドを検討してください: '1.e9 |?{$ _- lt10} '。他の数字が条件にマッチする可能性がないので、あなたはそれがすぐにプリント「9」として戻ることを期待していますか?または、それは処理し、他のすべての数字を破棄する必要がありますが、時間がかかりますか? – PetSerAl

+0

@PetSerAlスクリプトはすべての結果を表示しますが、ただちに終了しません。私はショー結果の直後にスクリプトを終了したい。 –

+0

しかし、そのスクリプトが既にすべての***結果を表示していることをどのように知っていますか?もっと重要なのは、スクリプトがそれをどのように知ることができるかです。 – PetSerAl

答えて

1

私は$time変数が何を期待含まれていないと思います。私のマシンでは、選択基準microsoft-windows-dns-client/operationalは無効です。私が間違っていた、それはあなたが最初

後にしているものではありません、私はそれらにEventLogsを制限しようとした -

# Get event based on your criteria. Implicitly converted to datetime data type 
# You can check by running $time.GetType() or $time | gm 
[datetime]$time = (Get-WinEvent microsoft-windows-dns-client/operational -MaxEvents 1).TimeCreated 

# Get events where the TimeCreated field matches the previous time. 
Get-WinEvent microsoft-windows-dns-client/operational | Where-Object {$_.TimeCreated -eq "$time"} 

編集:私はこれを信じる

はあなたが後にしているものです最後の日にその後、最後の分。しかし、私はまだあなたが言及する遅れを持っています。

解決策は、this articleに記載されているように、-FilterXMLパラメータを使用することでした。もちろん、PowerShellのイベントからあなたのニーズに合うようにカスタマイズする必要があります。

# xml source: https://blogs.msdn.microsoft.com/powershell/2011/04/14/using-get-winevent-filterxml-to-process-windows-events/ 
[xml]$filterXml = @" 
<QueryList> 
    <Query Id="0" Path="Windows PowerShell"> 
    <Select Path="Windows PowerShell">*[System[(Level=4 or Level=0)]]</Select> 
    </Query> 
</QueryList> 
"@ 

[datetime]$time = (Get-WinEvent -FilterXml $filterXml -MaxEvents 1).TimeCreated 

Get-WinEvent -FilterXml $filterXml | Where-Object {$_.TimeCreated -eq $time} 
+0

Powershellは、レジストリ(HKLM \ SYSTEM \ CurrentControlSet \ Services \ EventLog)に登録されているイベントログのみにアクセスできます。また、スクリプトはコマンドプロンプトのみを表示します。システムのような別のイベントログ名を試すことができます。ありがとうございました:) –

+0

@ Mr.kangありがとうございました - 最初は、特定のLogNameを未指定のままにして、最新のエントリを取得しました。明示的に '$ time'を' [datetime] 'にキャスティングする= ISEで動作します。遅さに関しては、 '-FilterXML'を使用して更新された回答をご覧ください。 – gms0ulman

+0

ありがとうございます。私は質問を更新しました。 –

関連する問題