尝试 WEvtUtil.exe

尝试 WEvtUtil.exe

在 Windows 7 中,您可以打开事件查看器来浏览多个类别。您也可以通过单击清除日志...在右侧窗格中。

假设我想清除所有类别,我应该单击并逐个清除它们吗?
它们有几十个。有没有更快的方法?也许使用 PowerShell?

在此处输入图片描述在此处输入图片描述

答案1

尝试 WEvtUtil.exe

没有办法通过 GUI 一次性清除所有日志。至少我还没发现过。:)

循环并删除中间文件

这是一个使用执行程序将日志列出到文本文件中,然后使用该文本文件删除每个日志。

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

如果您觉得将所有这些内容放在一个批处理文件中不安全,那么您可以将其保存到两个单独的文件中,然后一个接一个地运行:(
如果在当前目录中找不到“loglist.txt”,则“Nuke”批处理将会出错。)

填充日志列表.cmd

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

Nuke-日志列表.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 指出的那样他的回答,这可以进一步缩短(并消除对中间文本文件的需要),方法是使用类似(批处理文件的百分比双倍):

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

以管理员身份运行!

无论选择哪种方式,请确保“以管理员身份运行”。

我发现的最简单的解决方案。从 Vista 开始就一直在使用它。:)

答案2

打开 cmd 提示符或创建批处理脚本并“以管理员身份运行”:

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

ETC...

您可以在 cmd 提示符或 powershell 中输入以下内容来获取所有事件类别名称的完整列表:

wevtutil el

更多信息请访问微软技术网。 例子:

将事件从系统日志导出到 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

答案3

  • wevtutil 非常慢,特别是当你清除所有日志(包括空日志)时

  • 我想到最快的解决方案:


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


结果:“清除 4 个日志中的 16 个事件:0.3684785 秒”

各部分:

  • 仅获取包含事件的日志(会有重复的 LogName)

    ForEach($l 在(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:数据无效”,则表明您已达到未记录的 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

顺便说一句,这将清除所有日志文件,这可以(取决于之前的设置)释放相当多的空间

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

相关内容