尝试使用Powershell从csv导入信息,但不幸的是,某些结果出现错误
我是Powershell的新手,尝试将其用于分配我需要导入一个csv日志,然后从中提取特定信息在本例中,所有日志中的失败和成功次数,以及失败和成功中最常见的事件ID 代码的AuditFailure和AuditSuccess部分在某种程度上起作用,尽管结果显示为{count=##},而不仅仅是数字。真正的问题在于AuditTotal和EventID,它们要么在total中不产生任何结果,要么在EventID中给出一个空白的结果 我不知道这些是否是最好的命令来使用,我愿意接受任何帮助来解决这个问题尝试使用Powershell从csv导入信息,但不幸的是,某些结果出现错误,powershell,grouping,select-object,Powershell,Grouping,Select Object,我是Powershell的新手,尝试将其用于分配我需要导入一个csv日志,然后从中提取特定信息在本例中,所有日志中的失败和成功次数,以及失败和成功中最常见的事件ID 代码的AuditFailure和AuditSuccess部分在某种程度上起作用,尽管结果显示为{count=##},而不仅仅是数字。真正的问题在于AuditTotal和EventID,它们要么在total中不产生任何结果,要么在EventID中给出一个空白的结果 我不知道这些是否是最好的命令来使用,我愿意接受任何帮助来解决这个问题
$AuditSuccess = Import-Csv -Path G:\LabLog.csv | Where-Object { $_.Keywords -like "Audit Success" } | Measure-Object | Select-Object count
$AuditFailure = Import-Csv -Path G:\LabLog.csv | Where-Object { $_.Keywords -like "Audit Failure" } | Measure-Object | Select-Object count
$AuditTotal = $AuditSuccess + $AuditFailure
$EventID1 = Import-Csv -Path G:\LabLog.csv | sort | group Keywords | sort $_.EventID | select EventID -last 1
$EventID2 = Import-Csv -Path G:\LabLog.csv | sort | group Keywords | sort $_.EventID | select EventID -last 1
Write-Host "Number of Audit Failures:" $AuditFailure "failures of" $AuditTotal "entries"
Write-Host "Most Common Event ID:" $EventID1
Write-Host "Number of Audit Successes:" $AuditSuccess "successes of" $AuditTotal "entries"
Write-Host "Most Common Event ID:" $EventID2
抱歉,这是错误输出
Method invocation failed because [System.Management.Automation.PSObject] does
not contain a method named 'op_Addition'.
At line:5 char:1
+ $AuditTotal = $AuditSuccess + $AuditFailure
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (op_Addition:String) [],
RuntimeException
+ FullyQualifiedErrorId : MethodNotFound
Number of Audit Failures: @{Count=13} failures of entries
Most Common Event ID: @{EventID=}
Number of Audit Successes: @{Count=6480} successes of entries
Most Common Event ID: @{EventID=}
这就是它应该看起来的样子,尽管数字是不同的最终还是有一些问题;让我们从小学一年级开始:
Number of Audit Failures: 2469 failures of 19247 entries
Most common Event ID: 5038
Number of Audit Successes: 16778 successes of 19247 entries
Most common Event ID: 4624
导致[System.Management.Automation.PSObject]没有
不包含名为“op_Addition”的方法
错误,因为$AuditSuccess
和$AuditFailure
的值被分配给了选择对象计数
,它们是自定义对象,而不是数字-和+
操作符(转换为op_Addition
方法)未为自定义对象操作数定义(类型为[pscustomobject]
的操作数)
要使用选择对象
提取单个属性值,必须使用-ExpandProperty
;e、 g:
$AuditTotal = $AuditSuccess + $AuditFailure
如果不使用-ExpandProperty
,和(隐含的)-Property
参数,您将得到一个[pscustomobject]
实例,该实例具有一个属性.Count
下一个问题是,
排序$\uEventId
无法按预期工作,因为自动变量$\uCode>在脚本块中只有一个(有意义的)值;如果没有预定义的$\
值(不应该有任何值),$\.EventId
的计算结果为$null
,实际上会被忽略
虽然排序对象EventId
通常是正确的解决方案(仅提供属性名称),但在这种情况下,输入对象没有.EventId
属性,因为组
(组对象
)的输出是[Microsoft.PowerShell.Commands.GroupInfo]
实例,每个实例表示一组原始输入对象
根据您在成功和失败中查找最频繁发生的事件ID的意图,必须以成功为例按如下方式重新构造命令:
$AuditSuccess = ... | Measure-Object | Select-Object -ExpandProperty Count
也就是说,输入对象首先按关键字过滤,然后按事件ID分组,然后按每个事件ID组中的对象计数排序,返回的条目最多的组的事件ID
最后:
- 代码中有很多重复的工作,最明显的是在同一个输入文件上反复调用
Import Csv
,这会降低速度
- ,除非其目的明确是绕过PowerShell的输出流,仅写入显示器
感谢您的帮助,这里是答案。这里有另一种方法可以避免多次重新读取CSV文件。它还避免了经常通过管道发送东西。[咧嘴笑]
输出
# fake reading in a CSV file
# in real life, use Import-CSV
$InStuff = @'
EventID, Keywords
1001, Audit Success; SomeOtherWord
1001, Audit Success
2002, NothingRightNow
3003, Audit Failure
4004, Audit Success
5005, IgnoreThisOne
6006, Audit Success
7007, Audit Failure
7007, Audit Failure
'@ | ConvertFrom-Csv
$SuccessList = $InStuff.Where({$_.Keywords -match 'success'})
$SuccessCount = $SuccessList.Count
$SL_MostFrequentEventID = ($SuccessList |
Group-Object -Property EventID |
Sort-Object -Property Count)[-1].Name
$FailureList = $InStuff.Where({$_.Keywords -match 'failure'})
$FailureCount = $FailureList.Count
$FL_MostFrequentEventID = ($FailureList |
Group-Object -Property EventID |
Sort-Object -Property Count)[-1].Name
$FS_TotalCount = $FailureCount + $SuccessCount
Write-Host ''
Write-Host ('Number of Audit Failures {0} out of {1} entries.' -f $FailureCount, $FS_TotalCount)
Write-Host (' Most Common Failure Event ID = {0}' -f $FL_MostFrequentEventID)
Write-Host ('Number of Audit Successes {0} out of {1} entries.' -f $SuccessCount, $FS_TotalCount)
Write-Host (' Most Common Success Event ID = {0}' -f $SL_MostFrequentEventID)
EventID背后的意图是从成功中找出最常见的ID,从失败中找出最常见的ID。这与您的主要ID在中出现的问题相同。理想情况下,后者将作为您问题的副本关闭,但这还不能完成,因为您从未接受过这里的答案。因此,请允许我在下一篇评论中重申标准建议。这不会起到预期的作用:将$.\EventID
传递到排序
没有任何效果,即使您使用排序EventID
解决了该问题,按事件ID排序与确定最频繁发生的事件ID并不相同;请参见我的。另外,虽然您最终提出的代码对您个人来说可能很有价值,但对未来读者来说,最有好处的是有针对性的问题和针对性的答案:一个清晰、单一的针对性问题的陈述,以及包含解释的匹配解决方案。因此,最好不要完整地发布修改后的代码——尤其是在没有解释的情况下——而是提供一个有针对性的答案,如果有的话(自己写一个有针对性的答案,如果没有其他人提出,最终接受就可以了)。
$AuditSuccess = Import-Csv -Path G:\LabLog.csv | Where-Object { $_.Keywords -like "Audit Success" } | Measure-Object | Select-Object -ExpandProperty count
$AuditFailure = Import-Csv -Path G:\LabLog.csv | Where-Object { $_.Keywords -like "Audit Failure" } | Measure-Object | Select-Object -ExpandProperty count
$AuditTotal = $AuditSuccess + $AuditFailure
$EventID1 = Import-Csv -Path G:\LabLog.csv | Where-Object { $_.Keywords -like "Audit Success" } | sort $_.EventID | Select-Object -ExpandProperty EventID -last 1
$EventID2 = Import-Csv -Path G:\LabLog.csv | Where-Object { $_.Keywords -like "Audit Failure" } | sort $_.EventID | Select-Object -ExpandProperty EventID -last 1
Write-Host "Number of Audit Failures:" $AuditFailure "failures of" $AuditTotal "entries"
Write-Host "Most Common Event ID:" $EventID1
Write-Host "Number of Audit Successes:" $AuditSuccess "successes of" $AuditTotal "entries"
Write-Host "Most Common Event ID:" $EventID2
# fake reading in a CSV file
# in real life, use Import-CSV
$InStuff = @'
EventID, Keywords
1001, Audit Success; SomeOtherWord
1001, Audit Success
2002, NothingRightNow
3003, Audit Failure
4004, Audit Success
5005, IgnoreThisOne
6006, Audit Success
7007, Audit Failure
7007, Audit Failure
'@ | ConvertFrom-Csv
$SuccessList = $InStuff.Where({$_.Keywords -match 'success'})
$SuccessCount = $SuccessList.Count
$SL_MostFrequentEventID = ($SuccessList |
Group-Object -Property EventID |
Sort-Object -Property Count)[-1].Name
$FailureList = $InStuff.Where({$_.Keywords -match 'failure'})
$FailureCount = $FailureList.Count
$FL_MostFrequentEventID = ($FailureList |
Group-Object -Property EventID |
Sort-Object -Property Count)[-1].Name
$FS_TotalCount = $FailureCount + $SuccessCount
Write-Host ''
Write-Host ('Number of Audit Failures {0} out of {1} entries.' -f $FailureCount, $FS_TotalCount)
Write-Host (' Most Common Failure Event ID = {0}' -f $FL_MostFrequentEventID)
Write-Host ('Number of Audit Successes {0} out of {1} entries.' -f $SuccessCount, $FS_TotalCount)
Write-Host (' Most Common Success Event ID = {0}' -f $SL_MostFrequentEventID)
Number of Audit Failures 3 out of 7 entries.
Most Common Failure Event ID = 7007
Number of Audit Successes 4 out of 7 entries.
Most Common Success Event ID = 1001