在四个并行内核上运行不同的Powershell命令

问题描述:

我有一个脚本可以处理一堆图像。到目前为止,它依次运行,只使用一个核心并且永远占用。我手边有四个核心。我怎样才能同时运行这些命令中的四个?在四个并行内核上运行不同的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 

编辑:我做了与此相关的一个How to put powershell commands in an array?

+0

看看http://stackoverflow.com/questions/12766174/how-to-execute-a-powershell-function-several-times-in-parallel – 2014-11-02 02:41:07

+1

也看看RunspacePools HTTP: //thesurlyadmin.com/2013/02/11/multithreading-powershell-scripts/ – Matt 2014-11-02 13:27:29

+0

谢谢,我之前找到了thesurlyadmin网站,但不知道从哪里开始。 – mles 2014-11-02 23:53:00

这应该是非常接近你想要做什么新问题。但是我无法测试它。

编辑来自评论: 我已经添加了一些逻辑,以便只有4个工作随时可以运行。

function Convert 
{ 
    param ($scene, $source, $target, $density = "200", $quality = "80", $delete = "0") 

    $running = @(Get-Job | ? {$_.State -eq 'Running'}) 
    while ($running.Count -gt 4) { 
     $done = Get-Job | Wait-Job -Any 
     $running = @(Get-Job | ? {$_.State -eq 'Running'}) 
    } 

    $arguments = @($density, $quality, $delete, $scene, $source, $target) 
    start-job -scriptblock { convert.exe -density $args[0] -quality $args[1] -delete $args[2] -scene $args[3] $args[4] $args[5]} -ArgumentList $arguments 

} 

Convert 1 C:\Users\mles\Desktop\ta2014\v33_1_21_Northland.pdf C:\Users\mles\Desktop\ta2014\%03d.jpg 
Convert 22 C:\Users\mles\Desktop\ta2014\v33_22_31_Auckland.pdf C:\Users\mles\Desktop\ta2014\%03d.jpg 
Convert 32 C:\Users\mles\Desktop\ta2014\v33_32_49_Waikato.pdf C:\Users\mles\Desktop\ta2014\%03d.jpg 
Convert 50 C:\Users\mles\Desktop\ta2014\v33_50_62_Whanganui.pdf C:\Users\mles\Desktop\ta2014\%03d.jpg 
Convert 63 C:\Users\mles\Desktop\ta2014\v33_63_69_Manawatu.pdf C:\Users\mles\Desktop\ta2014\%03d.jpg 
Convert 70 C:\Users\mles\Desktop\ta2014\v33_70_75_Wellington.pdf C:\Users\mles\Desktop\ta2014\%03d.jpg 
Convert 76 C:\Users\mles\Desktop\ta2014\v33_76_92_Marlborough.pdf C:\Users\mles\Desktop\ta2014\%03d.jpg 
Convert 93 C:\Users\mles\Desktop\ta2014\v33_93_117_Canterbury.pdf C:\Users\mles\Desktop\ta2014\%03d.jpg 
Convert 118 C:\Users\mles\Desktop\ta2014\v33_118_127_Otago.pdf C:\Users\mles\Desktop\ta2014\%03d.jpg 
Convert 128 C:\Users\mles\Desktop\ta2014\v33_128_141_Southland.pdf C:\Users\mles\Desktop\ta2014\%03d.jpg 

Get-Job | Wait-Job 
Get-Job | Receive-Job 
+0

关闭是的。同时启动所有工作,但不是一次启动4个工作。 – mles 2014-11-02 23:56:50

+0

请参阅修改后的答案。 – 2014-11-03 05:46:34

+0

出于某种原因,您修改的答案不会启动“转换76 ...”和“转换118 ...”作业?尝试了2次,但9个工作中只有7个开始。控制台没有错误。 – mles 2014-11-06 23:09:43