Dateinamen per Batch sortiert in eine Textdatei schreiben

mischaef

Kassettenkind
Teammitglied
Registriert
Aug. 2012
Beiträge
6.147
Moin zusammen,

ich habe mir vor geraumer Zeit eine Batch-Datei estellt, um via ffmpeg mehrere Video-Clips zu einer Datei zu verbinden. Dazu müssen die Dateinamen zunächst in eine Textdatei geschrieben werden, die fmpeg dann abarbeitet. Das hat bisher auch immer gut geklappt. Aus mir nun nicht nachvollziehbaren Gründen werden die Dateien nun aber nicht mehr den Dateinamen nach sortiert in die Liste geschrieben, sondern durcheinander. Warum? Keine Ahnung. So kann aich das ganze natürlich nicht gebrauchen...

Gibt es eine Möglichkeit, die Dateien anhand des Dateinamens vorher zu sortieren und dann erst in die Textdatei zuschreiben?

Der Code sieht bisher so aus:

Code:
chcp 1252

setlocal enabledelayedexpansion

rem Ordnername für fertiges File übernehmen
for %%i in (.) do set ordner=%%~nxi

rem Textdatei aus Dateien erstellen
(for %%i in (*.mp4) do @echo file '%%i') > "%ordner%.txt"

rem Neue Datei anhand Liste erstellen
"C:\Program Files\ffmpeg\ffmpeg.exe" -safe 0 -f concat -i "%ordner%.txt" "%ordner%.mp4"

Vielleicht hat jemand ja eine Idee, was ich machen könnte...

Besten dank

Michael
 
Habe es gerade bei mir ausprobiert (Win 11). Es funktioniert einwandfrei.
 
Ich habe es bei mir auf zwei Rechnern ausprobiert....in der Textdatei sind bei mir die Dateien wild durcheinandergewürfelt...hat vielleicht was mit dem Zeitpunkt der Speicherung zu tun...wenn nichts anderes angegeben ist, sortiert Windows meines Wissens danach...
 
mischaef schrieb:
hat vielleicht was mit dem Zeitpunkt der Speicherung zu tun
Ja, das war das große Problem mit den ersten MP3 Playern, die die Dateien nach der Erstellzeit und nicht nach dem Dateinamen abgespielt haben. Damals habe ich einen neuen Ordner erstellt und dort die Dateien in der richtigen Reihenfolge hineinkopiert. Dann das Ganze auf die Speicherkarte des MP3 Players.

Gerade willentlich durcheinanderkopierte MP4 erstellt und deine Batchdatei drüberlaufen lassen: Das Textfile ist alphabethisch sortiert. Daran kann's also nicht liegen. Evtl. irgendeine Einstellung in Windows? Oder war ein Update zwischendurch?
 
Nein...gar nichts...und wie gesagt, auf zwei Rechnern das gleiche Verhalten.
 
Merkwürdig! Habe die Batch nochmal mit "stern.stern" (warum kann man kein Stern hier darstellen?) in verschiedenen Ordnern ausprobiert und alle Einträge in den Textdateien sind alphabethisch.
Tut mir leid, da habe ich auch keine weiteren Ideen mehr, zumal das bei dir auf mehreren Rechner so läuft.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: mischaef
Hast du @Holgip deinen Ordner evtl. als "allgemeine Dateien" markiert, während @mischaef seinen als Musik markiert hat ?
Nur eine Idee. Die Einstellung sieht man unter Rechtsklick auf den Ordner, Eigenschaften, Reiter "Anpassen"
 
Probier mal folgendes: for /f "tokens=*" %%A in ('dir *.mp4 /ON') do ....

Ich hab das aber nur aus dem Kopf geschrieben und bin gerade am Handy.. Wenn es so noch nicht klappt, einfach mal bei ss64.com nachschauen wie es ganz genau funktioniert.
 
@Micke: Ja, das hab ich. Probiere ich morgen mal aus, ob es daran liegen kann.
@andy_m4: Ja, und wie? Wenn ich . schreibe, kommt nur der Punkt, wie du siehst.
 
Holgip schrieb:
Ja, und wie? Wenn ich . schreibe, kommt nur der Punkt, wie du siehst.
Der Punkt wird interpretiert als Markup für Kursiv-Schrift.
Aber wenn Du in in ICODE-Tags packst, dann lässt er es so.
 
  • Gefällt mir
Reaktionen: Holgip
CB unterstützt Markdown. Das kann man nutzen. Für spezifische Zeichen wie Sternchen einfach Backticks drumrum (Umschalt + das Zeichen rechts neben dem ß, NICHT den Apostroph). Dann sieht das so aus: *.*

Ich mach mich ja bestimmt wieder nicht beliebt, aber dennoch, Batch ist out, Powershell ist in und vor allem signifikant einfacher. Ja es ist anders, aber stressfreier.

Eine mehr oder weniger simple Implementierung des Problems:

PowerShell:
# Liste der MP4 Dateien zusammensuchen. Mit -Recurse wäre es rekursiv
$mp4Files = Get-ChildItem -File -Filter '*.mp4' -LiteralPath $PWD.ProviderPath  | Sort-Object Name

# Aktuellen Ordner ableiten.
$CurrentFolder = Get-Item $PWD.ProviderPath

# Liste definieren und anlegen
$ListPath =  $CurrentFolder.FullName + '.txt'
$OutPath = $CurrentFolder.FullName + '.mp4'
Set-Content -Value $mp4Files.FullName -Path $ListPath -Encoding string

# Neue Datei anhand Liste erstellen
 Start-Process 'C:\Program Files\ffmpeg\ffmpeg.exe' -ArgumentList '-safe', 0, '-f', 'concat', '-I',  $ListPath, $OutPath

notes:
  • nicht getestet
  • start-process hat KEIN -Wait bekommen. dadurch wird es im Hintergrund ausgeführt. Soll gewartet werden, bis ffmpeg fertig ist, -Wait hintendran.
  • die Ein- und Ausgabedateien sind über den aktuellen Pfad vollständig qualifiziert, damit jederzeit klar ist, wo sie sich befinden. Diesen Pfad kann man natürlich ändern.
  • Powershell schreibt standardmäßig Unicode. Je nachdem was ffmpeg als Input mag oder nicht mag kann man mit -Encoding ein bißchen herumbasteln. UTF8 wäre ideal, wenn es verwendet werden kann.

Das Ganze kann man auch aus batch aufrufen, wenn man das fragment in eine PS1 Datei steckt und die mit powershell -NoProfile -Exec Bypass -File path/to/file.ps1 aufruft.
 
Zuletzt bearbeitet von einem Moderator:
  • Gefällt mir
Reaktionen: simpsonsfan
Zurück
Oben