Eu tenho usado apenas um foreach
loop 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 Parallel.foreach
loop. 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
essa sintaxe não funciona, e nenhum erro é mostrado para me ajudar a determinar por que ele 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 Workflow
sintaxe, a fim de ser capaz de executar a conversão em Parallel
(btw, se um ThrottleLimit
dos 20 é insano para tentar, podemos diminuir isso)
@SimonS - se eu apagar todas as linhas de gravação, ainda assim nada parece ocorrer. Por exemplo, na minha janela do PowerShell quando o código estava em execução, ele travava na linha PS C: \ Users \ Me, mas quando eu executo isso, não há nenhum atraso. Ele imediatamente grava a sintaxe na janela e um novo C: \ Users. \ Me linha é mostrada (que é o que acontece quando o código foi concluído a execução)
—
user2676140
hmm ... você está carregando o fluxo de trabalho no cache primeiro e depois o chama executando
—
SimonS
ParallelTest
? um fluxo de trabalho se comporta como uma função, portanto, ele precisa ser carregado primeiro no cache e depois chamado.
@SimonS - Não tenho certeza do que você quer dizer com "Carregando o fluxo de trabalho no cache", mas estou chamando-o usando ParallelTest
—
user2676140
você está executando o seu todo
—
SimonS
workflow parallelTest { #stuff }
(este é o carregamento no cache) e então você está executando ParallelTest
(chame o fluxo de trabalho). é o que eu quero dizer. Só pra ter certeza.
write-host
dentro de um fluxo de trabalho sem um InlineScript. o que acontece se você excluir todosx-host
do seu fluxo de trabalho?