Zeilenumbruch in Batch für mkvmerge

  • Morgen zusammen,


    ich denke mal dass mein Problem recht speziell ist, aber ich dachte ich probiere es mal...


    Also:


    Wie sich vielleicht rumgesprochen hat wandle ich meine Videos mittlerweile fast nur noch per Batchdatei um. Von manchen Tools kann dabei aber die Befehlszeile recht lang werden. Um diese ein wenig übersichtlicher zu gestalten kann dabei ja ein Zeilenumbruch in Form eines ^ eingefügt werden. Bei anderen Tools klappt das wunderbar, wie z.B. eac3to. Bei mkvmerge klappt das jedoch gar nicht.


    Aktuell bin ich hier angelangt:


    Code
    1. "C:\Programme\MKVtoolnix\mkvmerge.exe" ^
    2. -o "%%~ni.mkv" ^
    3. "--default-track" "0:no" ^
    4. "--forced-track" "0:no" ^
    5. "--display-dimensions" "0:1920x1080" ^
    6. "--default-duration" "0:24000/1001p" "-d" "0" "-A" "-S" "-T" "--no-global-tags" "--no-chapters" "(" "%%~ni.h264" ")" ^
    7. "--forced-track" "0:no" "-a" "0" "-D" "-S" "-T" "--no-global-tags" "--no-chapters" "(" "%%~ni.mp3" ")" ^
    8. "--track-order" "0:0,1:0,2:0"


    Das ganze wird am Ende aber abgebrochen, weil das System die Anweisungen nicht versteht, es setzt also jede Zeile als eine eigene Eingabe um.


    Hat evt. jemand schon Erfahrungen damit und weiß wie ich das ganze beheben kann? Bei einem Clip mit 2 Ton- und zwei Untertitelspuren kann die ganze Anweisung in einer Zeile recht unübersichtlich werden - wenn dann da noch was geändert werden muss.....



    Besten dank schon mal


    Lapje

  • Ist das in einer FOR-Schleife? Paß auf, daß Du alle nötigen Zeichen escapest.
    Runde Klammern kannst Du häufig auch ganz weglassen oder mit Gleichheitszeichen arbeiten:
    "--default-duration" "0:24000/1001p" "-d" "0" "-A" "-S" "-T" "--no-global-tags" "--no-chapters" = "%%~ni.h264" ^
    "--forced-track" "0:no" "-a" "0" "-D" "-S" "-T" "--no-global-tags" "--no-chapters" = "%%~ni.mp3" ^

  • Du hast hier jedemenge Strings die du mit " kennzeichnest.


    Damit das alles in eine Zeile geht macht man folgendes in der Batch:


    Code
    1. "String1" ^"String2^" ^"String3^" ^usw...


    Bei dir müsste das so aussehen dann:

    Code
    1. "C:\Programme\MKVtoolnix\mkvmerge.exe" ^
    2. -o "%%~ni.mkv" ^
    3. "--default-track" "0:no^" ^
    4. "--forced-track" "0:no^" ^
    5. "--display-dimensions" "0:1920x1080^" ^
    6. "--default-duration" "0:24000/1001p" "-d" "0" "-A" "-S" "-T" "--no-global-tags" "--no-chapters" "(" "%%~ni.h264" ")^" ^
    7. "--forced-track" "0:no" "-a" "0" "-D" "-S" "-T" "--no-global-tags" "--no-chapters" "(" "%%~ni.mp3" ")^" ^
    8. "--track-order" "0:0,1:0,2:0^"
  • So, ich habs mal bei einem aktuellen Video so umgesetzt:


    Code
    1. "C:\Program Files (x86)\MKVtoolnix\mkvmerge.exe" -o "%ziel%\%%~ni.mkv" "--language" "0:ger" "--track-name" "(" "0:%%~ni" "^)" ^
    2. "--display-dimensions" "0:1920x1080" "--default-duration" "0:24000/1001p" "--compression" "0:none" "(" "%%~ni.h264" "^)" ^
    3. "--language" "0:ger" "--track-name" "0:%%~ni Ger" "--compression" "0:none" "(" "%%~ni_ger.ac3" "^)" ^
    4. "--language" "0:eng" "--track-name" "0:%%~ni Eng" "--compression" "0:none" "(" "%%~ni_eng.dts" "^)" ^
    5. "--language" "0:ger" "--track-name" "0:%%~ni Ger" "%%~ni_ger_forced.srt" "--sub-charset" "0:UTF-8" "--forced-track" "0:yes" ^
    6. "--language" "0:eng" "--track-name" "0:%%~ni Eng" "%%~ni_eng.srt" "--sub-charset" "0:UTF-8" "--forced-track" "0:no" ^
    7. "--track-order" "0:0,1:0,2:0,3:0,4:0,5:0"


    Trotzdem scheint mkvmerge den Zeilenumbruch nicht zu erkennen, denn ich bekomme mehrfach die Meldung


    Zitat

    "Der Befehl ""--language"" ist entweder falsch geschrieben oder konnte nicht gefunden werden."


    Also sieht er nach wie vor jede Zeile wie eine Eingabe an...


    Selur :
    Ich verstehe den besseren Nutzen von den Dateien nicht so wirklich. Für mich ist das ganze noch unübersichtlicher als bei mir. Hier muss ich nur für jede nicht vorhandene Ton- spur oder Untertitelspur eine Zeile löschen. Bei den Dateien muss ich schon genauer hinschauen...

  • Wenn du eine komplette Befehlszeile zusammenbaust, muss sich der Kommandozeilen-Interpreter (cmd) damit beschäftigen, und der unterstützt nur eine begrenzte Länge für die gesamte Befehlszeile.


    Speicherst du die Optionen in einer Optionsdatei, dann ist die Kommandozeile kurz, und allen mkvmerge ist verantwortlich für ihre Auswertung. Außerdem hast du die Sicherheit, dass da keiner Anführungszeichen aus Versehen doppelt oder zu wenig interpretiert. Sie ist nur leider sehr lang, weil alles in jeweils einer neuen Zeile stehen muss.

  • Besteht denn in dieser zumindest die Möglichkeit das ganze ein wenig mit Kommentaren übersichtlicher zu gestalten?


    Zur Batch: Alles in einer Reihe ist kein Problem, da fuktioniert das alles bestens, nur genauso unübersichtlich wie in der zusätzlichen Datei


    Aktuell hab ich im "Rohling" die Anweisungen auch jeweils in einer Zeile, passe die an und ziehe die zu einer Zeile zusammen...das wollte ich mir ersparen...

  • Lass dir die Optionsdatei doch einfach von der Batchdatei erstellen.
    Halt in Kombination.


    Mit


    Code
    1. Echo ...text bla bli blub... > options
    2. Echo ...blu bli bla... >> options
    3. usw


    legste dir das Optionsfile erst an Zeile für Zeile. Kann sogar etwas dynamisch sein durch Batch Inputs.
    Das Optionsfile sollteste so aufbauen das es deinen Erwartungen entspricht dann.


    Und dann kannste in der selben Batchdatei den Aufruf von MKVMerge machen mit samt dem neu erstellten Optionfile.
    Nach Abarbeiten kannste die Optionfile ja wieder löschen.


    Ist quasi nix anderes. Nur anders realisiert und müsste alles im Bereich liegen wo es erlaubt ist. ^^

  • OK, ich hab jetzt, ehrlich gesagt, keine Ahnung was Du meinst...^^


    Soweit kenne ich mich in der Materie auch nicht aus...


    ist das sowas wie bei manchen PRogrammiersprachen wenn ich was in eine Text-Datei schreiben will?

  • Ähnlich, ja. Erinnert mehr an Basic das ganze ^^


    Als Beispiel mal:

    Code
    1. @echo offecho -o > option.txtecho c:\\Matroska\\my file.mkv >> option.txtecho --title >> option.txtecho \h264 >> option.txtecho -A >> option.txtecho a movie.avi >> option.txtecho sound.ogg >> option.txtMKVMerge @options.txt


    Erst wird das Optionfile erzeugt, dann ausgeführt.
    Beachte das im Optionfile die Ordnertrennung via \\ geschieht und nicht via \ wie üblich.


    Wenn du vorhast Videos einfach auf die Batch zu ziehen und diese dann das Video als Input nehmen soll, musst du unbedingt drauf achten das du A) einen String daraus machst um Leerzeichen innerhalb des Pfades + Datei zu vermeiden als Optionen erkannt zu werden.
    Also nicht so:
    C:\Program files\Mein Video.avi


    sondern so:
    "C:\Program files\Mein Video.avi"


    B) in der Optionfile musst du drauf auchten das du \\ hast bei der Pfadangabe und kein nomales \
    Das heißt das du das auch noch umändern müsstest.


    Für gewöhnlich lässt sich das via A und B zusammen lösen


    Um aus etwas normale Strings zu machen schreibt man in der Batch:

    Code
    1. set _input_=%1for /f "useback tokens=*" %%a in ('%_input_%') do set _input_=%%~a


    Und hat somit als _input_ die " Zeichen vorn und hinten.


    Danach kann man die \ Zeichen in \\ Zeichen wandeln und in eine neue Variable stecken. Die Variable mit dem \\ Zeichen wird dann im Optionfile benötigt.
    Sieht dann so aus:

    Code
    1. set _input2_=%_input_:\=\\%


    Zusammen sieht das ganze dann so aus als Beispiel mal:

  • Ach du heilige ....... ^^


    Mmmhhh...also bedeutet das, dass die Datei quasi sequenziell mit neuen Daten beschrieben wird? Also quasi die eine Anweisung wird an der anderen angehängt?


    Ich werd das sicherlich mal ausprobieren, denke dass die "Technik" bei anderen Dingen hilfreich sein kann...aber ich frage mich ob das für meine Aufgabe nicht schon wenig zu viel ist...???


  • Mmmhhh...also bedeutet das, dass die Datei quasi sequenziell mit neuen Daten beschrieben wird? Also quasi die eine Anweisung wird an der anderen angehängt?


    Deswegen nennt man es auch Batch Datei oder auf Deutsch Stapelverarbeitungsdatei wo alles nacheinander abgearbeitet wird und auch übergeben werden kann wenn nötig.


    Alles was du benötigst um mit Batch sehr gut zu arbeiten ist jegliche Form der Stringänderung. So wie ich es in meinem Beitrag schon mit dem " und \ -> \\ gemacht habe ^^
    Zahlen oder Aufrufe von Programmen mit Parametern sind das geringste Problem bei Batch ^^


    Wichtig sind in einer Batch auch: Abfragen von Variablen, Sprungmarken und andere tolle Sachen.


    Auch wenn man mit Batch sehr viel machen kann, ist man denoch recht eingeschränkt. Zum einen steht einen nicht der komplette ASCII Zeichensatz zur Verfügung. Und unter der Voraussicht das die Batch unter Windows läuft, sogar noch weniger da sich nur der Zeichensatz zwischen Windows und DOS Commandline von 32 - 127 gleicht. Das sind alle Buchstaben, Zahlen und Standard Sonderzeichen wie man sie auf jeder Tastatur finden wird.


    Man ist halt schon sehr eingegrenzt bei Batch. Für schnelle und vereinfachte Routinen aber dennoch sehr praktisch wenn man weiß wie es geht ^^

  • ich sehe den Vorteil bei meiner Methode gerade in der Verarbeitung von mehreren Files auf einmal...Batch angeworfen, der Rest geht in den meisten Fällen automatisch - wenn ich mit StaxRip oder so das ganze machen wollte müsste ich immer wieder auf bestimmte Abschnitte warten, z.B. nach dem Indexieren die eigentlichen Kodiereinstellungen setzen. Hier läuft schön alles von alleine ab und am Ende kommt das fertige Stück raus - vom demuxen übers Indexieren und kodieren bis zum muxen. Sehr praktisch wenn hier mal wieder 20 Sat-Aufnahmen liegen oder so...


    Das mit dem Zeichensatz kenne ich, die Batch hat ja schon Probleme mit Umlauten.

  • Scheint tatsächlich irgendwas mit den Anführungszeichen zu tun zu haben:

    Code
    1. for %%i in (*.mkv) do "C:\Program Files (x86)\MKVtoolnix\mkvmerge.exe" -o "ziel\%%~ni.mkv" --language 0:ger --track-name "0:%%~ni" ^
    2. --display-dimensions 0:1920x1080 --default-duration 0:24000/1001p --compression 0:none = "%%~ni.h264" ^
    3. --language 0:ger --track-name "0:%%~ni Ger" --compression 0:none = "%%~ni_ger.ac3" ^
    4. --language 0:eng --track-name "0:%%~ni Eng" --compression 0:none = "%%~ni_eng.dts" ^
    5. --language 0:ger --track-name "0:%%~ni Ger" = "%%~ni_ger_forced.srt" --sub-charset 0:UTF-8 --forced-track 0:yes ^
    6. --language 0:eng --track-name "0:%%~ni Eng" = "%%~ni_eng.srt" --sub-charset 0:UTF-8 --forced-track 0:no ^
    7. --track-order 0:0,1:0,2:0,3:0,4:0,5:0
  • Hat das denn bei Dir so funktioniert?


    Hab das nun so für meine Bedürfnisse erweitert:



    Dabei bekomme ich dann aber diese Fehlermeldung:


    Zitat

    Fehler: 'ger --track-name 0:Die' ist weder ein gültiger ISO639-2- noch ein gültiger ISO639-1-Code. Mit 'mkvmerge --list-languages' können Sie sich eine Liste aller Sprachen und ihrer ISO639-2-Codes ausgeben lassen.
    Der Befehl "--language" ist entweder falsch geschrieben oderkonnte nicht gefunden werden.Der Befehl "--track-order" ist entweder falsch geschrieben oder konnte nicht gefunden werden.


    Anscheinend wird auch der Filename nicht wirklich darin eingebaut...


    Die Kommandozeile hab ich übrigens - von den Sachen für die Batch mal abgesehen - so von mkvmerge bekommen, sammt der Anführungszeichen...

  • Du hast in der vor- sowie drittletzten Teile jeweils ein Anführungszeichen vor 0:ger/0:eng, aber nicht danach. Die Klammern der FOR-Schleife habe ich weggelassen, da ja eh alles in eine Zeile soll.


    Die Kommandozeile hab ich übrigens - von den Sachen für die Batch mal abgesehen - so von mkvmerge bekommen, sammt der Anführungszeichen...


    mkvmerge kann nun auch nichts für die ganzen Sonderheiten von Windows...

  • U.a. die "--forced-track"s in den letzten Zeilen gehören vor die Input-Dateinamen, nicht dahinter. Immer zuerst alle Optionen, dann die dazugehörigen Inputdateien.
    mkvmerge [global options] {-o out} [options1] {file1} [[options2] {file2}]