经过长时间的阅读,我终于到了需要注册的地步。我这边的你好。我目前正在编写一个程序,从Windows事件日志中检索信息。为了解析日志并将其导出到csv文件,我使用标准的Windows Powershell工具,这对我来说很好。为了加快进程,我决定使用多线程。每个日志都有自己的线程,以更快的方式检索信息。然而,在这样做的过程中,我目前陷入了困境,不知道如何继续下去。
在我的一些函数中,我想使用一个EventId数组,如$evtid= @(4624,4648)
,它将与其他参数一起传递。不幸的是,我没有把这个数组作为参数传递,这导致了作业的不完整运行。所需的输出将是一个经过过滤的.csv
-文件,但我得到的输出只是一个空文件。作业似乎很快就开始运行并标记为completed
,因为我正在复习下面的Get-Job | Wait-Job
-语句。我坚信传递是个问题,因为另一个函数不过滤这个ID,因此没有数组可以传递,它运行得很好。
这里是有问题的函数和我用于EventID的变量:
#defines EventIDs and imports WinEventData
$systemid=@(7035,7034,7040)
$loc = Get-Location
"$($loc)*.psm1" | gci | Import-Module
#Starts the job and is intended to filter the EventID with -FilterHashtable
$JobSysFiltered= Start-Job -ScriptBlock{param ($evtmax,$system,$systemid,$systemstart,$systemend,$systemcsv)
Get-WinEvent -MaxEvents $evtmax -FilterHashtable @{Path=$system;ID=$systemid;starttime=$systemstart;
endtime=$systemend} | Get-WinEventData | Select-Object RecordId,Id,TimeCreated,
TaskDisplayName,
Task,
ProviderName,
ProviderId,
LogName,
MachineName,
UserId,
e_ServiceName,
e_ImagePath,
e_ServiceType,
e_StartType,
e_AccountName,
Message |
Export-Csv $systemcsv -Delimiter ';'} -ArgumentList ($evtmax,$system,(,$systemid),$systemstart,$systemend,$systemcsv)
到目前为止,我在研究过程中发现的东西还不起作用。已经尝试在param
-节中使用[int[]]
-语法,但没有帮助。如果问题在其他地方可以找到,我愿意接受任何建议。感谢任何帮助和小费,因为我现在没有主意,但如果可能的话,我不想回到非多线程脚本。
经过一段时间的睡眠,我终于找到了解决这个问题的方法,我想把它提供给有类似问题的人。由于不可能传递包含一个数组的多个参数,我只是将它们连接到另一个数组中。使用[int[]]
在作业内部强制转换ID似乎很重要,因为-FilterHashtable
无法处理PSObject。如果你想在一个作业中使用一个参数,只需在那里调用索引即可。然而,我无法使它与输出路径一起工作,所以似乎有必要创建一个变量。如果有特殊原因,我很乐意解释。
这里有一个小样本代码:
-
用参数定义数组====================================
$variablearraysys= @($evtmax,$system,$systemid,$systemstart,$systemend,$systemcsv)
-
通过索引使用数组的元素====================================
$JobSysFiltered= Start-Job -ScriptBlock{param ($variablearraysys) $csv=$variablearraysys[5] Get-WinEvent -MaxEvents $variablearraysys[0] -FilterHashtable @{Path=$variablearraysys[1];ID=[int[]]$variablearraysys[2];starttime=$variablearraysys[3];endtime=$variablearraysys[4]} | Get-WinEventData | Select-Object RecordId,Id,TimeCreated, TaskDisplayName, Task, ProviderName, ProviderId, LogName, MachineName, Message | Export-Csv $csv} -ArgumentList (,$variablearraysys)
请注意,当您将数组传递给-ArgumentList
时,使用(,$variable)
-语法也很重要。否则,它将不会使用完整的数组。希望这能帮助解决未来的此类问题。