web-dev-qa-db-ja.com

すべてのWindowsイベントログカテゴリをすばやく消去する方法

Windows 7では、イベントビューアを開いていくつかのカテゴリを参照します。右ペインのログのクリア...をクリックして、単一のカテゴリをクリアすることもできます。

すべてのカテゴリをクリアしたい場合、1つずつクリックしてクリアする必要がありますか?
それらの数十があります。より速い方法はありますか?たぶんPowerShellで?

enter image description hereenter image description here

17
nixda

WEvtUtil.exeを試す

GUIを介してすべてのログを一度にクリアする方法はありません。少なくとも私が今まで見つけたことはありません。 :)

中間ファイルでループして削除

WEVTUTIL.exe を使用してログをテキストファイルにリストし、そのテキストファイルを使用して各ログを削除するバッチファイルを次に示します。

WEVTUTIL EL > .\LOGLIST.TXT
for /f %%a in ( .\LOGLIST.TXT ) do WEVTUTIL CL "%%a"
del .\LOGLIST.TXT
timeout 30

これを1つのバッチファイルにまとめるのが安全でないと感じた場合は、これを2つの別々のファイルに保存して、次々に実行できます。
(現在のディレクトリに「loglist.txt」が見つからない場合、「Nuke」バッチはエラーになります。)

Populate-LogList.cmd

@ECHO OFF
REM Source: https://superuser.com/a/655185/389368
WEvtUtil.exe enum-logs > .\LOGLIST.TXT

Nuke-LogList.cmd

@ECHO OFF
REM Source: https://superuser.com/a/655185/389368
for /f %%a in ( .\LOGLIST.TXT ) do WEvtUtil.exe clear-log "%%a"
del .\LOGLIST.TXT
timeout 30

ループして直接削除する

Logmanが his answer で指摘したように、(バッチファイルの%のdouble)のようなものを使用することで、これをさらに短縮できます(中間テキストファイルの必要性を排除できます)。

for /f %%a in ('WEVTUTIL EL') do WEVTUTIL CL "%%a"
timeout 30

管理者として実行!

どちらの方法を選択する場合でも、必ず「管理者として実行」してください。

私が見つけた最も簡単な解決策。 Vista以来それを使用しています。 :)

18

コマンドプロンプトを開くか、バッチスクリプトを作成して「管理者として実行」します。

for /f %x in ('wevtutil el') do wevtutil cl "%x"

すべてのイベントログをクリアするためのPowerShellコード:

wevtutil el | Foreach-Object {Write-Host "Clearing $_"; wevtutil cl "$_"}

または、スクリプトで選択してください:

wevtutil.exe cl Analytic
wevtutil.exe cl Application
wevtutil.exe cl DirectShowFilterGraph
wevtutil.exe cl DirectShowPluginControl
wevtutil.exe cl EndpointMapper
wevtutil.exe cl ForwardedEvents
wevtutil.exe cl HardwareEvents
wevtutil.exe cl Internet Explorer
wevtutil.exe cl Key Management Service
wevtutil.exe cl MF_MediaFoundationDeviceProxy
wevtutil.exe cl "Media Center"
wevtutil.exe cl MediaFoundationDeviceProxy
wevtutil.exe cl MediaFoundationPerformance
wevtutil.exe cl MediaFoundationPipeline
wevtutil.exe cl MediaFoundationPlatform
wevtutil.exe cl Microsoft-IE/Diagnostic
wevtutil.exe cl Microsoft-IEFRAME/Diagnostic
wevtutil.exe cl Microsoft-PerfTrack-IEFRAME/Diagnostic
wevtutil.exe cl Microsoft-PerfTrack-MSHTML/Diagnostic

等...

コマンドプロンプトまたはPowerShellで次のように入力すると、すべてのイベントカテゴリ名の完全なリストを取得できます。

wevtutil el

詳細は MS TechNet にあります。例:

イベントをシステムログからC:\ backup\system0506.evtxにエクスポートします。

wevtutil epl System C:\backup\system0506.evtx

C:\ admin\backups\a10306.evtxに保存した後、すべてのイベントをアプリケーションログから消去します。

wevtutil cl Application /bu:C:\admin\backups\a10306.evtx
19
Logman
  • wevtutilは非常に遅く、特にすべてのログ(空のログを含む)をクリアすると

  • 私が思いついた最速のソリューション:


ForEach ( $l in ( Get-WinEvent * ).LogName | sort | get-unique ) {[System.Diagnostics.Eventing.Reader.EventLogSession]::GlobalSession.ClearLog("$l")}


Resul:「4つのログで16のイベントをクリア:0.3684785秒」

各部:

  • イベントを含むログのみを取得します(LogNameが重複します)

    ForEach($ l in(Get-WinEvent *).LogName | sort | get-unique)

  • それぞれをクリア

    System.Diagnostics.Eventing.Reader.EventLogSession] :: GlobalSession.ClearLog( "$ l")

全機能:

function Clear-EventLogs
{
    Begin
    {
        $t1          = ( Measure-Command -Expression{ $active = ( Get-WinEvent ).LogName } ).TotalSeconds
        $totalEvents = $active.Count
        $active      = $active | Sort | Get-Unique
        $totalLogs   = $active.Count
    }
    Process
    {
        $t2 = ( Measure-Command -Expression{
            ForEach ( $l in $active )
            {
                [System.Diagnostics.Eventing.Reader.EventLogSession]::GlobalSession.ClearLog( "$l" )
                # ForEach-Object { Wevtutil.exe cl "$l" }
            }
        } ).TotalSeconds
    }
    End     { $t3 = $t1 + $t2; Write-Output "Cleared $totalEvents events in $totalLogs logs: $t3 seconds" }
}

「Get-WinEvent:The data is invalid」と表示された場合は、文書化されていない256ログというハード制限に達しています。最初にログをフィルタリングする必要がある場合があります。以下は、イベントがあるログのみを選択します(診断の http://www.powershellish.com/blog/2015/01/19/get-winevent-max-logs/ へのクレジット) :

$logs = Get-WinEvent -ListLog * | Where-Object {$_.RecordCount} | Select-Object -ExpandProperty LogName
ForEach ( $l in ( Get-WinEvent $logs ).LogName | sort | get-unique ) {[System.Diagnostics.Eventing.Reader.EventLogSession]::GlobalSession.ClearLog("$l")}
4
paul bica

名前にスペースが含まれている場合は、delimオプションを使用することが重要です。

WEVTUTIL EL > .\LOGLIST.TXT
for /f "delims=" %%a in ( .\LOGLIST.TXT ) do WEVTUTIL CL "%%a"

イベントログサービスを停止せずに、すべてのイベントログを簡単に無効にすることもできます。

for /f "delims=" %%a in ('WEVTUTIL EL') do WEVTUTIL SL "%%a" /e:false

もちろん、これは実際にインストールされたソフトウェアイベントのみを無効にします。新しいソフトウェアをインストールすると、デフォルトでロギングが有効になります。しかし、タスクスケジューラを実行したままにできるので、毎月実行するだけでよいのです。

3

ところで、これはすべてのログファイルをクリアします(以前の設定に応じて)かなりの領域を解放できます。

WEVTUTIL EL > .\LOGLIST.TXT
for /f "delims=" %%a in ( .\LOGLIST.TXT ) do WEVTUTIL CL "%%a"
del .\LOGLIST.TXT
timeout 10
2

.batファイルを使用して、ログファイルを少し簡単にクリアできるようにしました。ここで単純なスクリプトを選びましたhttp://winaero.com/blog/how-to-clear-the-windows-event-log-from-the-command-line/

そのリンクからコピーしました。

@echo off
FOR /F "tokens=1,2*" %%V IN ('bcdedit') DO SET adminTest=%%V
IF (%adminTest%)==(Access) goto noAdmin
for /F "tokens=*" %%G in ('wevtutil.exe el') DO (call :do_clear "%%G")
echo.
echo Event Logs have been cleared!
goto theEnd
:do_clear
echo clearing %1
wevtutil.exe cl %1
goto :eof
:noAdmin
echo You must run this script as an Administrator!
echo.
:theEnd
  1. メモ帳を開き、そのテキストをコピーして貼り付けます。

  2. それをバッチファイルとして保存し、たとえばClEvtLog.batまたはClEvtLog.cmdのように任意の名前を付けます。

  3. 管理者権限で実行してください。

1