Benennen Sie alle Dateien in einem Verzeichnis in eine sequenzielle Standarddatei um

Benennen Sie alle Dateien in einem Verzeichnis in eine sequenzielle Standarddatei um

Ich habe eine Reihe von MP3-Dateien in einem Unterverzeichnis ( mayor) und möchte jede davon mit ffmpeg konvertieren (so: ffmpeg -i <input_file> -ar 44100 -ab 128k -f mp3 <output_file>), wobei die Ergebnisdatei in einem Schwesterordner mayor_outin einem sequenziellen Muster gespeichert wird. Ich habe es mit einigen Fragen von Stack versucht FOR, aber niemand hat erklärt, wie man das in einer Datei-/Verzeichnisiteration macht, also stelle ich eine neue Frage.

Antwort1

Nun, ich habe es geschafft, dies mit diesem .bat-Skript zu tun (inspiriert vondiese Antwort)

@echo off
cd /D mayor
set _num=1
FOR /R %%X IN (*.mp3) DO call :body %%X
goto :eof

:body
ffmpeg -i %1 -ar 44100 -ab 128k -f mp3 ../mayor_out/YAL_m%_num%.mp3
set /a "_num=_num+1"
goto :eof
pause

Antwort2

Die folgende Powershell sollte die gewünschten Befehle ausführen. Passen Sie die Pfade nach Bedarf an:

  1. Erstellen Sie im „übergeordneten“ Verzeichnis (z. B. C:\parent\) eine Datei mit dem Namen „ProcessMp3.ps1“ und fügen Sie den folgenden Code hinzu.

    ForEach($i in Get-ChildItem -filter "*.mp3" -Path "C:\parent" ){  
       ffmpeg -i $i -ar 44100 -ab 128k -f mp3 ".\sibling\$i"
    }
    
  2. Erstellen Sie unter dem übergeordneten Verzeichnis ein Verzeichnis mit dem Namen „Geschwister“, z. B. „C:\übergeordnet\Geschwister\“.

  3. Führen Sie in einer Eingabeaufforderung Folgendes aus:

    Powershell ./ProcessMp3.ps1
    

Wenn „sequenziell“ lediglich das Hinzufügen von 1, 2, 3 usw. als Präfix zum Dateinamen bedeutet, könnte das Skript folgendermaßen aussehen:

$c=1
ForEach($i in Get-ChildItem  -filter "*.mp3" -Path "C:\parent" ){  
  ffmpeg -i $i -ar 44100 -ab 128k -f mp3 ".\sib\$c-$i"
  $c++
}

verwandte Informationen