Datei in ganz bestimmten Ordner suchen und ausführen
Hallo erstmal an alle,
da ich mich seit kurzem mit Batchprogrammierung beschäftige und bei euch schon sehr viele hervorragende Hinweise zu anderen Problemen dieser Art gefunden habe würde ich jetzt gerne meine eigene Frage stellen. Ich habe ca 100 Ordner mit einer ganz bestimmten, immer gleichen Unterordnerstruktur. Jetzt muss ich mehrere Programme nacheinander ausführen. Ein Beispiel, dass ich gelöst habe:
Wie ihr sicherlich gleich erkennt, wird im %BASE_DIR% nach (*.frd *.dat *.sta 2014-07-04_turbine_blade_Mesh.inp) gesucht und diese anschließend gelöscht.
Bei einem zweiten Problem schaffe ich es mit dem gleichen Vorgehen bestimmte Dateien mit einem Programm auszuführen.
Bei beiden Beispielen war es allerdings egal, ob der Pfad richtig war, denn bei einem falschen Pfad wurde dieser einfach nicht ausgeführt. Ganz nebenbei weiß ich nicht, warum ich dieses cd RUN_*\Output brauche, aber ohne dem gehts nicht.
Nun habe ich aber das Problem, dass ich bei einem Programm eine Fehlermeldung bekomme, wenn der Pfad nicht genau stimmt, d.h. ich darf nur in Ordnern suchen, die die Datei auch enthalten! Hier im Forum bin ich auch auf ähnliche Dinge gestoßen, aber leider reicht mein Batchwissen nicht aus, um sie auf meinen Fall umzusetzen.
Folgende Ordnerstruktur
%BASE_DIR%
- RUN_1
-- Input
-- Output
-- Project
- RUN_2
-- Input
-- Output
-- Project
usw.
Die gesuchte Datei befindet sich immer in -- Project. Leider funktioniert mein Ansatz nicht (war nicht mein einziger):
Bin um jede Hilfe sehr dankbar.
Schöne Grüße
ChocoLoco
da ich mich seit kurzem mit Batchprogrammierung beschäftige und bei euch schon sehr viele hervorragende Hinweise zu anderen Problemen dieser Art gefunden habe würde ich jetzt gerne meine eigene Frage stellen. Ich habe ca 100 Ordner mit einer ganz bestimmten, immer gleichen Unterordnerstruktur. Jetzt muss ich mehrere Programme nacheinander ausführen. Ein Beispiel, dass ich gelöst habe:
@ECHO OFF
for /r %BASE_DIR% %%i in (*.frd *.dat *.sta 2014-07-04_turbine_blade_Mesh.inp) do (
del %%i
echo %%i
)
Bei einem zweiten Problem schaffe ich es mit dem gleichen Vorgehen bestimmte Dateien mit einem Programm auszuführen.
@ECHO OFF
for /r %BASE_DIR% %%i in (2014-07-04_turbine_blade) do (
cd RUN_*\Output
ccx %%~fi
echo %%i
echo %%~fi
)
Nun habe ich aber das Problem, dass ich bei einem Programm eine Fehlermeldung bekomme, wenn der Pfad nicht genau stimmt, d.h. ich darf nur in Ordnern suchen, die die Datei auch enthalten! Hier im Forum bin ich auch auf ähnliche Dinge gestoßen, aber leider reicht mein Batchwissen nicht aus, um sie auf meinen Fall umzusetzen.
Folgende Ordnerstruktur
%BASE_DIR%
- RUN_1
-- Input
-- Output
-- Project
- RUN_2
-- Input
-- Output
-- Project
usw.
Die gesuchte Datei befindet sich immer in -- Project. Leider funktioniert mein Ansatz nicht (war nicht mein einziger):
for /r %BASE_DIR%\RUN_*\Project %%i in (Project.sls) do (
cd RUN_1\Project
START CMD /wait /c %SIMLAB_DIR%\SimLab.bat -auto %%~fi -nographics -nowait
)
Bin um jede Hilfe sehr dankbar.
Schöne Grüße
ChocoLoco
Please also mark the comments that contributed to the solution of the article
Content-Key: 243434
Url: https://administrator.de/contentid/243434
Printed on: April 18, 2024 at 12:04 o'clock
17 Comments
Latest comment
Hallo ChocoLoco, willkommen im Forum.
Das Problem ist einfach erklärt: Es wird nur dann nach einer Datei gesucht, wenn in der Klammer ein Wildcard Zeichen (* oder ?) zu finden ist. Anderenfalls wird der Dateiname einfach an jedes gefundene Verzeichnis angehängt. Wildcards im Pfad funktionieren nicht, aber das hast du bereits herausgefunden.
Es mag komisch aussehen, aber wenn du ein Wildcard an deinen Dateinamen anhängst, sollte es funktionieren.
Ungetestet:
Option /d ändert das Arbeitsverzeichnis des aufgerufenen Programms.
Grüße
rubberman
Das Problem ist einfach erklärt: Es wird nur dann nach einer Datei gesucht, wenn in der Klammer ein Wildcard Zeichen (* oder ?) zu finden ist. Anderenfalls wird der Dateiname einfach an jedes gefundene Verzeichnis angehängt. Wildcards im Pfad funktionieren nicht, aber das hast du bereits herausgefunden.
Es mag komisch aussehen, aber wenn du ein Wildcard an deinen Dateinamen anhängst, sollte es funktionieren.
Ungetestet:
for /r "%BASE_DIR%" %%i in (Project.sls*) do (
start "" /d "%%~dpi" /wait CMD /c "%SIMLAB_DIR%\SimLab.bat" -auto "%%~fi" -nographics -nowait
)
Grüße
rubberman
Hallo ChocoLoco,
ganz kann ich dir noch nicht folgen.
Für Hilfe zu den einzelnen Befehlen, öffne ein CMD Fenster und führe
aus. In deinem Fall FOR /? und START /?.
Grüße
rubberman
ganz kann ich dir noch nicht folgen.
Wenn ich die Befehlszeile in die ursprüngliche Form bringe
/wait gehört zum START Befehl und muss demnach vor CMD stehen.Mir ist auch nicht klar, was diese Zusätzlichen Parameter bedeuten.
Welche? Zum /d habe ich etwas geschrieben.Bei meiner zweiten Lösung (siehe ersten Beitrag) würde ich auch gerne mit * arbeiten, aber dann wird die Endung angehängt.
An der Stelle hast du mich endgültig verloren. Aber mal als Tipp: %%~dpni ergibt Laufwerk, Pfad und Dateiname von %%i (ohne Dateiendung).Für Hilfe zu den einzelnen Befehlen, öffne ein CMD Fenster und führe
Befehl /?
aus. In deinem Fall FOR /? und START /?.
Grüße
rubberman
Hehe, also nochmal, ein /wait gibt es nicht für cmd (das passiert automatisch). Rausschmeißen! Die Variable %BASE_DIR% musst du natürlich auch am Anfang des Codes definieren.
Und wie genau lautet die Fehlermeldung?
Bilder hochladen? Findest du in der Hilfe.
Und wie genau lautet die Fehlermeldung?
Bilder hochladen? Findest du in der Hilfe.
Ups, gar nicht mitbekommen, dass hier noch was kam.
Um das hinzubekommen, musst du den Run_... Verzeichnisnamen am Unterstrich splitten. Ich versuch's mal ungetestet in den Browser zu schreiben.
Für Zeile 4 folgende Zeilen:
Grüße
rubberman
Um das hinzubekommen, musst du den Run_... Verzeichnisnamen am Unterstrich splitten. Ich versuch's mal ungetestet in den Browser zu schreiben.
Für Zeile 4 folgende Zeilen:
for /f "tokens=2 delims=_" %%j in ("%%~ni") do (
generate_evaluation_grid.exe new_model.prt Expression\Expression_%%j\profil_veraendert.exp 0.5
)
rubberman
Um asynchron arbeiten zu können, benötigst du wieder den START Befehl.
Da das Ganze aber, wie du schreibst, trotzdem sehr viel Zeit in Anspruch nehmen wird, ist mir noch nicht klar wie du vorhast damit zu arbeiten. Willst du die Batchdatei nur einmal starten und sie läuft dann eben bis alle Dateien verarbeitet wurden? Oder willst du jeweils nachdem 4 Berechnungen durch sind die Batchdatei neu starten? Im letzteren Fall musst du mir sagen, woran zu erkennen ist, welche Berechnungen bereits erfolgt sind, damit nicht wieder bei Run_1 gestartet wird.
Grüße
rubberman
Da das Ganze aber, wie du schreibst, trotzdem sehr viel Zeit in Anspruch nehmen wird, ist mir noch nicht klar wie du vorhast damit zu arbeiten. Willst du die Batchdatei nur einmal starten und sie läuft dann eben bis alle Dateien verarbeitet wurden? Oder willst du jeweils nachdem 4 Berechnungen durch sind die Batchdatei neu starten? Im letzteren Fall musst du mir sagen, woran zu erkennen ist, welche Berechnungen bereits erfolgt sind, damit nicht wieder bei Run_1 gestartet wird.
Grüße
rubberman
Hmm. Wieder ungetestet (logischerweise):
Beachte Zeile 11. Wenn die Batchdatei erst beendet werden darf, wenn alle ccx.exe Prozesse abgearbeitet sind, gehört an der Stelle noch eine Warteschleife rein. Weiß ich aber nicht.
Grüße
rubberman
for /d %%i in ("%BASE_DIR%\Run_*") do (
if exist "%%~i\Output\2014-07-04_turbine_blade_Mesh.inp" (
set "runDir=%%~i"
REM Subroutine aufrufen
call :procRunDir
) else (
echo "%%~i\Output\SOLVER_2014-07-04_turbine_blade.inp" NICHT gefunden
)
)
REM Batchdatei beenden (an dieser Stelle laufen aber noch 4 ccx.exe Prozesse weiter)
goto :eof
REM Subroutine
:procRunDir
cd "%runDir%\Output"
REM ccx.exe asynchron aufrufen
start "" ccx "%runDir%\Output\SOLVER_2014-07-04_turbine_blade"
REM Warteschleife, solange mehr als 3 Instanzen von ccx.exe parallel laufen
:loop
for /f %%j in ('tasklist /nh /fi "imagename eq ccx.exe" ^| find /i /c "ccx.exe"') do (
if %%j gtr 3 (timeout /t 5 /nobreak >nul & goto loop)
)
REM Zum Aufruf der Subroutine in Zeile 5 zurückkehren
goto :eof
Grüße
rubberman