2017-06-18 55 views
0

我有这个小问题,我希望你能帮助我。 我们在晚上有一个包含约300个文件的目录,每次只有一个目录。我想做5个左右,而且已经处理了一倍。 这里是我目前的脚本,我该如何做到这一点,所以它可以一次做5个?如何在for循环中多线程启动进程?

$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 
} 

现在,我已经花了几个小时,试图让我的头周围运行空间,运行作业,安装不同的多线程的脚本,但我这样失去了它的不好笑。 我真的希望有一个简单的方法来运行这个,而不必安装额外的模块或弄乱其他东西。因为我希望能够通过安装更多的东西来实现它的功能。 预先感谢您。

+1

向我们展示你的尝试(使用运行空间,运行作业等),并解释它是如何失败的,我们将尽力帮助你出去 –

+0

看看posh-rsjob。 braindead runspaces – 4c74356b41

+0

使用'start-job' – kiro

回答

2

调用并行脚本为我工作完美

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

谢谢你,我试过了,但它说我需要等待2天。会做。 – Stealthmatt

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 
} 
+0

根据'$ Files'中的项目数量,这可能会导致比“5左右”更多的并发作业 –

+0

有超过300个文件,所以它们会产生300个文件无论如何指定5等? – Stealthmatt