2017-06-18 135 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