Mehrere Dateien durch ziehen auf eine Batchdatei verarbeiten

Mr. Brooks

Lt. Commander
Registriert
Aug. 2011
Beiträge
1.441
Hallo,

ich habe mir hier eine Batchdatei erstellt mit der ich durch drüberziehen über die Batchdatei Untertitelformate (von sup zu idx/sub) ändern kann. Das geht leider nur mit je einer Datei auf einmal. Ist es möglich, dass das auch mit beliebig vielen Dateien geht?

Das ganze sieht so aus:

Code:
bdsup2sub --resolution 720 -o "%~dpn1.idx" %1

Hier http://www.gutefrage.net/frage/letzter-schliff-fuer-eine-bat-datei- wurde genau das gefragt, aber m. M. nach nur die "Eine-Datei-Variante" erklärt. Der Fragende hakte auch nicht nach. Bei mir geht es immer nur mit einer der Dateien, die verarbeitet werden sollen. Ist es möglich das auf beliebig viele auszudehnen?

Mr. Brooks
 
Du mußt eine Schleife drumrumbauen:

Code:
@ECHO OFF
:Loop
IF "%1"=="" GOTO Continue
bdsup2sub --resolution 720 -o "%~dpn1.idx" %1
SHIFT
GOTO Loop
:Continue
pause
 
Das geht leider nicht. Ich kann auch keine Fehlermeldung posten da das Fenster gleich wieder wge ist, auch wenn ich am Ende "Pause" stehen lasse.
 
Mit %2, %3 usw. kriegst du die zweite und dritte Datei.
Ich weiß grade nicht, ob man die Anzahl der Argumente abfragen kann, falls nicht kannst du aber immer noch einfach mal bis %10 oder so gehen. Bei weniger Dateien, werden dann eben die restlichen leeren Argumente verworfen.
Oder halt jedesmal eine IF-Abfrage machen.

Edit: Es geht nur bis zu 9 Argumenten, also %9.
Code:
@echo off
IF /I "%~1" neq "" echo %1
IF /I "%~2" neq "" echo %2
IF /I "%~3" neq "" echo %3
IF /I "%~4" neq "" echo %4
IF /I "%~5" neq "" echo %5
IF /I "%~6" neq "" echo %6
IF /I "%~7" neq "" echo %7
IF /I "%~8" neq "" echo %8
IF /I "%~9" neq "" echo %9
pause

Edit2: Die Lösung von miac ist eigentlich besser. Dass das Fenster verschwindet liegt an den Anführungszeichen, die automatisch um den Dateipfad gelegt werden, wenn da ein Leerzeichen drin ist. Einfach
IF "%1"=="" GOTO Continue
in
IF "%~1"=="" GOTO Continue
ändern und es sollte laufen.
 
Zuletzt bearbeitet:
Code:
@ECHO OFF
:Loop
IF "%[B]~[/B]1"=="" GOTO Continue
IF /I "%~1" neq "" echo %1
bdsup2sub --resolution 720 -o "%~dpn1.idx" %1
SHIFT
GOTO Loop
:Continue
pause

So geht es mit beliebig vielen Dateien (auch ohne die Zeile 2). Mit der Zeile 2 (und %~1 statt %1) geht es. Komishc ist hier, dass das Skript endlos weiter läuft wenn alle Dateien durch sind ohne etwas zu konvertieren, wenn ich in Zeile 2 statt %~1 %1 verwende. Mir ist hier nicht klar wieso.

Was macht denn "/I" aus deinem Skript? Das habe ich nicht herausbekommen.
 
Ignoriert Groß-/Kleinschreibung. Ist mir eigentlich auch schleierhaft, warum ich das mit reingeschrieben habe. War halt in der cmd-Hilfe von if drin. Kann man weglassen.
 
Ich hab mir jetzt einige meiner Basisskripte für Untetritel-, Video- und Audioendocings entsprechend angelegt. Jedesmal ist aber immer nur eine Datei je Zeile der Input. Ich kann schon mehrere drauf ziehen und die werden alle bearbeitet, aber jede ist EIN Input und EIN Output. Ich würde jetzt gern für eine ganz bestimmte Konstellation das gleiche für MKVMerge machen. Problem: hier hätte ich dann für eine Befehlszeile 2 Inputs, einmal eine Videodatei als *.mkv und dann eine Audiodatei als *.m4a.

Wie sage ich den Programm jetzt, dass wenn ich z. B. 4 Dateien auf die Batch ziehe welche zusammen gehören. Sagen wir einmal ich habe 01.mkv 02.mkv 01.m4a und 02.m4a. Ich will die beiden 01er als 01-neu.mkv und die 02er als 02-neu.mkv muxen. Geht sowas oder ist das scho sehr hoher Aufwand?
 
Du müsstest für jede Datei in einer Schleife durchgehen, ob eine passende Datei mit demselben Namen (?) aber anderer Dateiendung angegeben wurde.
Falls die Zuordnung allerdings sowieso ausschließlich über den Dateinamen erfolgt (anders wird bei mehreren Videos auf einmal auch wieder schwierig) und falls die .m4a- und .mkv-Dateien immer im selben Verzeichnis liegen könntest du auch einfach nur die mkv-Dateien als Argument angeben und dazu die passenden Audiodateien aus dem selben Verzeichnis holen.
Das funktioniert natürlich nicht, wenn die Audiodateien nicht im selben Verzeichnis wie die jeweilige mkv liegen.

Der andere Weg, alle Inputargumente durchzugehen, ist bestimmt auch machbar, wird aber wahrscheinlich in Batch ein paar Zeilen mehr ergeben als in anderen Skript-/Programmiersprachen.
 
Ich hab das ganze jetzt so halbwegs hinbekommen
Code:
@ECHO OFF
:Loop
IF "%~1"=="" GOTO Continue
IF "%~1.mkv" neq "" echo %1
IF "%~2.m4a" neq "" echo %2
mkvmerge.exe --ui-language de --output "%~dpn1_neu.mkv" --language 0:eng --default-track 0:yes ( "%1" ) --language 0:und ( "%2" ) --track-order 0:0,1:0
SHIFT
GOTO Loop
:Continue

Es wird aber die Reihenfolge der Inputdateien vertauscht, je nachdem auf welche Inputdatei ich klicke. Wenn ich also die mkv und die m4a markiere, aber mit dem Mauszeigen beim Verschieben auf die m4a klicke, wird die m4a VOR der mkv gemuxt. Klicke ich auf die mkv ist es anders herum. Ich habe doch aber in den IF-Abfragen eingeschrieben, dass wenn input1 die Endung *.mkv hat, das die Variable %1 ist und %1 soll an Position 1 gemuxt werden. Ich verstehe nicht wieso er es manchmal vertauscht.
 

Ähnliche Themen

Zurück
Oben