PowerShell-Befehl für ffmpeg, um Elemente in einem Ordner rekursiv zu verarbeiten

843
user260467

Ich versuche herauszufinden, mit welchem ​​PowerShell-Befehl (oder bei Bedarf ein Skript) ffmpegrekursiv ein Verzeichnis durchlaufen, Standbilder über das -vfFlag ziehen und alle Standbilder in einen Ordner einfügen können, ohne dass Dateinamenkonflikte auftreten, die das Überschreiben verursachen würden.

Ich weiß also, dass dies für eine einzelne Datei gut funktioniert:

ffmpeg -i input.mov -vf fps=10/60 still%04d.jpg 

Die erzeugten Dateien aus starten still0001.jpgund zählen bis zu still0002.jpg, still0003.jpgusw.

Ich habe ein Verzeichnis, das so aussieht, mit Videodateien auf verschiedenen Ebenen:

  • topFolder1
    • midFolder1
      • video1.mov
      • video2.mov
    • midFolder2
      • video3.mov
      • video4.mov

Ich versuche, einen Powershell - Befehl zu verwenden, die Standbilder aus allen Videos ziehen kann video1.mov, video2.mov, video3.mov, und video4.movund sie in einen Ordner.

Ich habe einen PowerShell-Befehl gefunden, der behauptet, dass ffmpeg rekursiv ein Verzeichnis durchlaufen hat. Wenn ich jedoch versuche, es anzupassen, funktioniert es nicht.

Ich renne:

PS T:\Exports\1 - Dailies\stills test> for /F "tokens=*" "%G" IN ('dir "T:\Exports\1 - Dailies" *.mov') do ffmpeg -i "%G" -vf fps=10/60 still%05d.jpg 

Aber ich bekomme diesen Fehler:

At line:1 char:4 + for /F "tokens=*" "%G" IN ('dir "T:\Exports\1 - Dailies" *.mov') do f... + ~ Missing opening '(' after keyword 'for'. + CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException + FullyQualifiedErrorId : MissingOpenParenthesisAfterKeyword 

Wohin gehe ich falsch?

1
Der Befehl, den Sie ausführen, ist für die Ausführung von cmd.exe oder Batchdateien gedacht. Nicht Powershell. Um dies in Powershell-Forschung umzuwandeln, werden folgende Befehle verwendet: "Get-ChildItem", "foreach" und "Invoke-Expression". EBGreen vor 6 Jahren 0
@ EBgrün OK. Wenn Sie es in `cmd.exe` ausführen, wird Folgendes angezeigt:"% G "war zu diesem Zeitpunkt unerwartet." Irgendwelche Ideen? user260467 vor 6 Jahren 0
Der von Ihnen bereitgestellte Link sagt wörtlich aus, dass Sie die% -Symbole verdoppeln müssen. Der Befehl in dieser Verknüpfung wird auch anders als der von Ihnen ausgeführte Befehl in Anführungszeichen gesetzt. EBGreen vor 6 Jahren 0
@ user260467 Versuchen Sie, die Logik Ihrer Iterationsroutine so zu konvertieren, dass sie über PS-Befehle ausgeführt wird. Bearbeiten Sie Ihre Frage mit dem, was Sie mit dem Code versuchen, um potenziell mehr Aufmerksamkeit für weitere Hilfe zu erhalten. Nehmen Sie sich einfach ein paar Minuten und tippen Sie mich danach zurück. Führen Sie andernfalls Ihren Befehl in der Schleife von "cmd.exe" und nicht von "powershell.exe" aus, und sehen Sie, was passiert, weil mindestens der Fehler "An Zeile: 1 Zeichen: 4" nicht auftreten sollte. Pimp Juice IT vor 6 Jahren 0
@EBGreen Ja, das ist keine Batch-Datei. Außerdem probiere ich einen anderen Befehl. user260467 vor 6 Jahren 0

1 Antwort auf die Frage

1
John Stewien

Hier ein Beispiel eines Powershell-Befehls zum Konvertieren aller Dateien in einem Verzeichnis in mp4 und zum Ändern der Größe auf 1280x720:

dir *.* | foreach-object { $newname = $_.Name.Remove($_.Name.Length - $_.Extension.Length) + ".mp4"; .\ffmpeg.exe -i "$_" -s 1280x720 $newname }