【问题标题】:powershell Get-Winevent SWITCH MATCH issuepowershell Get-Winevent SWITCH MATCH 问题
【发布时间】:2014-08-16 06:59:25
【问题描述】:

正在运行这个 powershell 命令并将输出保存在 csv 中。

powershell "Get-WinEvent -EA SilentlyContinue -FilterHashtable @{Logname='System';ID=42}| SELECT-Object @{Label = 'TimeCreated'; Expression = {Get-Date $_.TimeCreated -Format 'yyyy-MM-dd HH:mm:ss'}},@{Label = 'DayOfWeek'; Expression = {(Get-Date $_.TimeCreated).DayOfWeek}},ID,@{l='ID Description';e={Switch ($_)  { {$_.ID -eq '42'}{'Type=Sleep matched using EventID';break} {$_.MESSAGE -Match 'Sleep Reason: Application API'}{Type='Sleep matched using Message';break}  }}},MESSAGE|ConvertTo-Csv -NoTypeInformation | %{ $_ -replace """`r`n""",',' } | select -Skip 1 | Out-File -Append c:\logs\timeline\TEMP_TimeLine.csv"

我得到的预期结果如下:

"2014-05-10 00:00:04","Saturday","42","Type=Sleep matched using EventID","The system is entering sleep.,,Sleep Reason: Application API"
"2014-05-09 00:00:02","Friday","42","Type=Sleep matched using EventID","The system is entering sleep.,,Sleep Reason: Application API"
"2014-05-08 00:00:02","Thursday","42","Type=Sleep matched using EventID","The system is entering sleep.,,Sleep Reason: Application API"

但是,如果我在开关内切换两个 case 语句的位置,我不会得到预期的输出(派生字段“ID 描述”为空白)。我试图让消息字段和 EventID 字段上的字符串匹配混合在一起工作。 这就是我正在尝试的:

powershell "Get-WinEvent -EA SilentlyContinue -FilterHashtable @{Logname='System';ID=42}| SELECT-Object @{Label = 'TimeCreated'; Expression = {Get-Date $_.TimeCreated -Format 'yyyy-MM-dd HH:mm:ss'}},@{Label = 'DayOfWeek'; Expression = {(Get-Date $_.TimeCreated).DayOfWeek}},ID,@{l='ID Description';e={Switch ($_)  {  {$_.MESSAGE -Match 'Sleep Reason: Application API'}{Type='Sleep matched using Message';break} {$_.ID -eq '42'}{'Type=Sleep matched using EventID';break} }}},MESSAGE|ConvertTo-Csv -NoTypeInformation | %{ $_ -replace """`r`n""",',' } | select -Skip 1 | Out-File -Append c:\logs\timeline\TEMP_TimeLine.csv"

正如我们从第一个输出中看到的那样,消息字段显然具有字符串“睡眠原因:应用程序 API”。想知道这里发生了什么...任何线索 powershell 专家?

【问题讨论】:

    标签: powershell


    【解决方案1】:

    好的,我看到了两个问题:

    A) 您可能正在破坏自己的脚本。我会在一秒钟内解决这个问题。
    B)您在 $_.Message 行上缺少'Type='Sleep 应该是 'Type=Sleep

    好的,回到 A 点。我将从 ;break 开始。在 99% 的情况下不这样做,你会让脚本之神生气,当他们生气时你不会喜欢他们。在大多数情况下,您想改用;Continue。 Break 从字面上讲是从事物中脱离出来,并且根据它的使用位置,它可以脱离父循环,完全停止在一组事物中的一部分。另一方面,继续移动到当前循环的末尾,跳过其他任何内容。一样?有点,有点,但 Continue 不会像 Break 那样破坏 ForEach-Object 循环。

    那么,话虽如此,让我们在你的开关中试试这个:

    Switch ($_)  { 
        {$_.ID -eq '42'}{'Type=Sleep matched using EventID';continue} 
        {$_.MESSAGE -Match 'Sleep Reason: Application API'}{'Type=Sleep matched using Message';continue}
    }
    

    好的,这很好,连同 B 点中的整个 ' 问题,这可能会修复一般的代码。

    那么,话虽如此,您为什么要这样运行它?亲爱的主,运行一条超长的班轮真是太疯狂了。将其保存为 .PS1 文件,如果您从批处理文件中调用它,则调用脚本文件,但是 ug,一般来说很难使用,难怪您错过了中间的 '那条线。如果您从批处理文件中调用它,请将其命名为 GetSleepLo​​gs.ps1(或任何您想要的名称,只需修改命令中的文件名)并尝试以下操作:

    PowerShell.exe -WindowStyle Hidden -ExecutionPolicy Bypass -File GetSleepLogs.ps1
    

    编辑:我不喜欢 convertto-CSV |选择 - 跳过 1 | %{ %_ -替换 ...} |文件外的东西,对我来说似乎很笨重。此外,Select 命令上的所有即兴哈希表都有点难以理解。看看这个创建 1 个具有多个属性的对象的替代方案,然后使用 -append 和 -NoTypeInformation 开关集将其通过管道传输到 Export-CSV,这应该只是将其粘贴到现有 CSV 文件的底部。

    Get-WinEvent -EA SilentlyContinue -FilterHashtable @{Logname='System';ID=42}| ForEach{[PSCustomObject][Ordered]@{
        'TimeCreated' = Get-Date $_.TimeCreated -Format 'yyyy-MM-dd HH:mm:ss'
        'DayOfWeek' = (Get-Date $_.TimeCreated).DayOfWeek
        'ID' = $_.ID
        'ID Description' = Switch($_){
                            {$_.ID -eq '42' -AND $_.Message -match 'Sleep Reason: Application API'}{'Type=Sleep matched using EventID and Message';continue}
                            {$_.ID -eq '42'}{'Type=Sleep matched using EventID';continue}
                            {$_.Message -match 'Sleep Reason: Application API'}{'Type=Sleep matched using Message';continue}}
        'MESSAGE' = $_.Message.replace("`r`n`r`n","`r`n") -replace "((?<!`")`r`n|`n|`r)", ","
    }}|Export-Csv C:\temp\TimeLine.csv -NoTypeInformation -append
    

    【讨论】:

    • 如果你真的不想从文件中执行代码,像往常一样在 ps1 中多行写出,完成后,base64 编码,然后使用 @987654331 @ 范围。没有太多理由避免使用文件,但如果必须,这对于长代码很有效。有关可用于对文件进行编码的 sn-p,请参阅 powershell.exe /?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-05
    • 2020-03-25
    • 1970-01-01
    相关资源
    最近更新 更多