Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading Powershell中的多线程_Multithreading_Powershell_Start Job_Start Process - Fatal编程技术网

Multithreading Powershell中的多线程

Multithreading Powershell中的多线程,multithreading,powershell,start-job,start-process,Multithreading,Powershell,Start Job,Start Process,我的脚本执行以下操作: 运行数据包捕获过程(使用windump)1小时,数据保存在textFile1中 1小时后将数据转储到数据库中 删除文本文件 运行另一个windump并将数据保存到textfile2 (然后在文本文件之间交替时重复该过程) 问题是将数据转储到数据库需要很长时间。因此,数据包捕获过程只会在几个小时后再次运行。我无法使多线程工作,因为Start Job不接受函数作为ScriptBlock。其思想是数据包捕获过程应该连续运行。(可能会将数据转储到数据库中,这就是为什么我们在两个文

我的脚本执行以下操作:

  • 运行数据包捕获过程(使用windump)1小时,数据保存在textFile1中
  • 1小时后将数据转储到数据库中
  • 删除文本文件
  • 运行另一个windump并将数据保存到textfile2 (然后在文本文件之间交替时重复该过程)
  • 问题是将数据转储到数据库需要很长时间。因此,数据包捕获过程只会在几个小时后再次运行。我无法使多线程工作,因为Start Job不接受函数作为ScriptBlock。其思想是数据包捕获过程应该连续运行。(可能会将数据转储到数据库中,这就是为什么我们在两个文本文件之间交替使用的原因)

    我已经尝试将整个ParseDumpDB放入$Scriptblock中,但它仍然不起作用

    脚本(已删除部分):


    您需要在脚本块内定义函数,并将变量作为参数传递给它:

    $ScriptBlock = {
      Function ParseDumpDB([string]$results){
        ...
      }
    
      ParseDumpDB $args[0]
    } 
    
    Start-Job -ScriptBlock $ScriptBlock -ArgumentList $LogFile2
    
    附带说明:从PowerShell脚本运行批处理脚本会使脚本非常复杂。您最好将批处理脚本的内容合并到PowerShell脚本中,并将其作为后台作业运行,例如:

    do {
      $job = Start-Job -ScriptBlock {
               & WinDump -i 1 -n -vv -w $args[0] ...
             } -ArgumentList $LogFile
    
      Start-Sleep -Seconds 3600
    
      Stop-Job -Id $job.Id
      Remove-Job -Id $job.Id
    
      Move-Item $LogFile $LogForImport
      Start-Job -ScriptBlock {
        ...
      } -ArgumentList $LogForImport
    } until (...)
    

    您如何强制启动作业只运行一个InstanceCCE?与设置max thread?@lulala一样,您可以实现一个(请注意,您至少有两个并行作业:
    WinDump
    和数据库导入),但您需要处理数据库导入运行时间超过1小时的情况,即当下一次导入应该开始时,导入尚未完成。
    do {
      $job = Start-Job -ScriptBlock {
               & WinDump -i 1 -n -vv -w $args[0] ...
             } -ArgumentList $LogFile
    
      Start-Sleep -Seconds 3600
    
      Stop-Job -Id $job.Id
      Remove-Job -Id $job.Id
    
      Move-Item $LogFile $LogForImport
      Start-Job -ScriptBlock {
        ...
      } -ArgumentList $LogForImport
    } until (...)