Usando fluxos de trabalho no PowerShell

0

Eu tenho usado apenas um loop foreach padrão, que é executado como deveria. No entanto, eu tenho um processador de 8 núcleos e 16GB de RAM e pensei em utilizá-lo com um loop Parallel.foreach . Bem, esta sintaxe funciona como deveria

$filelist = Get-ChildItem G:\GoodFilesForServer\ -filter *.mkv
$num = $filelist | measure
$filecount = $num.count 
$i = 0;
ForEach ($file in $filelist)
{
    $Workflow:i++;
    $oldfile = $file.DirectoryName + "\" + $file.BaseName + $file.Extension;
    $newfile = $file.DirectoryName + "\" + $file.BaseName + ".mp4";      
    $progress = ($Workflow:i / $filecount) * 100
    $progress = [Math]::Round($progress,2)
    Clear-Host
    Write-Host -------------------------------------------------------------------------------
    Write-Host Handbrake Batch Encoding
    Write-Host "Processing - $oldfile"
    Write-Host "File $Workflow:i of $filecount - $progress%"
    Write-Host -------------------------------------------------------------------------------
    Start-Process "C:\Program Files\HandBrake\HandBrakeCLI.exe" -ArgumentList "-i '"$oldfile'" -t 1 --angle 1 -c 1 -o '"$newfile'" -f mp4  -O  --decomb --modulus 16 -e x264 -q 32 --vfr -a 1 -E lame -6 dpl2 -R Auto -B 48 -D 0 --gain 0 --audio-fallback ffac3 --x264-preset=veryslow  --x264-profile=high  --x264-tune='"animation'"  --h264-level='"4.1'"  --verbose=0" -Wait -NoNewWindow
    del $oldfile
}

Simples o suficiente, mas não é Parallel esta sintaxe não funciona e nenhum erro é mostrado para me ajudar a determinar por que ela não funciona.

Workflow ParallelTest
{
  $filelist = Get-ChildItem G:\GoodFilesForServer\ -filter *.mkv
  $num = $filelist | measure
  $filecount = $num.count 
  $i = 0;
  ForEach -Parallel -ThrottleLimit 20 ($file in $filelist)
  {
    $Workflow:i++;
    $oldfile = $file.DirectoryName + "\" + $file.BaseName + $file.Extension;
    $newfile = $file.DirectoryName + "\" + $file.BaseName + ".mp4";      
    $progress = ($Workflow:i / $filecount) * 100
    $progress = [Math]::Round($progress,2)
    Clear-Host
    Write-Host -------------------------------------------------------------------------------
    Write-Host Handbrake Batch Encoding
    Write-Host "Processing - $oldfile"
    Write-Host "File $Workflow:i of $filecount - $progress%"
    Write-Host -------------------------------------------------------------------------------
    Start-Process "C:\Program Files\HandBrake\HandBrakeCLI.exe" -ArgumentList "-i '"$oldfile'" -t 1 --angle 1 -c 1 -o '"$newfile'" -f mp4  -O  --decomb --modulus 16 -e x264 -q 32 --vfr -a 1 -E lame -6 dpl2 -R Auto -B 48 -D 0 --gain 0 --audio-fallback ffac3 --x264-preset=veryslow  --x264-profile=high  --x264-tune='"animation'"  --h264-level='"4.1'"  --verbose=0" -Wait -NoNewWindow
    del $oldfile
  }
}

O que devo alterar na minha sintaxe Workflow para poder executar a conversão em Parallel (btw, se um ThrottleLimit de 20 for insano para tentar, podemos diminuir isso)

    
por user2676140 05.07.2016 / 21:25

0 respostas