For-Schleife in Batchdatei wird immer zweimal durchlafen...

mischaef

Kassettenkind
Teammitglied
Registriert
Aug. 2012
Beiträge
7.073
Hallo zusammen,

ich habe ein kleines Problem mit einer Batchdatei zur Videokonvertierung. Folgendes Szenario:

Ich muss bei einem Video die schwarzen Balken wegschneiden (croppen). Damit dies vernünftig funktioniert habe ich die Anweisung in einem Avisynth-Script geschrieben. Damit ich aber nicht für jedes File ein eigenes Script schreiben muss (der Name des zu kodierenden Files steht ja im Script), kam ich auf den Gedanken, dafür einen universellen Dateinamen zu verwenden (quellvideo.mkv).

Ohne Croppen werden in einer For-Schleife einfach Videofiles erfasst und nacheinander per Kommandozeile kodiert. Jetz wollte ich das so machen:

Alle Videofiles wie immer im Kopf der For-Schleife erfassen, das File in Quellvideo.mkv umbennen, es kodieren lassen und es am Ende wieder mit dem Originalen Namen zu versehen.

Das Problem dabei ist, dass die Schleife anscheinend für den ersten Lauf zweimal durchläuft (ist mir auch schon bei anderen Batch-Dateien aufgefallen). Was bedeutet, dass der Name der Datei am Anfang ausgelesen wird (xy.mkv), in Quellvideo.mkv umbenannt wird, aber die umbenannte Datei wird anscheinend auch wieder erfasst. am Ende wird die Variable in der For-Schleife (%%i) mit den Namen "Quelldatei" gefüllt, so dass ich die Datei am Ende nicht mehr zurückbennen kann, weil am Ende Quelldatei.mkv in Quelldatei.mkv umbenannt wird...ich hoffe das ist soweit verständlich..;-)

Ich habne auch schon versucht, den Namen in eine Variable zu speichern, was ja auch nichts bringt, da diese dann auch überschrieben wird...

Die Datei sieht jetzt so aus:

Code:
for %%i in (*.mkv) do (

ren "%%~ni.mkv" "Quellvideo.mkv"

"C:\Programme\StaxRip\Applications\AviSynth plugins\ffms2\ffmsindex.exe" "Quellvideo.mkv"

C:\Programme\StaxRip\Applications\x264\x264.exe --preset slow --tune film --profile high --level 4.1 --pass 1 --bitrate 4000 --stats "264.stats" --demuxer "ffms" --index "Quellvideo.mkv.ffindex" --output NUL "avi.avs"

C:\Programme\StaxRip\Applications\x264\x264.exe --preset slow --tune film --profile high --level 4.1 --pass 2 --bitrate 4000 --sar 1:1 --stats "264.stats" --demuxer "ffms" --index "Quellvideo.mkv.ffindex" --output "%%~ni.h264" "avi.avs"


rem ren "Quellvideo.mkv" "%%~ni.mkv"

)

Hat zufällig jemand eine Idee, wie ich Herr des Problems werden könnte?

Besten dank

Michael
 
Änder mal die Schleife in
Code:
for /F "delims=;" %%i in ('dir /B *.mkv') do (
um. Als Standardtrenner ist u.a. ein Leerzeichen gesetzt und sobald eine Datei ein Leerzeichen enthält, wird dieses in zwei Teile gesplittet (Dateiname: "test abc.mkv", erster Durchlauf "test", zweiter Durchlauf "abc.mkv").
 
schau dir mal den FOR-Befehl richtig an(For /?).

Code:
For /F "Tokens=* Delims=" %%i

In diesem Abschnitt weisen wir die For-Schleife an, jeden Schritt in der Klammeranweisung

Code:
 IN ('Dir /B *.mkv')

einzeln zu verarbeiten für die DO Befehle. "Tokens=* Delims=" sind wichtig, weil For sonst Leerzeichen als Trennzeichen verwendet. Aus einem Dateinamen wie "Meine Videodatei.mkv" würde nur "Meine" als Variable übernommen, "Tokens=*" erfasst den ganzen String, "Delims=" setzt die Trennzeichenfunktion ausser Kraft.
 
Ah, wieder was gelernt...

Aber wo wäre der Unterschied? In beiden Fällen würde ich doch den ganzen Dateinamen verwenden können, oder?

Oder gibt es Unterschiede in Hinsicht der späteren Verbarbeitung?
 
nun, der Unterschied wird erst klar, wenn man Tokens einsetzen muss. In deinem Fall frisst es kein Brot. ;-)

Wozu aber eine Umbenennung?
 
Weil ich das Video per avs-Script bearbeite...und da das zu jeder Kodierung aufgerufen werden muss und ich den Dateinamen nicht, zumindest mit meinen Kenntnissen, in der avs-Datei per Variable ändern kann, musste ich einen "Arbeitsdateinamen" verwenden. So wird vorher das zu kodierende File umbenannt, verarbeitet und wieder zurückbenannt. So kann ich in der avs-Datei aber immer einen Dateinamen verwenden...
 
Zurück
Oben