我的任务是备份所有服务器上的所有事件日志并保留 30 天。我编写了一个简单的 powershell 来执行此操作。
Get-winevent -Listlog * | select Logname, Logfilepath | ForEach-Object -Process {
$name = $_.Logname
$path = $_.logfilepath
wevtutil.exe EPL $name C:\Users\Owner\Desktop\eventlogs\$name.evtx`
}
这仅导出 NTclassic 事件日志的日志文件,对于其余日志,我收到系统无法找到指定路径的错误。我更改了 wevtutil 并包含了 /lf 参数并传递了 $path 变量,它仍然相同。除了经典日志外,对于其他所有日志,以下是我收到的错误。
wevtutil.exe : Failed to export log Microsoft-Windows-WPD-MTPClassDriver/Operational.
The system cannot find the path specified.
At line:19 char:1
+ wevtutil.exe EPL $name C:\Users\Owner\Desktop\eventlogs\$name.evtx
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (Failed to expor...path specified.:String) [], RemoteException
+ FullyQualifiedErrorId : NativeCommandErrorBlockquote
还有其他更好的方法来完成我想做的事情吗?
答案1
问题在于$name
变量。如果您检查哪些导出文件已创建,哪些未创建,您会注意到所有包含正斜杠的日志名称/
都会生成错误消息。原因是/
文件名中的字符无效(在 Windows 下)。
/
您可以通过用有效字符替换来运行导出:
Get-winevent -Listlog * | select Logname, Logfilepath | ForEach-Object -Process {
$name = $_.Logname
$safename = $name.Replace("/","-")
wevtutil.exe EPL $name C:\Users\Owner\Desktop\eventlogs\$safename.evtx
}