powershell获取Winevent开关匹配问题

powershell获取Winevent开关匹配问题,powershell,Powershell,'我正在运行此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

'我正在运行此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 Description”为空)。我试图让message字段和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"
消息字段显然有字符串“Sleep Reason:Application API”,我们可以从第一个输出中看到这一点。想知道这里发生了什么。。。powershell专家有什么线索吗?

好的,我看到两个问题:

A) 你可能在破坏自己的剧本。我马上就谈到那件事。
B) $\消息行中缺少一个
Type='Sleep
应该是
'Type=Sleep

好的,回到A点。我将从
开始;中断
。在99%的情况下,如果你不这样做,你会让脚本编写者生气,当他们生气时,你不会喜欢他们。在大多数情况下,您希望使用
;继续
。Break实际上是从事物中分离出来的,根据它的使用位置,它可以从父循环中分离出来,在一组事物中完全停止。另一方面,Continue移动到当前循环的末尾,跳过任何其他内容。同样的事情?有点,但Continue不会像break-will那样破坏ForEach对象循环

这么说吧,让我们在你的交换机上试试这个:

Switch ($_)  { 
    {$_.ID -eq '42'}{'Type=Sleep matched using EventID';continue} 
    {$_.MESSAGE -Match 'Sleep Reason: Application API'}{'Type=Sleep matched using Message';continue}
}
好的,这很好,还有B点中的整个
问题,它可能会在总体上修复代码

那么,既然如此,你为什么要这样运行呢?亲爱的上帝,运行一条疯狂的长航线简直是疯了。将它保存到.p1文件中,如果从批处理文件中调用它,则调用脚本文件,但UG,这通常是很难处理的,难怪您在该行的中间错过了<代码> <代码>。如果您是从批处理文件调用它,请将其命名为GetSleepLogs.ps1(或任何您想要的名称,只需在命令中修改文件名),然后尝试以下操作:

PowerShell.exe -WindowStyle Hidden -ExecutionPolicy Bypass -File GetSleepLogs.ps1
编辑:我不喜欢转换为CSV |选择-跳过1 |%{%|-替换…}|输出文件的东西,它对我来说太笨重了。而且,Select命令上的所有即兴哈希表都有点难以理解。检查这个替代方案,它创建一个具有多个属性的对象,然后通过设置-append和-NoTypeInformation开关来导出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
Get WinEvent-EA SilentlyContinue-FilterHashtable@{Logname='System';ID=42}| ForEach{[PSCustomObject][Ordered]@{
“TimeCreated”=获取日期$\时间已创建-格式为“yyyy-MM-dd HH:MM:ss”
“DayOfWeek”=(获取日期$\uU4.TimeCreated)。DayOfWeek
“ID”=$\uu0.ID
“ID Description”=开关($\ux){
{$\.ID-eq'42'-和$\.Message-match'Sleep Reason:Application API'}{'Type=Sleep matched using EventID和Message';continue}
{$\.ID-eq'42'}{'Type=Sleep matched using EventID';continue}
{$\.Message-match'睡眠原因:应用程序API'}{'Type=Sleep matched using Message';continue}

'MESSAGE'=$\.MESSAGE.replace('r`n`r`n','r`n')-replace“((?如果您确实不想从文件中执行代码,请像往常一样在ps1中多行写出代码,完成后,请对其进行base64编码,然后使用
-EncodedCommand
参数。没有太多理由避免使用文件,但如果必须,这对长代码很有效。有关可以执行的代码段,请参阅
powershell.exe/?
用于对文件进行编码。