Batch Ordernamen in Textdtei speichern und zur weiteren Verarbeitung auslesen

mischaef

Kassettenkind
Teammitglied
Registriert
Aug. 2012
Beiträge
5.930
Hallo zusammen,

ich möchte eine Batch erstellen, welche mir die Ordner (keine Unterordner) in einem bestimmen Verzeichnis ausliest, diese in eine Text-Datei schreibt, die Datei dann aufruft und in jedem Ordner eine bestimmte Aktion ausliest.

Den Ordnerinhalt in die Text-Datei zu schreiben habe ich bereits hinbekommen, woran es aktuell noch hapert ist den Ordnernamen zeilenweise aus der Text-Datei wieder auszulesen und in eine Variable zu schreiben, mit der ich weiter mit diesem arbeiten kann. Und das dann via Schleife so die ganze Text-Datei durchgegangen wird.

Hätte da evt. jemand einen Anhaltspunkt für mich?

Besten dank

Michael
 
Besten dank erst mal...

Das ganze scheint doch ein wenig schwieriger zu werden.
Code:
chcp 1252
Setlocal EnableDelayedExpansion

@echo off
dir /a:d /b > "dir-list.txt"


for /F "delims=" %%i IN (dir-list.txt) DO (

  set ordner=%%i

    (for %%a in (!ordner!/*.mp4) do @echo file '%%a') > "!ordner!/!ordner!.txt"

    "C:\Program Files\ffmpeg\ffmpeg.exe" -safe 0 -f concat -i "!ordner!/!ordner!.txt" "!ordner!/!ordner!.mp4"

    del "!ordner!/!ordner!.txt"
)

Zum Verständnis: In einem Ordner befinden sich mehrere Unterordner mit Videoclips. Die einzelnen Clips in einem Ordner sollen zu einem einziigen Clip zusammemgefügt werden. Das mache ich per ffmpeg.

Zuerst wird eine Liste der Ordnernamen in einer Liste gespeichert. Diese wird im nächsten Schritt zeilenweise ausgelesen und der jeweilige Ordnername in eine Variable gespeichert. Für das Zusammenfügen der einzelnen Clips legt ffmepg ebenfalls eine Liste an (ist so im Programm festgelegt), lädt diese wieder und speichert den Clip unter dem Ordnernamen ab. Für jeden Ordner einzeln funktioniert das auch.

Um mir die Arbeit etwas zu erleichtert wollte ich jetzt eine Batch anlegen, die, wie beschrieben, die Ordnernamen ausliest und den Namen als Verzeichnis im ffmpeg-Aufruf vor den Pfad setzt, damit die Unterordner automatisch abgearbeitet werden. Etwas muss dabei richtig laufen, den die Text-Dateien für ffmpeg werden in den Unterordnern richtig angelegt. Das Abspeichern der Ordner-Datei, das Auslesen sowie das Speichern des Ordnernamens in den Pfad funktioniert. Jetzt werden aber die Clip-Namen nicht in die jeweilige Textdatei in den jeweiligen Unterordner geschrieben.

Beispiel:

Ordnernamen:

2023-01-01
  • Clip 1
  • Clip 2
usw

2023-01-02
  • Clip 1
  • Clip 2
usw

2023-01-03
  • Clip 1
  • Clip 2
usw

2023-01-04
  • Clip 1
  • Clip 2
usw

Jetzt soll in jedes Unterverseichnis eine Textdatei mit dem Ordnernamen (2023-01-01.txt usw) angelegt werden, in welcher die Clipnamen geschrieben werden. Das funktioniert aber irgendwie nicht.

Ich weiß jetzt nicht genau, ob das Programm das einfach nicht unterstützt oder ob ich irgendwo einen Fehler gemacht habe...

Gruß

Michael
 
So ähnlich hätte ich es auch gemacht

Code:
@echo off
set ordnerpfad="C:\"
dir %ordnerpfad% /a:d /b >dir.log
for /f %%i in (dir.log) do (
    set var=%%i
    call :verarbeitung
    )
exit

:verarbeitung
rem echo %var%
if "%var%" == "Windows" echo OS-Verzeichnis gefunden
 
  • Gefällt mir
Reaktionen: mischaef
mischaef schrieb:
Zum Verständnis: In einem Ordner befinden sich mehrere Unterordner mit Videoclips. Die einzelnen Clips in einem Ordner sollen zu einem einziigen Clip zusammemgefügt werden. Das mache ich per ffmpeg.
Warum so kompliziert? ffmpeg kann Dateilisten verarbeiten, um Dateien zu konkatenieren.

https://trac.ffmpeg.org/wiki/Concatenate

Ich habe mir alle Dateien, die ich zusammenfügen will, per Skript 1 in eine Liste gepackt, und dann ffmpeg übergeben. Dazu ein 2.Batch, der dann über die Ordner geht und das erste Skript mit Übergabe der Datei füttert. Jedoch verwende ich hier lieber WSL2 mit bash.
 
  • Gefällt mir
Reaktionen: mischaef
@nutrix
Die Dateilisten sollen ja dynamisch erstellt werden. Ich habe 10 Unterordner: Der erste Teil erstellt eine liste mit den Ordnernamen, welche im ffmpeg-Aufruf aufgelöst werden. Dann erstellt ffmpeg im jeweiligen Ordner die Textdate mit den Dateien und arbeitet die ab. Wenn ich vorher für jeden Ordner die Text-Datei mit den Dateien manuell erstellen muss, kann ich die Batch auch separat und manuell in jedem Ordner aufrufen - das funktioniert ohne Probleme. Nur mit dem Verzeichniswechsel gibt es wohl Probleme.

Oder verstehe ich Dich falsch?

Das Problem scheint hier zu liegen - die Datei wird zwar angelegt, aber nicht mit den Dateien gefüllt.

Code:
(for %%a in (!ordner!/*.mp4) do @echo file '%%a') > "!ordner!/!ordner!.txt"
 
mischaef schrieb:
Das Problem scheint hier zu liegen - die Datei wird zwar angelegt, aber nicht mit den Dateien gefüllt.
Da ist am Anfang des Skriptes ein @Echo, also nimm in der Zeile mal das @ for dem echo raus, bin nicht sicher, was 2 davon so anrichten.
 
  • Gefällt mir
Reaktionen: mischaef
@mae1cum77
Leider kein Unterschied.

Ich glaube aber, dass ich den Fehler gefunden habe: Das !ordner!/*.mp4 muss in Anführungszeichen gesetzt werden.

Ich lasse es noch ein paar mal Testweise durchlaufen.
 
  • Gefällt mir
Reaktionen: mae1cum77
mischaef schrieb:
Das !ordner!/*.mp4 muss in Anführungszeichen gesetzt werden.
Ist bei Dateien/Ordnern in for Loops (innerhalb der Klammern) sinnvoll. Bei Kommandos sind in der Regel einfache Anführungszeichen gefragt.

Du kannst noch die TXT Liste wegrationalisieren und den DIR-Befehl direkt im Loop verarbeiten:
Code:
for /F "delims=" %%i IN ('dir /a:d /b') DO (
 
  • Gefällt mir
Reaktionen: mischaef
Das funktioniert jetzt perfekt. Besten dank dafür!

Das einzige, was noch nicht funzt, ist das Löschen der Textdatei für ffmpeg und der Original-Clips. Da streikt er irgendwie.


Code:
    del "!ordner!/!ordner!.txt"

    del "!ordner!/*.mp4"

Da kann das System den angegebenen Pfad nicht finden...auch hier muss das Problem irgendwie mit dem Ordner zu tun haben - in gleichen Verzeichnis wie die Files aufgerufen (also mit dem alten Script) funktioniert es...

Ansonsten muss ich mal schauen ob eine Extra-Schleife da abhilfe schaffen kann
 
Zuletzt bearbeitet:
Vermutlich sind die Dateien alle relativ zu einem Ordner aufgeführt, und daher finden Deine Befehle diese Ordner nicht mehr. Daher empfielt es sich, mit absoluten Ordnern zu arbeiten, sprich den gesammten Pfad Laufwerk:\Ordner\Dateiname zu verwenden.
Ergänzung ()

mischaef schrieb:
@nutrix
Die Dateilisten sollen ja dynamisch erstellt werden. Ich habe 10 Unterordner: Der erste Teil erstellt eine liste mit den Ordnernamen, welche im ffmpeg-Aufruf aufgelöst werden. Dann erstellt ffmpeg im jeweiligen Ordner die Textdate mit den Dateien und arbeitet die ab. Wenn ich vorher für jeden Ordner die Text-Datei mit den Dateien manuell erstellen muss, kann ich die Batch auch separat und manuell in jedem Ordner aufrufen - das funktioniert ohne Probleme. Nur mit dem Verzeichniswechsel gibt es wohl Probleme.
Nochmals, Du macht ein Skript, was Dir die Dateilisten pro Ordner erzeugt, wo Dateien gefunden werden. Und ein 2. Skript, was nur die Ordner durchgeht, und Skript 1 aufruft, und dann erzeugte Dateien löscht oder Deine Originaldatei. Würde ich übrigens nicht machen, falls die Skripte Fehler haben und Du nochmals die Sache starten mußt, und Du die Originaldateien wieder benötigst.
 
Misst, da war ich etwas zu spät...;-)

Hab zwischenzeitlich eine Lösung gefunden - anscheinend muss in diesem fall ein Backslash statt eines normalen Slashs genutzt werden - zumindest funktioniert es so.


Code:
del "!ordner!\!ordner!.txt"

del "!ordner!\*.mp4"

Die Original-Dateien sind da schon gesichert....auch wenn ich was verpeilt bin, soweit denke ich dann schon mit...;-)
Ergänzung ()

Wie ist es meist so schön: Wenn ein Problem gelöst ist, dann tauchen neue auf...^^

Das neue Scriupt scheint Probleme mit Umlauten zu haben, die das alte Script nicht hatte. Alles wird richtig angezeigt und auch die Dateien entsprechend richtig angelegt, aber die Umlaute, die ffmpeg aus der Dateienliste ausliest werden nicht richtig übernommen, entsprechend kann das Programm die Dateien dann auch nicht finden. CHCP 1252 ist aber aktiviert...

NACHTRAG: chcp 65001 (UTF-8) hat anscheinend die Lösung gebracht
 
Zuletzt bearbeitet:
Ich kann nachher mal versuchen das was du anfordert mal einfach in einem powershellskript abzubilden, welches meiner Meinung nach sehr oft die bessere Lösung ist als rumdoktorn mit Nash, die meisten Leute haben einfach eine riesige Angst vor powershell
 
Lösung in Powershell:

PowerShell:
$path   ='.'
$ffmpeg = 'C:\Program Files\ffmpeg\ffmpeg.exe'

foreach ($ordner in (Get-ChildItem -Path $path -Directory))
{
    $outtxt = Join-Path $ordner ($ordner.Name + '.txt')
    $outmp4 = Join-Path $ordner ($ordner.Name + '.mp4')
   
    foreach ($file in (Get-ChildItem -Path $ordner -Filter *.mp4)) {
        "file '$($file.FullName)'" | Out-File  $outtxt -Append -Encoding ascii
    }
    & $ffmpeg -safe 0 -f concat -i "$outtxt" "$outmp4"
    Remove-Item $outtxt
}

Wenn du es außerhalb des Zielverzeichnisses aufrufen willst, musst du die Variable $path ändern.
 
  • Gefällt mir
Reaktionen: nutrix, Rego, mischaef und eine weitere Person
Zurück
Oben