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

  • Eventuell hilft es, im Ausgabe-Dateinamen nur den Namensanteil ohne Pfad zu verwenden (%~nA). Die Hilfe zu FOR erklärt diese Parameter-Modifikatoren ausführlich genug.

  • %~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:

  • Frohe Pfingsten allerseits!

    Ihr habt mir vor einiger Zeit mit der Erstellung des Batchscripts oben geholfen, um Dateien mit mkvmerge zu bearbeiten.

    Das funktioniert seit Jahren hervorragend und nochmals Danke dafür!


    Jetzt würde ich gerne noch in diesem Zug die Dateinamen teilweise umbennen.

    Also bspw. würde ein Dateinmanen lauten: "Videoname (de+eng) (hd).mkv"

    Neben der Entfernung einer Tonspur und ggf. anderer Dinge per mkvmerge (das klappt alles) sollen die Dateien mit geänderten Dateinamen ausgegeben werden, in dem Teile der Dateinamen entfernt werden und/oder umbenannt werden.

    Bspw. soll aus dem Dateinamen oben das "(de+eng)" entfernt werden und das "(hd)" in "[HD]" umgewandelt werden.


    Über mkvmerge geht das nicht, sofern ich da nichts übersehe. Man müsste das Script um eine Umbennen-Funktion erweitern. Leider bin ich da total aufgeschmissen. Ich habe auch im Internet nichts passendes finden können, das ich einbauen könnte. (Die Tipps Multi-Umbennen-Programme zu benutzen wie im Total Commander kenn ich natürlich, aber darum geht es mir nicht).


    Gibt es da eine Möglichkeit?

  • hab gestern "zufällig" mir ein script geschrieben, welches die grundlagen behandelt.
    leider erfordert das immer eine anpassung, der regeln wie dateinamen umgewandelt werden sollen.
    damit ist eine automatisierung schwierig wenn die dateinamen varriieren.

    ganz grob,
    mit reinem Batch kann man nur von vorn und von hinten scannen mit festen längen,
    wenn es zu sonderzeichen kommt fällt irgendwann der filter außeinander.

    darum arbeite ich z.z. mit PowerShell welchen ich über Batch aufrufe.
    auch hier gibt es probleme bei steigener komplexität
    und/oder das script wird langsamer,
    wenn die aufgabe in mehreren getrennten instanzen verteilt werden muss

    es ist nicht unmöglich einen enzelnen powershell befehl für alle aufgaben zu schreiben,
    nur bin ich dabei nicht sonderlich effizent dabei.
    ich bin froh, dass es läuft... :D

    hier mal ein beispielcode:

    PowerShell:

    Code
    $xIN='Videoname (de+eng) (hd).mkv'
    $xFL1_in='(de+eng)'
    $xFL1out='(de+eng)'
    $xFL2_in='(hd)'
    $xFL2out='[HD]'
    
    $xOUT=(Get-Item "$xIN").Name -replace '$FL1_in','$FL1out' -replace '$FL2_in','$FL2out'
    
    Rename-Item -Path "($xIN).FullName" -NewName "($xIN).DirectoryName\$xOUT"

    Batch mit PowerShell:

    das ist jetzt mal schnell frei aus dem kopf zusammengeklöppelt und ungetestet,
    das ist aber im kern der code den du brauchst.

    die variablen sind für die einfachere änderung der werte.
    wenn mehr filter braucht dann muss -replace '$FLX_in','$FLXout' multipliziert werden
    und entsprechende variablen erstellt werden, bzw. die werte direkt eingesetzt werden...

    p.s.:
    mach dir backups von den scripten, wenn du daran rumdocktors...
    'pause', 'echo', '::' / 'rem'. 'set x'* / 'set Variable' helfen dir beim debuggen.
    (* es hat ein grund warum alle meine variablen mit 'x' beginnen :D )

    übrigens kannst du versuchen mit chatGPT dir die scripte bauen/reparieren lassen.
    leider ist der z.T. in details ziehmlich dumm
    das beste war:

    Code
    if "%xIN%"="" (echo.ERROR: no file. & pause & exit /b)

    der hat zum verrecken nicht herausgefunden, dass 2 = benötigt werden:

    Code
    if "%xIN%"=="" (echo.ERROR: no file. & pause & exit /b)

    das gehört eigendlich zu den batch-grundlagen,

    also bleibt es nicht aus ein gewisses basiswissen zu haben,
    denn so ein schreibfehler, wenn man mit 2 verschiedenen scriptsprachen herrumspielt, ist schnell mal passiert.

    gut ich arbeite primär im primitiven texteditor (notepad),
    aber so tools wie notepad++ kann dir die syntax markieren
    und zeigt so einfache fehler darin auf.


    ... viel spazz...

Jetzt mitmachen!

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