如何在 Powershell 7 中清除事件日志

4
在PowerShell 5中,我们可以使用以下方式清除Windows事件日志:
Get-EventLog -LogName * | % { Clear-EventLog -LogName $_.log }
如何在 Powershell 7 中执行此操作?(仅使用 Powershell) Powershell 处理 Windows 事件的方式是使用 Get-WinEvent,但似乎没有可用的 Clear-WinEvent。当然,我们可以使用 wevtutil.exe 或者甚至在停止服务后强制删除日志文件来实现这一点,但我只想使用本机 Powershell 代码来做到这一点。

我没有看到Clear-EventLog也被弃用了。 - Theo
根据MSDocs网站,该cmdlet在ps7+中不存在。>>> Clear-EventLog(Microsoft.PowerShell.Management)-PowerShell | Microsoft Docs - https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.management/clear-eventlog?view=powershell-5.1&viewFallbackFrom=powershell-7 - Lee_Dailey
是的,我注意到了...;-) 不管怎样,现在应该是 "CLEAR-WINEVENT",以便与正在进行的PowerShell演进保持一致... - ZEE
CLEAR-EVENTLOG是GET-EVENTLOG的伴侣,但GET-EVENTLOG已被弃用。因此,新的应该被命名为CLEAR-WINEVENT以与GET-WINEVENT保持一致。希望这足够清楚了。 - ZEE
1
在Posh 7.0.3上运行“Get-Command winevent”只返回“Get-WinEvent”和“New-WinEvent”。对于PowerShell 5.1也是一样的。看起来它们不应该被删除,或者有人只是忘记了其中一半的功能 ;) - T-Me
1个回答

1
这很有趣。实际上,Clear-WinEvent 不属于 PowerShell 7 的一部分。曾提出过问题,希望将其添加到 PowerShell 7 中,但似乎没有更多的行动,这个问题不会得到解决。
微软认可的方法是:
Import-Module Microsoft.PowerShell.Management -UseWindowsPowerShell
Get-EventLog -LogName * | % { Clear-EventLog -LogName $_.log }

这个操作会启动一个在后台运行的Windows PowerShell 5.1进程,并通过隐式远程调用Cmdlet...但并不是最佳选择。
更好的方法是利用.NET EventLogSession.ClearLog 方法:
Get-WinEvent -ListLog * | foreach {
    [System.Diagnostics.Eventing.Reader.EventLogSession]::GlobalSession.ClearLog($_.LogName)
}

< p > < em > 旁注 - PowerShell 7 模块兼容性 列出了 Microsoft.PowerShell.Management 模块(其中包括 Get-EventLogClear-EventLog)作为“内置于 PowerShell 7”


是的...我一直在使用 .net 事件来实现目标...但我觉得 CLEAR-WINEVENT 应该已经可用了...即使现在可能会出现 CLEAR-LINUXEVENT 或者 CLEAR-OSXEVENT,因为 Powershell 已经可以在其他操作系统上使用了... - ZEE
@ZEE - 这个问题似乎不是“如何在 Powershell 7 中清除事件日志”,而更多的是“为什么 Powershell 7 中没有 Clear-Event 命令”... 根据链接问题,Clear-EventLog 是基于专有 API 开发的。我同意从 PS 5.1 功能平衡的角度来看,它应该存在,但从从 Windows PS 5.1 到基于 PS 6 的开源 PS 7 的角度来看,*-EventLog 命令已被删除 - G42
“微软认可的做法是”这样做。你能提供一下来源吗?我很想了解更多,谢谢。 - spottedmahn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接