Batchdatei für Flac-Konvertierung aus Unterverzeichnissen...

mischaef

Kassettenkind
Teammitglied
Registriert
Aug. 2012
Beiträge
6.153
Nabend zusammen,

ich würde gerne über eine Batchdatei eine Flac-Kodierung anstoßen, welche auch Unterverzeichnisse mit einbezieht.

Der aktuelle Stand ist der hier:

Code:
for /f "delims=*" %%i in ('dir /b /s *.wav') do (

"C:\Program Files (x86)\Flac\flac.exe" --best --delete-input-file -w "%%~ni.wav"

)

Die Flac-Anweisung stimmt so, die hab ich in einer anderen Batch schon in Verwendung. Im aktuellen Fall erhalte ich aber immer die Meldung "ERROR: can't open input xyz.wav: No such file or directory". Der Dateiname wird richtig erkannt, also muss er ja die Unterordner durchgehen.

Hat jemand zufällig eine Idee was ich machen kann? Muss ich vielleicht irgendwo den Pfad zwischenspeichern?


Besten dank

Michael
 
Hast du dir mal angesehen, was du überhaupt übergibst?
Code:
"C:\Program Files (x86)\Flac\flac.exe" --best --delete-input-file -w "a.wav"
"C:\Program Files (x86)\Flac\flac.exe" --best --delete-input-file -w "b.wav"
"C:\Program Files (x86)\Flac\flac.exe" --best --delete-input-file -w "c.wav"
"C:\Program Files (x86)\Flac\flac.exe" --best --delete-input-file -w "d.wav"
"C:\Program Files (x86)\Flac\flac.exe" --best --delete-input-file -w "e.wav"
"C:\Program Files (x86)\Flac\flac.exe" --best --delete-input-file -w "f.wav"
Ist auch klar, warum er die Dateien nicht finden kann.
Code:
R:\TEST
│   a.wav
│   b.wav
│   n.bat
│
├───asd
│       c.wav
│
├───qwe
│   │   d.wav
│   │
│   └───rtz
│           e.wav
│
└───yxc
        f.wav
So wird eher ein Schuh draus:
Code:
"C:\Program Files (x86)\Flac\flac.exe" --best --delete-input-file -w "%%i"
Code:
"C:\Program Files (x86)\Flac\flac.exe" --best --delete-input-file -w "R:\test\a.wav"
"C:\Program Files (x86)\Flac\flac.exe" --best --delete-input-file -w "R:\test\b.wav"
"C:\Program Files (x86)\Flac\flac.exe" --best --delete-input-file -w "R:\test\asd\c.wav"
"C:\Program Files (x86)\Flac\flac.exe" --best --delete-input-file -w "R:\test\qwe\d.wav"
"C:\Program Files (x86)\Flac\flac.exe" --best --delete-input-file -w "R:\test\qwe\rtz\e.wav"
"C:\Program Files (x86)\Flac\flac.exe" --best --delete-input-file -w "R:\test\yxc\f.wav"
 
ok, ich habe bisher immer %%~ni genommen damit ich mit dem Dateinamen weiter arbeiten kann. So habe ich hier z.B. pk-Dateien von meinem Audioprogramm, welche ich in der gleichen Schleife gerne löschen möchte. Mit %%i ist das aber nicht möglich, da er dann nach xyz.wav.pk sucht, bei %%~ni hab ich das gleiche Problem wie oben.

Ich hab generell kein Problem damit zwei Schleifen ablaufen zu lassen, sauberer fände ich aber das ganze in einer Schleife zu machen - falls überhaupt möglich.

Generell funzt die Wandlung aber so, besten dank schon mal dafür.
 
Wenn du das weiterverarbeiten willst, dann knall oben ein setlocal enabledelayedexpansion rein und setz dann in der Schleife einfach eine Variable mit dessen Wert. Bzw. expandieren kannst du doch sowieso an jeder Stelle.
 
ich habe es jetzt so gelöst:

Code:
setlocal enabledelayedexpansion

for /f "delims=*" %%i in ('dir /b /s *.wav') do (

"C:\Program Files (x86)\Flac\flac.exe" --best --delete-input-file -w "%%~pi/%%~ni.wav"

del "%%~pi/%%~ni.pk"

)

Ist das so wie Du meinstest? Es funktioniert zumindest so...^^
 
Die Frage ist eher, wieso du solche komischen Konstrukte verwendest. dir /S /B liefert dir bereits den vollständigen Pfad, warum den Wert in Pfad (ohne Laufwerk!) und Namen trennen?
Code:
for /f "delims=*" %%i in ('dir /b /s *.wav') do (
	"C:\Program Files (x86)\Flac\flac.exe" --best --delete-input-file -w "%%i"
	del "%%i.pk"
)
setlocal benötigst du nur, wenn du Variablen in Schleifen setzen willst. Du brauchst in deinem Fall aber nirgendwo eine zweite Schleife oder Sonstiges, nicht mal Variablen o.ä. Die *.pk-Datei wird ja direkt neben der Wave liegen. Wieso wieder Pfad und Namen getrennt verwenden, obwohl genau dieser Wert doch bereits in %i enthalten ist?

Um dein Vorhaben mal ins Lächerliche zu ziehen und ich hoffe, dass du siehst, wieso ich darauf hinweisen will, dass es hirnrissig ist:
Code:
@echo off

chcp 65001 > nul

echo Parameter #1:             %1
echo Ohne Anführungszeichen:   %~1
echo voller Pfad:              %~f1
echo Laufwerk:                 %~d1
echo Pfad:                     %~p1
echo Dateiname ohne Extension: %~n1
echo Extension:                %~x1
echo 8.3 short names:          %~s1
echo Attribute:                %~a1
echo Datum/Zeit:               %~t1
echo Größe:                    %~z1
echo Laufwerk + Pfad:          %~dp1
echo Dateiname + Extension:    %~nx1
echo.
echo übergebener Pfad (1):     %~d1%~p1%~n1%~x1
echo übergebener Pfad (2):     %1

pause
Code:
Parameter #1:             "S:\Spiele\Steam\steamapps\common\Counter-Strike Global Offensive\csgo.exe"
Ohne Anführungszeichen:   S:\Spiele\Steam\steamapps\common\Counter-Strike Global Offensive\csgo.exe
voller Pfad:              S:\Spiele\Steam\steamapps\common\Counter-Strike Global Offensive\csgo.exe
Laufwerk:                 S:
Pfad:                     \Spiele\Steam\steamapps\common\Counter-Strike Global Offensive\
Dateiname ohne Extension: csgo
Extension:                .exe
8.3 short names:          S:\Spiele\Steam\steamapps\common\Counter-Strike Global Offensive\csgo.exe
Attribute:                --a--------
Datum/Zeit:               18.03.2016 02:44
Größe:                    103424
Laufwerk + Pfad:          S:\Spiele\Steam\steamapps\common\Counter-Strike Global Offensive\
Dateiname + Extension:    csgo.exe

übergebener Pfad (1):     S:\Spiele\Steam\steamapps\common\Counter-Strike Global Offensive\csgo.exe
übergebener Pfad (2):     "S:\Spiele\Steam\steamapps\common\Counter-Strike Global Offensive\csgo.exe"
Du übergibst Pfade sicherlich nicht via %~d1%~p1%~n1%~x1. Dein obiges Beispiel hat nämlich Probleme, falls du via dir ein anderes Laufwerk ansprichst (bspw. X:) und dein Arbeitsverzeichnis C: ist. X:\das\ist\ein\ordner\datei.wav existiert, durch deine Auflösung wird aber versucht \das\ist\ein\ordner\datei.wav zu konvertieren, was in C:\das\ist\ein\ordner\datei.wav auflöst und es daher kläglich scheitert.
 
Ich habe es ja zuerst wie oben im Code gemacht. Aber mit %%i wird bei mir der Dateiname + Endung verwendet. Damit könnte ich die pk-Datei ja nicht löschen, da das Script dann nach xyz.wav.pk suchen würde anstatt nach der existierenden Datei xyz.pk. Deswegen habe ich vorher immer %%~ni verwendet, weil hier nur der Dateiname Verwendung findet und ich somit recht flexibel bin was die Endungen angeht. Aber hier gab es dann Probleme mit den Pfaden.

Oder verstehe ich da immer noch was falsch?

Ein anderes Laufwerk werde ich nicht ansprechen, das Script liegt immer in einem Verzeichnis in dem es auf die Unterverzeichnisse zugreift.
 
Zuletzt bearbeitet:
Achso ja, wenn das keine *.wav.pk ist, dann ja müsstest du aufschlüsseln. Hab ich wohl übersehen. Dann passt das natürlich so.
mischaef schrieb:
Ein anderes Laufwerk werde ich nicht ansprechen, das Script liegt immer in einem Verzeichnis in dem es auf die Unterverzeichnisse zugreift.
Relevant ist einzig und allein das Arbeitsverzeichnis, nicht wo die Datei liegt. Wenn du das sicherstellst, passt das auch oder du musst halt auf absolute Pfade ausweichen mit Laufwerksbuchstaben.
 
Perfekt. Besten dank!^^
 
Zurück
Oben