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。其思想是数据包捕获过程应该连续运行。(可能会将数据转储到数据库中,这就是为什么我们在两个文
您需要在脚本块内定义函数,并将变量作为参数传递给它:
$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 (...)