Verwendung aller Dateien in einem Ordner zur Weiterverarbeitung - Relative Pfadangabe mit FOR?
Guten Tag,
an unserem Lehrstuhl verwenden wir ein neues Programm, mit dem es möglich ist, Kennzahlen aus wav-Dateien auszulesen. Das Programm liest aus einer wav-Datei Informationen aus und speichert diese dann z. B. in einer CSV-Datei. Sollten in der CSV-Datei schon Daten vorhanden sein, wird in dieser eine weitere Zeile angehängt. Leider ist es sehr mühsam, den Programmaufruf immer erneut anzupassen, deshalb suchen wir nach einer Möglichkeit, alle Dateien aus einem Ordner mit dem Programm aufzurufen.
Über jeden Hinweis bin ich sehr dankbar!
Beste Grüße,
bastis06
Der einzelne Aufruf über die Kommandozeile erfolgt in der Regel so:
programmname -C [[rel. Pfad]Konfigurationsdatei] -I [[rel. Pfad]Eingabedatei] -O [[rel. Pfad]Ausgabedatei]
Beispiel:
SMILExtract -C config/paraling_IS10.conf -I wav_files/speech01.wav -O speechoutput.csv
Umgebung:
- Die Eingabedateien liegen in dem Ordner wav_files.
- Das Programm akzeptiert nur relative Pfadangaben.
- Erlaubt sind / und \ als Pfadtrenner.
Ich habe es schon so versucht:
@echo off
for /R wav %%I IN (*.wav) do (
SMILExtract -C config/paraling_IS10.conf -I %%I -O speechoutput.csv
)
Nur leider akzeptiert das Prgramm die absolute Pfadangabe nicht.
an unserem Lehrstuhl verwenden wir ein neues Programm, mit dem es möglich ist, Kennzahlen aus wav-Dateien auszulesen. Das Programm liest aus einer wav-Datei Informationen aus und speichert diese dann z. B. in einer CSV-Datei. Sollten in der CSV-Datei schon Daten vorhanden sein, wird in dieser eine weitere Zeile angehängt. Leider ist es sehr mühsam, den Programmaufruf immer erneut anzupassen, deshalb suchen wir nach einer Möglichkeit, alle Dateien aus einem Ordner mit dem Programm aufzurufen.
Über jeden Hinweis bin ich sehr dankbar!
Beste Grüße,
bastis06
Der einzelne Aufruf über die Kommandozeile erfolgt in der Regel so:
programmname -C [[rel. Pfad]Konfigurationsdatei] -I [[rel. Pfad]Eingabedatei] -O [[rel. Pfad]Ausgabedatei]
Beispiel:
SMILExtract -C config/paraling_IS10.conf -I wav_files/speech01.wav -O speechoutput.csv
Umgebung:
- Die Eingabedateien liegen in dem Ordner wav_files.
- Das Programm akzeptiert nur relative Pfadangaben.
- Erlaubt sind / und \ als Pfadtrenner.
Ich habe es schon so versucht:
@echo off
for /R wav %%I IN (*.wav) do (
SMILExtract -C config/paraling_IS10.conf -I %%I -O speechoutput.csv
)
Nur leider akzeptiert das Prgramm die absolute Pfadangabe nicht.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 147427
Url: https://administrator.de/contentid/147427
Ausgedruckt am: 20.11.2024 um 10:11 Uhr
11 Kommentare
Neuester Kommentar
Hi,
hast Du die Möglichkeit die Powershell zu verwenden? Wenn ja, würde ich das etwa so machen
$smileextract = "path to exe"
$wav_folder = ".\"
foreach ($i in (ls $wav_folder -filter *.wav))
{
& "$smileextract -C config/paraling_IS10.conf -I $i -O speechoutput.csv"
}
Das script dann in das wav_folder Verzeichnis legen und ab dafür ;)
Gruß
Jürgen
hast Du die Möglichkeit die Powershell zu verwenden? Wenn ja, würde ich das etwa so machen
$smileextract = "path to exe"
$wav_folder = ".\"
foreach ($i in (ls $wav_folder -filter *.wav))
{
& "$smileextract -C config/paraling_IS10.conf -I $i -O speechoutput.csv"
}
Das script dann in das wav_folder Verzeichnis legen und ab dafür ;)
Gruß
Jürgen
Hi,
naja mit Batch kenn ich mich zwar schon recht gut aus - aber Schleifen und For-Statements in Batch find ich grauenvoll ^^
aber was du meinst ist einfach, du musst die Execution policy setzen, die steht wahrscheinlich im Moment auf "Restricted"
öffne einfach die powershell als admin und gib ein "Set-ExecutionPolicy Remotesigned"
danach sollte das script laufen
Gruß Jürgen
naja mit Batch kenn ich mich zwar schon recht gut aus - aber Schleifen und For-Statements in Batch find ich grauenvoll ^^
aber was du meinst ist einfach, du musst die Execution policy setzen, die steht wahrscheinlich im Moment auf "Restricted"
öffne einfach die powershell als admin und gib ein "Set-ExecutionPolicy Remotesigned"
danach sollte das script laufen
Gruß Jürgen
Hey Sebastian,
ok, zweiter Versuch
diesmal sollte auch für jedes wav file eine eigene csv erzeugt werden. Wo liegt denn diese config datei? ..\wav_folder\config\paraling_IS10.conf ?
Gruß
Jürgen
ok, zweiter Versuch
$smileextract = "c:\opensmile\SMILEextract.exe"
$wav_folder = ".\"
foreach ($i in (ls $wav_folder -filter *.wav))
{
&$smileextract -C config/paraling_IS10.conf -I $i -O $i_speechoutput.csv
}
diesmal sollte auch für jedes wav file eine eigene csv erzeugt werden. Wo liegt denn diese config datei? ..\wav_folder\config\paraling_IS10.conf ?
Gruß
Jürgen
Moin bastis06,
willkommen im Forum.
Um nochmals kurz auf die Nur-Batch-mit-FOR-Variante zurückzukommen...
Wenn ich deine Aufgabenstellung richtig interpretiere, dann erwartet dein Programm SMILExtract ja die relativen Pfadangaben deshalb, weil auch das Unterverzeichnis "config" (und nicht nur das Unterverzeichnis "wav_files") unterhalb des gerade zufälligen Verzeichnisses liegen muss.
Von daher würde ich erst noch einmal verifizieren, ob es denn auch mit "absoluten" Verzeichnisangeaben nicht klappt,
wenn sowohl "config" wie "wav_files"-Verzeichnis absolut angegeben werden.
Falls nun wider Erwarten wirklich eine Absulte Pfadangabe nicht möglich ist... okay, nehmen wir auch hin. Dann also
Im Ausführungsteil kannst du ja "fest verdrahtet" als Dateiangabe stehen haben "wav_files\%%~nxi" statt "%%i".
Nochmal zu den Variableninhalten der Laufvariablen "%%i" in den FOR-Varianten
Mit dem Zurechtstutzen auf "%%~nxi" reduzierst du es wieder auf "nur Name+Extension" (ohne Pfad)
Summa summarum:
Grüße
Biber
willkommen im Forum.
Um nochmals kurz auf die Nur-Batch-mit-FOR-Variante zurückzukommen...
Wenn ich deine Aufgabenstellung richtig interpretiere, dann erwartet dein Programm SMILExtract ja die relativen Pfadangaben deshalb, weil auch das Unterverzeichnis "config" (und nicht nur das Unterverzeichnis "wav_files") unterhalb des gerade zufälligen Verzeichnisses liegen muss.
Von daher würde ich erst noch einmal verifizieren, ob es denn auch mit "absoluten" Verzeichnisangeaben nicht klappt,
wenn sowohl "config" wie "wav_files"-Verzeichnis absolut angegeben werden.
Falls nun wider Erwarten wirklich eine Absulte Pfadangabe nicht möglich ist... okay, nehmen wir auch hin. Dann also
- VOR und NACH der FOR-Anweisung noch mit "PushD 'verzOberhalbWavFiles' bzw 'PopD' das richtige Verzeichnis zum Aktuellen machen
- und dann eine FOR-Anweisung ohne "/R" über das Unterverzeichnis "wav_files" ausführen
Im Ausführungsteil kannst du ja "fest verdrahtet" als Dateiangabe stehen haben "wav_files\%%~nxi" statt "%%i".
Nochmal zu den Variableninhalten der Laufvariablen "%%i" in den FOR-Varianten
>for %i in (d:\temp\wav_files\*.wav) do @echo %i
d:\temp\wav_files\demo1.wav
d:\temp\wav_files\demo2.wav
d:\temp\wav_files\demo3.wav
## Hier ein reines FOR %%i auf einen absoluten Pfad mit Datei-Wildcars. %%i ist ->voller Pfad+Dateiangabe
(=15:26:07 D:\temp\wav_files=)
>for %i in (*.wav) do @echo %i
demo1.wav
demo2.wav
demo3.wav
## Hier ein reines FOR %%i OHNE Pfadangabe mit Datei-Wildcars. %%i ist ->nur Dateiangabe
(=15:26:13 D:\temp\wav_files=)
>for /r %i in (*.wav) do @echo %i
D:\temp\wav_files\demo1.wav
D:\temp\wav_files\demo2.wav
D:\temp\wav_files\demo3.wav
## Hier ein rekursives FOR /R %%i OHNE Pfadangabe mit Datei-Wildcars. %%i ist ->voller Pfad Dateiangabe
Mit dem Zurechtstutzen auf "%%~nxi" reduzierst du es wieder auf "nur Name+Extension" (ohne Pfad)
Summa summarum:
@echo off
PushD "D:\einOberverzeichnisVonWav_Files"
for %%I IN (wav_files\*.wav) do (
SMILExtract -C config/paraling_IS10.conf -I wav_files\%%~nxI -O speechoutput.csv
)
PopD
Grüße
Biber
Moin bastis06,
bitte prüfe aber noch mal dieses hier
--> denn dann hätten wir etwas mehr Spielraum.
Andernfalls... natürlich lässt sich die Unterverzeichnisdurchrödelei (schriftdeutsch: "rekursive Abarbeitung") auch einbauen.
Ich hatte darauf verzichtet, weil ich die Diskrepanz zwischen dem von dir verwendeten FOR/R-Schalter und der Aussage "die Inputdateien liegen immer im Unterordner 'wav_files'" nicht auflösen konnte.
Ich hatte mich dann dafür entscheiden, mal anzunehmen, dass Aussage b) wahr ist.
Grüße
Biber
bitte prüfe aber noch mal dieses hier
Von daher würde ich erst noch einmal verifizieren, ob es denn auch mit "absoluten" Verzeichnisangeaben nicht klappt,
wenn sowohl "config" wie "wav_files"-Verzeichnis absolut angegeben werden.
wenn sowohl "config" wie "wav_files"-Verzeichnis absolut angegeben werden.
--> denn dann hätten wir etwas mehr Spielraum.
Andernfalls... natürlich lässt sich die Unterverzeichnisdurchrödelei (schriftdeutsch: "rekursive Abarbeitung") auch einbauen.
Ich hatte darauf verzichtet, weil ich die Diskrepanz zwischen dem von dir verwendeten FOR/R-Schalter und der Aussage "die Inputdateien liegen immer im Unterordner 'wav_files'" nicht auflösen konnte.
Ich hatte mich dann dafür entscheiden, mal anzunehmen, dass Aussage b) wahr ist.
Grüße
Biber