尝试使用Powershell从csv导入信息,但不幸的是,某些结果出现错误

尝试使用Powershell从csv导入信息,但不幸的是,某些结果出现错误,powershell,grouping,select-object,Powershell,Grouping,Select Object,我是Powershell的新手,尝试将其用于分配我需要导入一个csv日志,然后从中提取特定信息在本例中,所有日志中的失败和成功次数,以及失败和成功中最常见的事件ID 代码的AuditFailure和AuditSuccess部分在某种程度上起作用,尽管结果显示为{count=##},而不仅仅是数字。真正的问题在于AuditTotal和EventID,它们要么在total中不产生任何结果,要么在EventID中给出一个空白的结果 我不知道这些是否是最好的命令来使用,我愿意接受任何帮助来解决这个问题

我是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