您可以在管道的 Select 部分从哈希表创建值。这应该做你想做的事:
powershell "Get-WinEvent -EA SilentlyContinue -FilterHashtable @{Logname='System';ID=7001,10,12,13,41,42,1129,5060,5719,6008,7045}| SELECT-Object ID,@{label='TimeCreated';expression={$_.TimeCreated.ToString("yyyy-M-d HH:mm:ss")}},MACHINENAME,MESSAGE|ConvertTo-Csv -NoTypeInformation | %{ $_ -replace """`r`n""",',' } | select -Skip 1"
我将 TimeCreated 替换为 @{label=TimeCreated;expression={$_.TimeCreated.ToString("yyyy-M-d HH:mm:ss")}}。让我为你分解一下。
label=TimeCreated 是属性名称将进一步向下传递的内容。我只是重复使用了相同的名称。
expression={ScriptBlock} 告诉系统该属性对于每条记录的值。
至于实际的脚本块,在这种情况下,我们已经在使用 [DateTime] 对象,因此我使用了它的 ToString() 方法,并指定了您的设计格式以将其输出为。这改变了它,所以它现在是一个 [String] 而不是 [DateTime] 对象,但是看到你只是将整个东西转换为 CSV 字符串应该就可以了。
编辑:您可以在上述哈希表的脚本块中添加一个开关,它会变得很长并且很难理解。我会做类似的事情:
powershell "Get-WinEvent -EA SilentlyContinue -FilterHashtable @{Logname='System';ID=7001,10,12,13,41,42,1129,5060,5719,6008,7045}| SELECT-Object ID,@{l='ID Description';e={Switch($_.ID){
"7001" {"Text1"}
"10" {"Text2"}
"12" {"Text3"}
"13" {"Text4"}
"41" {"Text5"}
"42" {"Text6"}
"1129" {"Text7"}
"5060" {"Text8"}
"5719" {"Text9"}
"6008" {"Text10"}
"7045" {"Text11"}
}
}},@{label='TimeCreated';expression={$_.TimeCreated.ToString("yyyy-M-d HH:mm:ss")}},MACHINENAME,MESSAGE|ConvertTo-Csv -NoTypeInformation | %{ $_ -replace """`r`n""",',' } | select -Skip 1"
l= 是 label= 的缩写,e= 是 expression= 的缩写
Edit2: 更多开关信息...您可以基于多个字段执行操作,您可能希望执行 Switch($_),然后在每一行将您的条件放入脚本块中,例如:
Switch($_){
{$_.ID -eq "7001" -and $_.Message -match "catastrophic"}{"The dog ate my NetBIOS"}
{$_.ID -eq "7001" -and $_.Message -match "Lex Luthor"}{"Superman stole my WiFi"}
{<more conditions>}{<and their resultant values>}
}