0

我有一個腳本,做一堆圖像處理。到目前爲止,它依次運行,只使用一個核心並且永遠佔用。我手邊有四個核心。我想同時運行這些命令中的四個。要做到這一點,我需要把這些命令放在一個數組中。這些都是原來的命令:如何把PowerShell命令放入數組中?

convert.exe -density 200 -quality 80 -delete 0 -scene 1 C:\Users\mles\Desktop\ta2014\v33_1_21_Northland.pdf C:\Users\mles\Desktop\ta2014\%03d.jpg 
convert.exe -density 200 -quality 80 -delete 0 -scene 22 C:\Users\mles\Desktop\ta2014\v33_22_31_Auckland.pdf C:\Users\mles\Desktop\ta2014\%03d.jpg 
convert.exe -density 200 -quality 80 -delete 0 -scene 32 C:\Users\mles\Desktop\ta2014\v33_32_49_Waikato.pdf C:\Users\mles\Desktop\ta2014\%03d.jpg 
convert.exe -density 200 -quality 80 -delete 0 -scene 50 C:\Users\mles\Desktop\ta2014\v33_50_62_Whanganui.pdf C:\Users\mles\Desktop\ta2014\%03d.jpg 
convert.exe -density 200 -quality 80 -delete 0 -scene 63 C:\Users\mles\Desktop\ta2014\v33_63_69_Manawatu.pdf C:\Users\mles\Desktop\ta2014\%03d.jpg 
convert.exe -density 200 -quality 80 -delete 0 -scene 70 C:\Users\mles\Desktop\ta2014\v33_70_75_Wellington.pdf C:\Users\mles\Desktop\ta2014\%03d.jpg 
convert.exe -density 200 -quality 80 -delete 0 -scene 76 C:\Users\mles\Desktop\ta2014\v33_76_92_Marlborough.pdf C:\Users\mles\Desktop\ta2014\%03d.jpg 
convert.exe -density 200 -quality 80 -delete 0 -scene 93 C:\Users\mles\Desktop\ta2014\v33_93_117_Canterbury.pdf C:\Users\mles\Desktop\ta2014\%03d.jpg 
convert.exe -density 200 -quality 80 -delete 0 -scene 118 C:\Users\mles\Desktop\ta2014\v33_118_127_Otago.pdf C:\Users\mles\Desktop\ta2014\%03d.jpg 
convert.exe -density 200 -quality 80 -delete 0 -scene 128 C:\Users\mles\Desktop\ta2014\v33_128_141_Southland.pdf C:\Users\mles\Desktop\ta2014\%03d.jpg 

到目前爲止,我想出了這一點:

$array = @() 
$array += "convert.exe -density 200 -quality 80 -delete 0 -scene 1 C:\Users\mles\Desktop\ta2014\v33_1_21_Northland.pdf C:\Users\mles\Desktop\ta2014\%03d_test.jpg" 
$array += "convert.exe -density 200 -quality 80 -delete 0 -scene 22 C:\Users\mles\Desktop\ta2014\v33_22_31_Auckland.pdf C:\Users\mles\Desktop\ta2014\%03d_test.jpg" 
$array += "convert.exe -density 200 -quality 80 -delete 0 -scene 32 C:\Users\mles\Desktop\ta2014\v33_32_49_Waikato.pdf C:\Users\mles\Desktop\ta2014\%03d.jpg" 
$array += "convert.exe -density 200 -quality 80 -delete 0 -scene 50 C:\Users\mles\Desktop\ta2014\v33_50_62_Whanganui.pdf C:\Users\mles\Desktop\ta2014\%03d.jpg" 
$array += "convert.exe -density 200 -quality 80 -delete 0 -scene 63 C:\Users\mles\Desktop\ta2014\v33_63_69_Manawatu.pdf C:\Users\mles\Desktop\ta2014\%03d.jpg" 
$array += "convert.exe -density 200 -quality 80 -delete 0 -scene 70 C:\Users\mles\Desktop\ta2014\v33_70_75_Wellington.pdf C:\Users\mles\Desktop\ta2014\%03d.jpg" 
$array += "convert.exe -density 200 -quality 80 -delete 0 -scene 76 C:\Users\mles\Desktop\ta2014\v33_76_92_Marlborough.pdf C:\Users\mles\Desktop\ta2014\%03d.jpg" 
$array += "convert.exe -density 200 -quality 80 -delete 0 -scene 93 C:\Users\mles\Desktop\ta2014\v33_93_117_Canterbury.pdf C:\Users\mles\Desktop\ta2014\%03d.jpg" 
$array += "convert.exe -density 200 -quality 80 -delete 0 -scene 118 C:\Users\mles\Desktop\ta2014\v33_118_127_Otago.pdf C:\Users\mles\Desktop\ta2014\%03d.jpg" 
$array += "convert.exe -density 200 -quality 80 -delete 0 -scene 128 C:\Users\mles\Desktop\ta2014\v33_128_141_Southland.pdf C:\Users\mles\Desktop\ta2014\%03d.jpg" 

foreach ($element in $array) { 
    $MaxThreads = 4 
    While (@(Get-Job | Where { $_.State -eq "Running" }).Count -ge $MaxThreads) 
    { Write-Host "Waiting for open thread...($MaxThreads Maximum)" 
     Start-Sleep -Seconds 1 
    } 

    Start-Job -Scriptblock{ $element } 
} 

While (@(Get-Job | Where { $_.State -eq "Running" }).Count -ne 0) 
{ Write-Host "Waiting for background jobs..." 
    Get-Job #Just showing all the jobs 
    Start-Sleep -Seconds 1 
} 

ForEach ($Job in (Get-Job)) { 
    Remove-Job $Job 
} 

的工作開始,但立即退出。我想這與我如何在數組中存儲命令有關?

回答

2

您可能想看看workflows,但它們會碰到最多5個併發進程。還有幾個使用運行空間池和PowerShell實現多線程的例子,這種方式繞過了這個限制。我給出了一個工作示例here

或者只是將腳本塊作爲腳本塊存儲在數組中而不是字符串。

$commands = @() 
$commands += {echo "test1"} 
$commands += {echo "test2"} 
$commands += {echo "test3"} 
foreach($command in $commands){ 
    start-job $command 
} 
+0

我偶然發現了工作流和運行空間池,但我不得不承認,使用作業是我有點理解的唯一例子。我的腳本基於這個示例:http://thesurlyadmin.com/2013/03/04/multithreading-revisited-using-jobs/。我只需要4個併發進程,因爲我只有4個內核。 – mles 2014-11-03 00:02:31

+0

編輯顯示如何使用數組中的scriptblocks,因爲這看起來更像你要找的東西。 – StephenP 2014-11-03 00:06:11

+0

正是我在找的,謝謝! – mles 2014-11-03 00:16:01