我正在从perl脚本运行此powershell命令并解析输出。
powershell "Get-WinEvent -EA SilentlyContinue -FilterHashtable @{Logname='System';ID=7001,10,12,13,41,42,1129,5060,5719,6008,7045}| SELECT-Object ID,TimeCreated,MACHINENAME,MESSAGE|ConvertTo-Csv -NoTypeInformation | %{ $_ -replace """`r`n""",',' } | select -Skip 1"
有没有办法将 2014-08-5 16:09:54 中的TimeGenerated字段的格式从 8/5/2014 4:09:54更改为 2014-08-5 16:09:54 PM
答案 0 :(得分:1)
您可以在管道的“选择”部分从哈希表创建值。这应该做你想要的:
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"
我用@{label=TimeCreated;expression={$_.TimeCreated.ToString("yyyy-M-d HH:mm:ss")}}
替换了TimeCreated。让我为你打破这一点。
label = TimeCreated是属性名称将在管道中向下移动的内容。我只是重复使用相同的名称。
expression = {ScriptBlock}告诉系统该属性的值对于每条记录是什么。
对于实际的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=
的缩写
编辑2:更多切换信息...您可以根据多个字段执行操作,您可以执行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>}
}
答案 1 :(得分:1)
您可以在Select-Object
命令中指定表达式以创建计算属性。在这里,我将此新属性称为“时间”,并将ToString()
方法与InvariantCulture
一起使用,以确保输出在不同的计算机上保持一致。
Get-WinEvent -EA SilentlyContinue -FilterHashtable @{Logname='System';ID=7001,10,12,13,41,42,1129,5060,5719,6008,7045} | `
SELECT-Object -Property ID,@{Name="Time"; Expression = {$_.TimeCreated.Tostring("yyyy-MM-d HH:mm:ss", [CultureInfo]::InvariantCulture)}},MACHINENAME,MESSAGE | `
ConvertTo-Csv -NoTypeInformation | %{ $_ -replace """`r`n""",',' } | select -first 5