将数组作为参数传递给启动作业



经过长时间的阅读,我终于到了需要注册的地步。我这边的你好。我目前正在编写一个程序,从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。如果你想在一个作业中使用一个参数,只需在那里调用索引即可。然而,我无法使它与输出路径一起工作,所以似乎有必要创建一个变量。如果有特殊原因,我很乐意解释。

这里有一个小样本代码:

  1. 用参数定义数组====================================

    $variablearraysys= @($evtmax,$system,$systemid,$systemstart,$systemend,$systemcsv)

  2. 通过索引使用数组的元素====================================

    $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)-语法也很重要。否则,它将不会使用完整的数组。希望这能帮助解决未来的此类问题。

最新更新