Ich möchte im Prinzip das gleiche machen, in meinem Fall aus mkv-Dateien (Matroska) die Tonspur mittels mkvextract extrahieren, so dass aus einer markierten Datei "video007.mkv" dann z.B. "video007.mkv track1.ogg" wird.
Das Skript rufe ich wie gehabt mit "%F "%P"" auf.
So weit so gut, nur gibt es das alte Problem dass deutsche Umlaute bzw. alle nicht der System-Codepage entsprechenden ANSI-Zeichen Müll produzieren. Die cmd.exe ist idiotischerweise immer noch ASCII/OEM-bezogen, was in diesem Fall alles andere als nützlich ist.
Ich habe jetzt drei Möglichkeiten ausgemacht:
1. %d im TC-Aufruf nehmen - schön und gut, ich will aber lange Dateinamen behalten
2. %F behalten und die erzeugte Listendatei in der ersten Zeile des Skripts in ASCII/OEM konvertieren. Ein kleines aber feines Programm dafür wäre z.B. txtcnv32. Klappt im Prinzip mit deutschen Umlauten, aber bei fremdem System-Zeichensatz bzw. exotischen Zeichen im Dateinamen dürfte das mit Sicherheit wieder Probleme geben. Deshalb:
3. Die wahrscheinlich sinnvollste Möglichkeit wäre UTF-8. Ich kann die cmd.exe UTF-8-fähig machen indem ich chcp 65001 benutzte, dafür benutze ich dann als Aufruf "%UF "%P"".
Würde klappen, nur leider stört in dem Fall die BOM die TC ausgibt, die erste Datei wird dann immer ignoriert.
Ich habe mir jetzt selber ein Programm kompiliert das die BOM entfernt wenn sie gefunden wird, dann ist alles wunderbar.
Deshalb die Frage:
Gibt es eine Möglichkeit TC zum weglassen der BOM bei einer Listendatei zu überreden? Wenn nein würde ich direkt den Antrag stellen diese Option in einer der nächsten Versionen hinzuzufügen

Bis dahin, kennt vielleicht jemand ein kleines Tool um die BOM manuell zu entfernen. Mein Programm funktioniert zwar, bleibt aber trotzdem eine Flickenlösung. Ich kenne zwar libiconv, bekomme es aber einfach nicht für meine Zwecke zum laufen uns ist viel zu kompliziert zu steuern.
Hier noch mein Code:
Code: Select all
@echo off
chcp 65001
ansi2utf8.exe "%~1" -bom
if -%2==- echo First parameter must be filelist path, second source path. && pause && goto :EOF
for /F "usebackq delims=" %%f in ("%~1") do (
"D:\tools\mkvtools\mkvextract.exe" tracks "%~2%%f" 2:"%~2%%f track1.ogg"
)
pause
cls