如何在for循环中多线程启动进程?

时间:2017-06-18 07:08:07

标签: powershell

我有这个小问题我希望你可以帮助我。 我们在晚上创建一个目录,该目录有大约300个文件,当它一次一个地执行时。我想做5个左右,不加倍已经处理过的。 这是我当前的脚本,如何制作它以便一次可以做5个?

$Files = Get-ChildItem V:\SQL_Server_Backups

ForEach ($File in $Files) 
{ 
    $fullname = $File.fullname
    $rar = "m[f] -ep -m4 -mt8 -ri12 D:\RAR\$File.rar $Fullname"
    start-process -File "C:\Program Files\WinRAR\rar.exe" -ArgumentList $rar -Wait 
} 

现在我花了最后几个小时试图绕过Runspace,Run-Jobs,安装不同的多线程脚本,但是我很失落它不好笑。 我真的希望有一个简单的方法来运行它,而无需安装额外的模块或搞乱其他东西。因为我希望能够移动它而不必安装额外的东西才能使它工作。 提前谢谢。

2 个答案:

答案 0 :(得分:2)

Invoke-Parallel脚本非常适合我

https://github.com/RamblingCookieMonster/Invoke-Parallel

. "C:\_Batch_Jobs\Invoke-Parallel.ps1"
$Files = Get-ChildItem V:\SQL_Server_Backups

$Files | Invoke-Parallel -ScriptBlock {
    $fullname = $_.fullname
    $rar = "m[f] -ep -m4 -mt8 -ri12 D:\RAR\$_.rar $Fullname"
    start-process -File "C:\Program Files\WinRAR\rar.exe" -ArgumentList $rar -Wait
} -throttle 10

答案 1 :(得分:0)

尝试这样的事情:

ForEach ($File in $Files) 
{ 
    $fullname = $File.fullname
    $rar = "m[f] -ep -m4 -mt8 -ri12 D:\RAR\$File.rar $Fullname"
    $scriptblock = [scriptblock]::Create("start-process -File ""C:\Program Files\WinRAR\rar.exe $rar""")
    Start-Job -ScriptBlock $scriptblock 
}