bastis06
Goto Top

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. face-confused

Content-Key: 147427

Url: https://administrator.de/contentid/147427

Printed on: April 24, 2024 at 23:04 o'clock

Member: digital-nervous-system
digital-nervous-system Jul 22, 2010 at 10:36:48 (UTC)
Goto Top
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
Member: digital-nervous-system
digital-nervous-system Jul 22, 2010 at 10:41:50 (UTC)
Goto Top
Das Problem was ich hier übrigens noch sehe, ist, dass wenn du das so mit ner Schleife machen willst an das speechoutput.csv noch irgendwas dranhängen musst (zb. "wav-datei_speechoutput.csv" oder so), sonst überschreibt er ja immer wieder die gleiche Datei mit nem neuen wav-output oder?
Member: bastis06
bastis06 Jul 22, 2010 at 11:53:45 (UTC)
Goto Top
Hallo Jürgen,

vielen Dank für Deinen Post. Das verwendete Betriebssystem ist Win7, die Powershell wäre also vorhanden. Bisher habe ich noch nie mit der Powershell gearbeitet, mein Vorwissen ist also gleich null. Trotzdem habe ich das Skript angepasst (komplette Pfadangabe zur exe) und versucht mit > powershell juergenskript.ps auszuführen.

Dann habe ich gemerkt, dass zur Ausführung von Skripten die Sicherheitseinstellungen geändert werden müssen. Das wäre zwar an meinem Rechner möglich, nicht aber an allen Mitarbeiterrechnern.

Kennst Du noch eine einfache Batch-Alternative?
Member: digital-nervous-system
digital-nervous-system Jul 22, 2010 at 11:59:13 (UTC)
Goto Top
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
Member: bastis06
bastis06 Jul 22, 2010 at 13:19:30 (UTC)
Goto Top
Hey ho,

jetzt läuft zumindest das Skript. Es gibt aber folgende Fehler zurück:

==> Fehler A

PS C:\opensmile\wav_samples> .\aufruf_alle.ps1
Die Benennung "c:\opensmile\SMILEextract.exe -C config/paraling_IS10.conf -I mu
sic01.wav -O speechoutput.csv" wurde nicht als Name eines Cmdlet, einer Funktio
n, einer Skriptdatei oder eines ausführbaren Programms erkannt. Überprüfen Sie
die Schreibweise des Namens, oder ob der Pfad korrekt ist (sofern enthalten), u
nd wiederholen Sie den Vorgang.
Bei C:\opensmile\wav_samples\aufruf_alle.ps1:5 Zeichen:2

back-to-top& <<<< "$smileextract -C config/paraling_IS10.conf -I $i -O speechoutput.csv

"
+ CategoryInfo : ObjectNotFound: (c:\opensmile\SM...peechoutput.c
sv:String) , CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException

==> Fehler B

Es fehlt die Pfadangabe zur Input-wav-Datei (siehe Beispiel am Anfang).

Dir ein dickes Danke für die Unterstützung!

Grüße,
Sebastian
Member: digital-nervous-system
digital-nervous-system Jul 22, 2010 at 13:25:44 (UTC)
Goto Top
Hey Sebastian,

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
Member: Biber
Biber Jul 22, 2010 at 13:31:21 (UTC)
Goto Top
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

  • 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
Member: bastis06
bastis06 Jul 22, 2010 at 13:36:09 (UTC)
Goto Top
Hm, jetzt sieht der Fehler so aus. Die Outputdatei kann ruhig immer dieselbe sein. Das Programm SMILEextract prüft, ob die Outputdatei bereits vorhanden ist. Falls sie vorhanden ist, wird am Ende eine weitere Zeile eingefügt.

""Die Benennung "c:\opensmile\SMILEextract.exe" wurde nicht als Name eines Cmdlet
, einer Funktion, einer Skriptdatei oder eines ausführbaren Programms erkannt.
Überprüfen Sie die Schreibweise des Namens, oder ob der Pfad korrekt ist (sofer
n enthalten), und wiederholen Sie den Vorgang.
Bei C:\opensmile\wav_samples\aufruf_alle.ps1:7 Zeichen:2

back-to-top& <<<< $smileextract -C config/paraling_IS10.conf -I $i -O speechoutput.csv

+ CategoryInfo : ObjectNotFound: (c:\opensmile\SMILEextract.exe:S
tring) , CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException""
Member: digital-nervous-system
digital-nervous-system Jul 22, 2010 at 13:38:23 (UTC)
Goto Top
ich sag ja, grauenvoll.. *lach*
Member: bastis06
bastis06 Jul 23, 2010 at 07:53:43 (UTC)
Goto Top
Hallo Biber,

herzlichen Dank für Deine Ausführung. Es funktioniert nun ohne Probleme. Aus irgendeinem Grund wurde die Variable im FOR Befehl bei Verwendung der Option /R nicht gekürzt. Ohne /R geht jetzt alles (Unterverzeichnisse wären zwar schön gewesen, sind aber nicht notwendig.

Dir und digital-nervous-system ein gutes WE,
bastis06
Member: Biber
Biber Jul 23, 2010 at 08:35:00 (UTC)
Goto Top
Moin bastis06,

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.

--> 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