"Variable" für Input bei mkvmerge und mkvpropedit

  • Hallo,

    weiß nicht ob der Titel in etwa beschreibt was ich möchte: Manchmal muss ich eine leere UT-Spur in eine mkv einfügen, weil mein Player Forced-Flags ignoriert. Das klappt mit dieser Kommendozeile (enthät auch schon die Angaben für die richtige Reihenfolge, denn die Leerspur muss auch die erste UT-Spur sein; alle Angaben für Sprache stehen schon in der mks)

    Code
    mkvmerge.exe [B][color=blue]01[/color][/B].mkv ut.mks --track-order 0:1,0:2,1:1,0:3,0:4,0:5,0:6 -o [B][color=blue]01[/color][/B]-neu.mkv

    Anstelle des fettgedruckten 01 würde ich aber gerne eine "Variable" einsetzen, welche das mit ALLEN mkv im Ordner macht. Wenn da also 01 - 05.mkv sind, habe ich am Ende 01 - 05-neu.mkv, welche zusammen mit der ut.mks gemuxt wurden.

    Hoffe das geht diesmal ohne wieder ein Skript zu schreiben.

    Einmal editiert, zuletzt von LigH (14. Februar 2010 um 17:43)

  • Weil man das Fettgedruckte nicht so einfach gesehen hat, hab ich's mal blau eingefärbt.

    Schleifen mit FOR haben Variablen; man muss dann bloß den Inhalt der Variablen sinnvoll definieren ... und das geht nur mit genug Erfahrung, FOR bietet wahnsinnig viele Optionen.

    Voraussetzung: Es existieren nur diejenigen MKV-Dateien in diesem Verzeichnis, die interessant sind, und die haben auch nur zwei Ziffern als Dateiname.

    Code
    for %N in (??.mkv) do mkvmerge.exe %N.mkv ut.mks --track-order 0:1,0:2,1:1,0:3,0:4,0:5,0:6 -o %~nN-neu.mkv

    "%~nN" = "der Dateinamen-Anteil (~n) von %N".

  • Ich kann es gerade nicht testen. Im Grunde sollen schon nur die zu bearbeitenden Dateien im Verzeichnis stecken.

    Kann man die Option dahingehend ändern, dass alle mkv im Ordner unabhängig von der Zeichenlänge bearbeitet werden? Was müsste man denn z. B. für 4 Zeichen ändern?

    Kann man auch bestimmte Dateien (gleichen Namens) als Input wählen, die in Unterverzeichnissen liegen, z. B. alle 01.mkv in allen Unterverzeichnissen der Ordners e:\ordner?

    Einmal editiert, zuletzt von Habanero (15. Februar 2010 um 19:47)

  • "?" ist der Platzhalter für "genau ein Zeichen".
    "*" ist der Platzhalter für "beliebig viele Zeichen".

    Und das mindestens schon seit CP/M (Vorgänger von MS-DOS), noch bevor es IBM-kompatible PCs gab.

    Entsprechende Beispiele sollten einem in der Betriebssystem-Hilfe für den CMD-Befehl "for" (F1; Suchen [ for ]) schon aufgefallen sein (wenn man die gelesen haben sollte).
    __

    Unterverzeichnisse können mit FOR eventuell auch verarbeitet werden, wenn man als Gruppe die Ausgabe des Befehls "dir /s" verwendet, das ist allerdings schon etwas komplizierter, denn das Ergebnis soll ja vermutlich in das selbe Verzeichnis?

    Wir brauchen also:

    - for /F (damit wir das Ergebnis des dir-Befehls auswerten können)
    - dir /s /b (damit wir ausschließlich nur die Liste der Dateinamen in allen Unterverzeichnissen erhalten)
    - %~dN als Laufwerksbuchstabe, %~pN als Verzeichnis und %~nN als Dateiname

    Code
    for /F %N in ('dir /s /b E:\ordner\01.mkv') do mkvmerge.exe "%~fN.mkv" ut.mks --track-order 0:1,0:2,1:1,0:3,0:4,0:5,0:6 -o "%~dN%~pN%~nN-neu.mkv"
  • Die erste Zeile musste ich geringfügig anpassen

    Code
    for %N in (??.mkv) do mkvmerge.exe %N[B].mkv[/B] ut.mks --track-order 0:1,0:2,1:1,0:3,0:4,0:5,0:6 -o %~nN-neu.mkv
    Code
    for %N in (??.mkv) do mkvmerge.exe %N ut.mks --track-order 0:1,0:2,1:1,0:3,0:4,0:5,0:6 -o %~nN-neu.mkv

    Er suchte sonst eine Datei mit 2 Dateiendungen (01.mkv.mkv). Jetzt läuft es.

    Beim zweiten bekomme ich die Meldung, dass er die Datei ncht findet. Ich muss hier später mal gucken, ob ich vielleicht den Pfad falsch angepasst habe.

    Wäre es nicht einfacher, wenn man eine gespeicherte Batch-Datei (z. B. die erste Zeile) wiederum von einer zweiten Kommandozeile so aufrufen lässt, dass diese auf alle Unterordner angewendet wird? Angenommen ich will alle ??.mkv (01.mkv, 02.mkv, ...) in den Unterverzeichnissen mit der ut.mks zusammen muxen (man müsste hier nur den Pfad zur ut.mks angeben, falls diese nicht ohnehin in den Unterordnern liegt).

    Was die Ausgabe der zweiten Zeile angeht: Da ich hier Outputs anderer Programme weiterbearbeiten möchte wäre es günstig wenn die neuen mkv entweder im gleichen Verzeichnis verbleiben - teilweise haben die den gleichen Dateinamen und würden sich gegenseitig überschreiben.

  • 1) Stimmt, hab ich beim Abschreiben übersehen.

    2) Wenn du nach "do " noch ein "echo " schreibst, dann zeigt dir die FOR-Schleife erst mal bloß an, welche Befehle sie ausführen würde. Hilft beim Debugging.

    3) In Batch-Dateien muss man für FOR-Variablen doppelte % verwenden. Und für eine Batch-Datei sehe ich erst mal noch nicht viel Verbesserungspotenzial, denn gerade die FOR-Schleife würde in der Batch nichts nützen, der DIR-Befehl muss in der FOR-Gruppe ausgeführt werden (man könnte zur Not die Liste der gefundenen MKV-Dateien als Datei zwischenspeichern, und diese dann in der FOR-/F-Schleife auswerten); nützlich wäre eine Batch-Datei höchstens in der Schleife, also nach dem "DO". Man müsste bei "FOR /F" vielleicht auf die Option "usebackq" achten; wenn man die "Backquotes" (`) nicht nutzt, dann muss der DIR-Befehl mit "Single Quotes" (') = Apostrophen umhüllt sein - auf der deutschen Tastatur: Umschalt+#. Forward-Quotes (´) - links neben der Rückschritt-Taste - funktionieren nicht.

  • Ich weiß gard nicht was jetzt abgeht. Plötzlich bekomme ich beim 1. Skript diese Meldung:

    Zitat

    Die folgende Verwendung des Pfadoperators zur Ersetzung eines Batchparameters ist ungültig: %~nN-neu.mkv

    Da ist nichts anders als vorher. Beim zweiten Skript kommt die gleiche Meldung.

    Das mit den Unterordner hatte ich auch noch mit Hinblick auf ein anderes Programm gefragt (ich hatte etwas gehofft das dann selber anpassen zu können). Ich demuxe zuerst von DVD mit makemkv (bzw. makemkvcon, der CLI-Version) mit dieser Kommandozeile

    Code
    makemkvcon.exe mkv file:"E:\pfad\01" 0 "E:"

    MakeMKV öffnet im Ordner 01 die Datei VIDEO_TS.IFO und demuxt dort den Title 0 in den Ordner E:. Den Namen der Ausgabedatei kann man hier nicht ändern, daher wäre es wichtig, dass Output entweder in einen eigenen Ordner oder in den Ordner der Input-Datei erfolgt. Man müsste hier anstelle des 01 eine Variable einsetzen, dass er das für alle Unterordner von von "pfad" macht. Anstelle von E: müsste gesetzt werden, dass er die Ausgabedatei ins gleiche Verzeichnis wie Input schreibt.

    Einmal editiert, zuletzt von Habanero (16. Februar 2010 um 18:07)

  • Vielleicht guck ich ja falsch. Hier nochmal die komplette Fehlermeldung:

    Zitat

    Die folgende Verwendung des Pfadoperators zur Ersetzung eines Batchparameters ist ungültig: %~nN-neu.mkv

    Geben Sie CALL /? oder FOR /? ein, um herauszufinden, welche Formate gültig
    sind.
    "skript.bat" ist syntaktisch an dieser Stelle nicht verarbeitbar.

    E:\pfad>for N ut.mks --track-order 0:1,0:2,1:1,0:3,0:4,0:5,0:6 -o 0:1,0:2,1:1,0:3,0:4,0:5,0:6 -o %~nN-neu.mkv

    Was soll denn hier die Zeile, die hat doch nichts mit dem Skript zu tun, was in der Batch-Datei steht. Das sieht so aus (siehe auch oben):

    Code
    for %N in (??.mkv) do mkvmerge.exe %N ut.mks --track-order 0:1,0:2,1:1,0:3,0:4,0:5,0:6 -o %~nN-neu.mkv

    Führe ich die Zeile direkt in der Eingabeaufforderung mit kompletten Pfadangaben aus, läufts.

    Einmal editiert, zuletzt von Habanero (16. Februar 2010 um 21:06)

  • Wie bereits gesagt:

    Wenn du eine FOR-Schleife innerhalb einer Batch-Datei ausführst, dann muss das Prozentzeichen verdoppelt werden. Und zwar überall, wo diese Variable verwendet wird. Also sowohl bei "for %%N in ..." als auch bei "... -o %%~nN-neu.mkv".

    Steht so auch in der Dokumentation des FOR-Befehls.

  • Ja, hatte ich zwar gelesen, aber nicht wirklich verstanden, jetzt gehts wieder. Wobei ich trotzdem der Meinung bin, meinen ersten Test mit der Zeile aus einer Batch-Datei gemacht zu haben (mit 1x %) und das lief trotzdem.

    Die Dokumentation zu FOR hab ich mir mal angesehen, mir fehlen da wohl aber ein paar Grundlagen zu allgemeinen Systematik für Batch-Dateien. Muss mal gucken ob ich da bei google was finde.

    Kann man sowas auch für die o.g. Zeile mit makemkv erstellen, was sich ja nicht direkt auf Dateien sondern nur auf Ordner bezieht? Der Name der Ausgabedatei ist fix, hier müsste man entweder festlegen, dass in den Input-Ordner oder in einen automatisch anzulegenden Ordner zu speichern ist. Beides sollte aber auf das gleiche hinauslaufen.

    edit
    Den Platzhalter '?' anstelle eines Punktes zu setzen geht scheinbar nicht? ich hatte eine Datei 01.1.mkv welche bei der Eingabe von '????.mkv' ignoriert wurde. Mit ??.?.mkv wird die Datei bearbeitet.

    Einmal editiert, zuletzt von Habanero (17. Februar 2010 um 16:51)

  • Hab jetzt auch mal das zweite Skript versuchen können. Hier bekomme ich die Meldung, dass das System die Datei nicht finden konnte.

    Ich habe zu Testzwecken ein paar mkv auf 2 Unterordner verteilt. Die Dateien heißen 01.mkv - 04.mkv, sollte also passen.

  • Listet der "dir"-Befehl (das war das "zweite Skript", oder?) alleine erst mal die Dateien auf?

    Falls bei dir "usebackq" aktiv ist, klappt es mit Rückwärts-Akzenten statt Apostrophen? Und auf "FOR /F" achten!

    Am besten bitte noch mal alles ausführlich zusammenfassen. Nicht dass wir schon anfangen, aneinander vorbeizureden.

  • Der DIR-Befehl alleine listet alle Dateien des Ordners auf.

    Ich habe dieses Skript versucht

    Code
    for /F %%N in ('dir /s /b E:\xDaten von F\Viv Thomas\Neuer Ordner\01.mkv') do mkvmerge.exe "%%~fN.mkv" ut.mks --track-order 0:1,0:2,1:1,0:3,0:4,0:5,0:6 -o "%%~dN%%~pN%%~nN-neu.mkv"

    Wie von dir beschrieben, nur alles mit 2x%, da es in einer Batch-Datei steht. Ich erhalte beim starten die Meldung, dass die Datei nicht gefunden wurde.

    Was ist denn ein Rückwärts-Akzent? Bei google kam ich auf eine Seite für Tanzschritte :D

    @ MegaDeath

    Guck ich mir mal an.

  • :wall: Wer Pfade mit Leerzeichen hat, der muss natürlich den Dateinamen von doppelten Anführungszeichen umschließen!

    Ohne Anführungszeichen interpretiert der Kommandointerpreter deine Angabe wie folgt:

    Code
    [b][color=green]dir /s /b E:\xDaten[/color][/b] [color=red]von F\Viv Thomas\Neuer Ordner\01.mkv[/color]


    Alles das, was rot ist, wird er also nicht mehr verstehen, weil es für ihn nicht mehr zum Dateinamen gehört.
    __

    Und was die Akzente angeht ...

    Rechts neben der Taste [ß\?] hast du auf der deutschen Tastatur die Taste [´ `]; ohne Umschalttaste erzeugt der den Vorwärts-Akzent (französisch: accent aigu), mit Umschalttaste den Rückwärts-Akzent (französisch: accent grave) - bei folgenden Vokalen über diesem Buchstaben, bei folgender Leertaste aber auch als eigenständiges Zeichen.

    Wikipedia: Akzent (Schrift)

    Dagegen gibt es rechts neben der Taste [Ä] die Taste [# ']. Die erzeugt mit Umschalttaste den Apostroph, auch als "einfaches Anführungszeichen" verwendet.

    Diese gilt es nun peinlich genau auseinanderzuhalten, denn ein Kommandointerpreter unterscheidet sehr wohl, ob man 'einfache' oder "doppelte" Anführungszeichen bzw. ´vorwärts´ oder `rückwärts` gerichtete Akzente benutzt, um Konstrukte mit Leerzeichen zusammenzufassen.

Jetzt mitmachen!

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