Verwenden von Workflows in PowerShell
1300
user2676140
Ich habe nur eine Standardschleife verwendet foreach
, die so ausgeführt wird, wie sie sollte. Ich habe jedoch einen 8-Core-Prozessor und 16 GB RAM und dachte, ich würde einen solchen mit einer Parallel.foreach
Schleife verwenden. Nun, diese Syntax funktioniert so, wie sie sollte
$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 }
Einfach genug, aber es ist nicht so, dass Parallel
diese Syntax nicht funktioniert, und es wird kein Fehler angezeigt, um zu ermitteln, warum sie nicht funktioniert.
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 } }
Was muss ich in meiner Workflow
Syntax ändern, um die Konvertierung in Parallel
ausführen zu können (übrigens, wenn eine ThrottleLimit
von 20 verrückt ist, können wir das verringern)
Sie können ohne ein InlineScript sicherlich nicht innerhalb eines Workflows einen 'write-host' ausführen. Was passiert, wenn Sie alle 'x-host' aus Ihrem Workflow löschen?
SimonS vor 8 Jahren
0
@SimonS - Wenn ich alle Write-Host-Zeilen lösche, scheint immer noch nichts zu geschehen. Wenn in meinem Powershell-Fenster beispielsweise Code ausgeführt wurde, hängte es in der PS-C: \ Users \ Me-Zeile, aber wenn ich das ausführte, wird die Syntax sofort in das Fenster und in ein neues C: \ Users geschrieben \ Me-Zeile wird angezeigt (was passiert, wenn der Code die Ausführung abgeschlossen hat)
user2676140 vor 8 Jahren
0
hmm ... laden Sie den Workflow zuerst in den Cache und rufen ihn dann mit "ParallelTest" auf? Ein Workflow verhält sich wie eine Funktion, daher muss er zuerst in den Cache geladen und dann aufgerufen werden.
SimonS vor 8 Jahren
0
@SimonS - Ich bin nicht sicher, was Sie mit "Laden des Workflows in den Cache" meinen, aber ich rufe es mit ParallelTest auf
user2676140 vor 8 Jahren
0
Sie führen den gesamten `workflow parallelTest {#stuff}` aus (dies ist das Laden in den Cache), und dann führen Sie `ParallelTest` aus (rufen Sie den Workflow auf). das ist, was ich meine. Nur um sicher zu gehen.
SimonS vor 8 Jahren
0
Ah ja, genau das mache ich jetzt.
user2676140 vor 8 Jahren
0
Lassen Sie uns [diese Diskussion im Chat fortsetzen] (http://chat.stackexchange.com/rooms/42121/discussion-between-simons-and-user2676140).
SimonS vor 8 Jahren
0
0 Antworten auf die Frage
Verwandte Probleme
-
6
Guter PowerShell-Leitfaden, der durch fortgeschrittene Verwendung Einstieg leistet
-
5
Deaktivieren des Pieptons im cmd-Fenster
-
3
Powershell-Ping auf unbestimmte Zeit
-
5
Tastenkombination zum Einfügen in die Windows-Eingabeaufforderung
-
5
Welche Vorteile könnte ein durchschnittlicher Geek aus Powershell ziehen?
-
1
Powershell: Führt eine Operation für alle Dateien in einem Verzeichnis durch (foreach)
-
1
PowerShell / CMD-Markierung, um in Vista mit der rechten Maustaste zu klicken
-
3
Was ist Windows PowerShell?
-
5
Wie macht man ein Powershell (oder ein anderes) Skript, um die Bildschirmauflösung zu ändern?
-
5
Rufen Sie den aktuellen UNC-Pfad von einem lokalen Pfad in Powershell ab