powershell Get-Winevent更改输出日期格式?

时间:2014-08-12 21:18:11

标签: powershell

我正在从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

2 个答案:

答案 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