【问题标题】:powershell Get-Winevent change output date format?powershell Get-Winevent 更改输出日期格式?
【发布时间】:2014-08-15 05:20:23
【问题描述】:

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

有没有办法将输出中 TimeGenerated 字段的格式从 8/5/2014 4:09:54 更改为 2014-08-5 16:09:54下午

【问题讨论】:

    标签: powershell


    【解决方案1】:

    您可以在管道的 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>}
    }
    

    【讨论】:

    • 太棒了!谢谢。试图弄清楚,如果我可以将 SWITCH 语句添加到选择列表中。我正在尝试做的是,对于事件 ID 1,例如 TEXTXXX,对于事件 ID 2,例如 TEXTYYY,等等...(根据字段 ID 派生一个文本字段)。你会碰巧知道这是否可能吗?
    • 表达式可以有多个字段吗?就像目前在 ID 字段上有一个 switch 语句。是否可能有基于消息字段的 OR 条件。 'ID Description'=(如果 EventID=X,则 X)或(如果消息包含 %TXT1%,则 Y 或如果消息包含 %TXT2%,则 Z)
    • 再次更新。如果您对 Switch 命令有更多疑问,也许您应该发布另一个问题以获得帮助?
    • 我刚刚做了 : [link] stackoverflow.com/questions/25330481 时间允许的时候你能看看吗?感谢您的帮助..
    【解决方案2】:

    您可以在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
    

    【讨论】:

    • 谢谢。如果我需要选择一些虚拟文本作为另一个字段怎么办?
    • 通过虚拟文本,我想你的意思是一个常数值。您可以像这样添加另一个计算属性@{Name="Dummy"; Expression={"DummyValue"}}
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多