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