Mit mkvmerge per batch Dateien in Unterordnern verarbeiten

  • Hallo,

    ich möchte gerne von diverse Videodateien eine Tonspur und Untertitel entfernen. Die Dateien liegen alle in Unterordnern und es wäre schön, wenn die Ursprungsdateien dort bleiben könnten. Mkvmerge sollte also alle Dateien auch in Unterordnern verarbeiten.

    ich habe es mit folgendem versucht:

    FOR /F "delims=" %%A IN ('dir /b /s *.MKV') DO "mkvmerge.exe" -o "c:\remux\%%A" -a !2 -s !4 "%%A"

    PAUSE

    Allerdings bekomme ich nur folgende Fehlermeldung:

    "Error: The File c:\remux\e:\(Unterordnername(n))\(Dateiname).mkv' could not be opened for writing: create_directory () failed


    Befinden sich alle Dateien in einem Ordner, in dem sich auch mkvmerge.exe und die batch-Datei befinden, funktioniert es mit folgendem:
    FOR /F "delims=" %%A IN ('dir /b *.MKV') DO "mkvmerge.exe" -o "c:\remux\%%A" -a !2 -s !4 "%%A"


    Gibt es eine Möglichkeit, dass mkvmerge automatisch die Dateien in Unterordnern nimmt?

    Danke und Grüße

    Darko

  • %~nA sollte in for-schleifen, in scripten, nicht funktionieren*, da man %%A erweitern müsste

    *nicht getestet, mein hirn aus sieb behauptet aber, damit schn mal probleme gehabt zu daben.

    man bräuchte ein DIR-befehl, was relative pfade erzteugt...


    edit:

    man könnte die variable in eine weitere sub-forschleife packen, um die pfadvariable um das laufwerk zu kürzen...

    es würde sicherlich etwas einfacher, wenn du die ordnerstruktur fest vor gibst

    und erstmal nur mit den dateinamen arbeitest.

    wenn ich das problem ernsthaft angehen würde, dass würde aus deinem 2-zeiler,

    ein komplex verschachteltes script, wo ich jedes problem in ein einzelnen codeblock auslagern würde...

    sowas artet bei mir sehr schnell aus... ^^

    besonnders wenn dateinamen spezielle unicode zeichen beinhalten,

    dann kollabiert wieder alles... :P


    edit2:

    es wäre sicherlich hilfreicher, wenn man die komplette struktur wissen würde,

    und was davon unbekann und/oder dynamisch erfasst werden soll...


    edit3:

    schau dir mal mein "MDeX" an.

    HQ-LQ
    23. September 2017 um 13:49

    das erkennt ob die eingabe eine einzeldatei ist, oder multibel (ordner).

    und leitet sie zu deinem arbeits-befehl/script weiter.

    multible eingaben (ordner) werden intern wieder zu einzel-aufgaben aufgetrennt.

    vielleicht hilft dir das etwas weiter.

    generell empfielt es sich immer so eine aufgabe wie du dir gestellt hast,

    erst als einzel datei aufgabe umzusetzen und dann erst den multiplen input (ordner) hinzuzubauen.

  • %~nA sollte in for-schleifen, in scripten, nicht funktionieren*, da man %%A erweitern müsste

    Genau das funktioniert auch in Batch-Dateien genau so: mit doppelten Prozenten. Du musst dir eventuell überlegen, ob du noch Anführungszeichen brauchst, weil der Name eventuell Leerzeichen enthalten könnte. Darko tut das ja schon.

    Code
    FOR /F "delims=" %%A IN ('dir /b /s *.MKV') DO "mkvmerge.exe" -o "c:\remux\%%~nA.MKV" -a !2 -s !4 "%%A"
    PAUSE
  • das würde ja einiges einfacher machen.

    das sollte ich mir merken... :D

    Darko

    wenn du dir ei pfad zusammenbasteln willst:

    %%A is/sollte pfade mit leerstellen mit "" einklammern & ohne diese weglassen.

    hier könnte die forschleife aber trozdem diese regel ignoriren, dass müsste man mal testen*.

    bei %1 besteht ja diese regel

    *gerade getestet

    %%A gibt immer die rohe variable mit leerstellen & ohne "" aus.

    das liegt vermutlich daran, dass wenn die %%A variable gesetzt wird,

    dass das system halt nicht mehr weiß, ob es ein pfad oder ein anderer wert (z.b. reiner text) ist.

    dass war, glaube ich, auch der grund, warum ich überrascht bin, dass %%~dpnxA funktioniert.

    ich hatte wohl nach diesen "fehler", nicht tiefer mit der variable auseinader gesetzt.


    mit %%~A weist man an, dass die "" immer entfernt werden sollen,

    so kann man diese manuell extra erzwingen & muss nicht gegen verschwindende oder doppelte "" "" kämpfen:

    "%%~A"

    (beachte die for-ausnameregel; siehe weiter oben)


    ansonnsten kannst du den pfad schön sauber seperieren:

    %%~A = %%~dpnxA

    d = drive ( X: )

    p = path ( \folder\...\sub\ )

    n = name ( filename )

    x = extension ( .mkv )

    attribute gibt es auch:

    a = attribute (a,d,s,h,r,c,e)

    t = datum & zeit

    z = size/dateigröße

    nachzulesen mit dem befehl " for /? "

  • Ich bin erst jetzt wieder dazu gekommen, mich dem Thema zu widmen.

    Vielen Dank für eure Hilfe!! :encouragement::encouragement:

    mit %%~nA funktioniert es! :joyous:

    Code
    FOR /F "delims=" %%A IN ('dir /b /s *.MKV') DO "mkvmerge.exe" -o "c:\remux\%%~nA.MKV" -a !2 -s !4 "%%A"
    PAUSE
  • schön zu sehen, dass es dir was gebracht hat.

    mit %%~dpnxA könntest du dein script auch anders dynamisch anpassen

    z.B.:

    Code
    FOR /F "delims=" %%A IN ('dir /b /s *.MKV') DO "mkvmerge.exe" -o "c:\remux\%%~nxA" -a !2 -s !4 "%%A"

    wenn der dateitype eh der selbe ist.

    (wenn man ffmpeg verwenden würde, so könnte man daraus ein multi-format-remuxxer machen ;) oder so...)

    Code
    FOR /F "delims=" %%A IN ('dir /b /s *.MKV') DO "mkvmerge.exe" -o "%%~dpA\remux\%%~nxA" -a !2 -s !4 "%%A"

    man könnte auch in jeden arbeitsort, einfach ein eigenen ausgabeort spendieren

    Code
    FOR /F "delims=" %%A IN ('dir /b /s *.MKV') DO "mkvmerge.exe" -o "%%~dpnA_remux%%~xA" -a !2 -s !4 "%%A"

    oder direkt neben dem orginal, einfach eine arbeitskopie erstellen...


    so wärst du nicht auf das C:\ laufwerk eingeschränkt.


    bei mir ist C: eh nur für das windows/system reserviert.

    meine arbeitslauferke ist ehr D:\ & E:\

  • Danke auch noch mal für die Ergänzungen.

    Das c:-Laufwerk hatte ich auch nur zum testen des Skripts angelegt, eigentlich ist das bei mir auch Windows-reserviert ;)

    Aber die Parameter für flexiblen Pfade und Namen kannte ich gar nicht, das ist sehr nützlich. :thumbup:

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!