我是Powershell的新手,并且已经学习了很多东西。但是还有更多。所以我的代码不是最严格的。
我创建了一个事件日志搜索工具。它使我可以通过ID,错误级别,关键字等进行搜索。在大多数情况下,它可以工作,但关键字和提供者名称除外。
当前,当尝试在日志中搜索关键字或一组关键字时,脚本会提示错误消息:
Get-WinEvent:指定的图像文件不包含资源部分,位于C:\ Users \ Rob \ Google Drive \ Powershell \ Get-logs.ps1:65 char:9 + Get-WinEvent -FilterHashtable @ {Logname = $ Log} -ComputerName $计算机| ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo:未指定:(:) [Get-WinEvent],EventLogException + FullyQualifiedErrorId:指定的图像文件不包含资源部分,Microsoft.PowerShell.Commands.GetWinEventCommand
问题是,我不了解ps1.65 char:9位。然后,脚本继续运行,并从日志获取与我无关的旧数据。
这是我遇到的两个领域的代码。最后的完整代码。
关键词搜索:
elseif ($Kwrd -gt "a"){
foreach ($Kwrd in $Kwrd)
{
Get-WinEvent -FilterHashtable @{logname=$Log} -ComputerName $Computer | where-object { $_.Message -like "*$Kwrd*" } | Sort-Object TimeGenerated -Descending | Select-Object -First $Maxnum | Format-List
}
}
提供商名称搜索:
elseif ($Prov.Length -gt 1){
Get-WinEvent -FilterHashtable @{Logname=$Log} -ComputerName $Computer | Where-Object {($_.ProviderName -like "*$Prov*")} | Sort-Object TimeGenerated -Descending|Select-Object -First $Maxnum | Format-List
}
因此,例如,如果我想在应用程序日志中搜索提供者名称“系统还原”,(该脚本就是我最近运行的Revo应用程序中的其中一个)。
Enter Computer or EXIT to quit: office
Enter log set to retrieve: application
Enter Instance ID or leave blank:
Enter number of logs to retrieve: 10
Enter error level or leave blank:
Search logs by keyword or leave blank:
Search by Provider or leave blank: System Restore
Get-WinEvent : The specified image file did not contain a resource section
At C:\Users\Rob\Google Drive\Powershell\Get-logs.ps1:65 char:9
+ Get-WinEvent -FilterHashtable @{Logname=$Log} -ComputerName $Computer | ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [Get-WinEvent], EventLogException
+ FullyQualifiedErrorId : The specified image file did not contain a resource section,Microsoft.PowerShell.Commands.GetWinEventCommand
PS C:\Users\Rob>
关键字搜索也是同样的问题。同样的错误信息。唯一的不同是行号从65更改为61,因为代码在第61行。
这不是完美的,但是我正在学习。这是完整的脚本。知道如何从日志中获取信息而不会出现错误吗?
Clear-Host
while (1 -ne 2){
$Computer = $Null
$IDNum = $Null
$Lvl = $Null
$Kwrd = $Null
$Prov = $Null
Write-Host ''
$Computer = Read-Host "Enter Computer or EXIT to quit"
if ($Computer -eq "EXIT") {exit;}
$Log = Read-Host "Enter log set to retrieve"
$IDNum = Read-Host "Enter Instance ID or leave blank"
$IDNum = $IDNum.Split(',')
$MaxNum = $MaxNum = Read-Host "Enter number of logs to retrieve"
$Lvl = Read-Host "Enter error level or leave blank"
$Lvl = $Lvl.Split(',')
$Kwrd = Read-Host "Search logs by keyword or leave blank"
$Kwrd = $Kwrd.Split(',')
$Prov = Read-Host "Search by Provider or leave blank"
if ($IDNum.Length -gt 1){
foreach ($IDNum in $IDNum)
{
Get-WinEvent -FilterHashTable @{LogName=$Log; ID=$IDNum} -ComputerName $Computer | Where-Object { ($_.ID -eq "*$IDNum*")} |Sort-Object TimeGenerated -Descending | Select-Object -First $Maxnum| Format-List
}
}
elseif ($Lvl -gt 1 ){
foreach ($Lvl in $Lvl)
{
Get-WinEvent -FilterHashTable @{LogName=$Log;Level=$lvl} -ComputerName $Computer -MaxEvents $MaxNum |Select-Object -First $MaxNum | Sort-Object TimeGenerated -Descending | Format-List
}
}
elseif ($Kwrd -gt "a"){
foreach ($Kwrd in $Kwrd)
{
Get-WinEvent -FilterHashtable @{logname=$Log} -ComputerName $Computer | where-object { $_.Message -like "*$Kwrd*" } | Sort-Object TimeGenerated -Descending | Select-Object -First $Maxnum | Format-List
}
}
elseif ($Prov.Length -gt 1){
Get-WinEvent -FilterHashtable @{Logname=$Log} -ComputerName $Computer | Where-Object {($_.ProviderName -like "*$Prov*")} | Sort-Object TimeGenerated -Descending|Select-Object -First $Maxnum | Format-List
}
else {
Get-WinEvent -LogName $Log -ComputerName $Computer | Sort-Object TimeGenerated -Descending| Select-Object -First $MaxNum | Format-List
}
} else{
Clear-Host
$log = $IDNum = $MaxNum = $Lvl = $Kwrd = $Prov = $Null
continue
Write-Host ''
Write-Host ''
}
谢谢。
注意:我以管理员身份运行ISE。
几个评论
1)我无法重新创建错误(您的脚本在我的计算机上运行良好),但它的行为似乎是它试图打开/读取图像文件(非常奇怪)。
2)我尝试get-winevent
不带参数运行,但出现很多get-winevent : The data is invalid
错误。当我研究此错误时,我发现这get-winevent
似乎是一辆马车/问题车/混乱车cmdlet
。所以,我建议你试试get-eventlog
,而不是
3)您Get-WinEvent
在一个循环中调用,这会使程序花费更长的时间才能运行。我建议您执行一次Get-EventLog
(请参阅上面的注释2)并将输出通过管道传递到out-gridview
。例如:
Get-EventLog -LogName application | out-gridview -Title "App log events"
然后,使用out-gridview
过滤器仅显示要查看的输出。
上面命令的示例输出:
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句