ozzili
Goto Top

Dateien aus wechselnden Verzeichnissen löschen

Hallo,

ich habe folgendes Problem. Ich muß für ein Optimierungsprogramm eine Batch Datei schreiben. Dabei sollen bestimmte Daten in ein Verzeichnis kopiert werden, dann soll ein Simulationsprogramm (MATLAB) ausgeführt werden und schließlich sollen Dateien, die zur Auswertung nicht benötigt werden gelöscht werden.

Mein Programm sah bisher so aus:

copy c:\Verzeichnis\Datei1 .
copy c:\Verzeichnis\Datei2 .
copy c:\Verzeichnis\Datei3 .

Führe Matlab file aus

del Datei2

Das Optimierungsprogramm führt dabei 500 Einzelsimulationen durch und legt für jede Simulation ein Verzeichnis an. Vor der ersten Simulation legt es ein Verzeichnis mit dem Namen "Design_0001" an, dann führt es die Batch Datei aus. Nach einem Lauf legt es dann das Verzeichnis "Design_0002" an, und führt das Batch Programm aus.

Das Problem ist, daß wenn die Matlab Simulation fehlschlägt, das Optimierungsprogramm alle laufenden Befehle unterbricht und zur nächsten Simulation übergeht, d.h. in der Batch Datei der Teil unter dem Matlabbefehl nicht mehr ausgeführt wird. Dadurch werden die nicht benötigten Dateien im "Design_wxyz" nicht gelöscht und es sammeln sich riesige Datenmengen an.
Also hatte ich mir überlegt, einfach im Batch Programm am Anfang die Dateien des Vorgängerlaufs zu löschen. D.h. das Batch Programm müßte den aktuellen Verzeichnisnamen auslesen können, um dann die Dateien im Vorgängerverzeichnis zu löschen.

Leider kenne ich mich überhaupt nicht damit aus und es wäre nett, wenn mir jemand helfen könnte. Achja, Betriebssystem Win XP.

Viele Grüße,
Ozzili

Content-Key: 37867

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

Ausgedruckt am: 28.03.2024 um 19:03 Uhr

Mitglied: Biber
Biber 12.08.2006 um 20:39:06 Uhr
Goto Top
Moin Ozzili,

wilkommen im Forum.
Wenn c:\temp\matlab das Verzeichnis wäre, unter dem diese "Design_????"-Ordner angelegt werden, dann bau folgendes in Deinen Batch ein:
...
...
For /f %%i in ('dir /b /a:d d:\temp\matlab\Design*') do @rd %%i /s /q  
...

Gruß
Biber

[Edit]
Grad gemerkt, Du willst ja wohl gar nicht alle Design_*-Verzeichnisse löschen, sondern nur diejenigen, die für einen abgebrochenen MatLab-Lauf angelegt wurden.
Wenn dem so ist, dann wäre der "richtige" Weg, den ErrorLevel des jeweiligen MatLab-Laufs zu prüfen und das "jüngste" Design_*-Verzeichnis zu löschen, falls ErrorLevel einen Fehler anzeigt.

sprich:
...
..
matlab.exe [parameter...]
set lastDesignDir=
if errorlevel 1 for /f %%i in ('dir /b /a:d /o:d c:\temp\matlab\design*') do set lastDesigndir=%%i  
if defined lastdesigndir rd /s /q lastdesigndir 
...
Mitglied: Ozzili
Ozzili 12.08.2006 um 21:14:29 Uhr
Goto Top
Hallo und danke für Deine Hilfe erstmal.
Leider hab ich mich wohl schlecht ausgedrückt, denn das Problem ist ein wenig komplizierter.

Ich benutze für meine Arbeit ein Optimierungsprogramm (optiSLang), in diesem gebe ich die batch Datei an. Das Optimierungsprogramm führt 500 Simulationen durch. Das bedeutet für den ersten Lauf, es startet die batch Datei und führt die darin enthaltenen Befehle aus. Zunächst kopiert diese Datei einige Daten in das Designverzeichnis Design_0001, das optiSLang für jeden dieser 500 Läufe anlegt. Dort startet es dann MatLab mit dem Befehl

matlab /nosplash /nojvm /r skript

Ist die einzelne Matlab Simulation beendet, so führt es den Rest der Batch-Datei aus. Dieser enthält den Befehl, unbenötigte Dateien in diesem Verzeichnis zu löschen. Also nicht alle. Danach startet das Optimierungsprogramm den nächsten Lauf, es wird das nächste Designverzeichnis angelegt (Design_0002) und es beginnt von vorne. Usw.

Das Problem ist nun, daß nicht nur Matlab einen Lauf als ungültig ansehen kann (dann würde das batch Programm einfach zu ende ausgeführt), sondern daß optiSLang eine Zeitbeschränkung auferlegt wurde (in optiSLang), wie lang ein Lauf maximal dauern darf. Tritt also eine Zeitüberschreitung ein (was sehr oft passiert), dann beendet optiSLang automatisch Matlab und dummerweise auch die batch Datei, die dann nicht abgearbeitet wird und damit die Dateien nicht löscht. Das erzeugt dann dummerweise riesige Dateimengen.

Mein Gedanke war nun also, daß die Batch-Datei die nicht benötigten Dateien des vorherigen Laufs zu Anfangs löscht und danach erst die neuen Dateien kopiert und Matlab startet.

Das Problem dabei ist, daß die Batch Datei sich z.B. vor zweiten Lauf im Verzeichnis "Design_0002" befindet, ich aber Dateien aus Verzeichnis "Design_0001" löschen will und danach wieder in das Verzeichnis "Design_0001" wechseln, die neuen Dateien kopieren und MATLAB starten möchte.

Ich hoffe, ich habe das Problem halbwegs verständlich erklärt.

Viele Grüße,
Ozzili
Mitglied: Ozzili
Ozzili 12.08.2006 um 21:17:33 Uhr
Goto Top
Nachtrag: Die betreffenden Dateien sollen immer gelöscht werden, nicht nur im Falle eines Abbruchs! Darum die Idee, die Dateien des vorherigen Designs vor dem aktuellen Lauf löschen zu lassen.

Viele Grüße,
O.
Mitglied: Biber
Biber 12.08.2006 um 23:46:20 Uhr
Goto Top
Sorry, Ozzily,

manchmal bin auch etwas schwer von Begriff... aber mit Geduld tasten wir uns ran... face-wink

also... angenommen einer der vielen Bätsche startet .... z.B. der im Unterverzeichnis "Design_0047"...
..dann sollte in diesem und in allen anderen Skripten stehen:
@echo off & setlocal
....
For %%i In ("%~p0.") Do (Set "thisDir=%%~ni")  
@echo ThisDir:[%thisDir%] ...ab Stelle7 [%thisDir:~7%] 
Set /a lfdnr=1%thisDir:~7% -1
set "dirVorher=Design_%lfdnr:~1%"  
@echo dirVorher=Design_%lfdnr:~1%

if exist ..\%dirVorher% (
     PushD  ..\%dirVorher%
     REM --- nun bist Du im Vorgängerverzeichnis "Design_0046"  
     REM Del dieseUndJene.dat
     REM .....
     PopD
     REM ...wieder im Verzeichnis "Design_0047"  
)
...

Gruß
Biber
P.S. Das wäre der Output der beiden @echo-zeilen oben:
ThisDir:[design_0047] ...ab Stelle7 [0047]
dirVorher=Design_0046

Beide Echo-Zeilen sind nur zum Testen sinnvoll - danach auskommentieren.
Mitglied: Ozzili
Ozzili 13.08.2006 um 00:43:23 Uhr
Goto Top
Ah, vielen Dank! Da sieht sehr vielversprechend aus. Werde es morgen auf der Arbeit gleich mal ausprobieren. Dankeschön!
Mitglied: Ozzili
Ozzili 13.08.2006 um 21:30:12 Uhr
Goto Top
Sodele, ein kleiner Test verlief prima und hat schön funktioniert. In der harten Realität sah es aber anders aus. Irgendwie hat's nicht geklappt. Aber egal. Habe jetzt einfach den Befehl del /s eingebaut. Dann isses auch wurscht, ob 5,10 oder 100 Simulationen fehlschlagen. Solange eine durchkommt, rasiert sie die Dateien aus den anderen Simulationen auch weg.

Is leider nicht sehr elegant, aber funktioniert.

Vielen Dank für Deine Mühe, Biber. Für den Moment muß dann eben die Holzhammer Methode reichen, statt der schönen Lösung von Dir.

Viele Grüße,
Ozzili
Mitglied: Biber
Biber 16.08.2006 um 12:34:49 Uhr
Goto Top
Hm, Ozzili,

ich kann natürlich damit leben, wenn meine Skizze in der Realität nicht funktioniert und Du nun doch alles pauschal wegschrubbelst...

...aber interessieren würde mich der Denkfehler schon. Was tut denn in der Realität nicht?

Gruß
Biber
Mitglied: Ozzili
Ozzili 16.08.2006 um 15:58:15 Uhr
Goto Top
Es ist mir auch nicht verständlich.

In dem Optimierungsprogramm, das die .bat ausführt, sieht man jeden Schritt, den das Batch gerade abarbeitet. Daran ist ganz klar zu erkennen, daß er sich jeweils in einem der Design Verzeichnisse befindet. Aber löschen tut er dennoch nicht. Er macht alle anderen Befehle, die ich eingebaut habe ohne Murren, nur eben das Löschen nicht. Ich hab wirklich keine Ahnung warum er das nicht tut. Dieser Teil steht dann auch nicht im Optimierungsprogramm.
Die Batch-Datei ist so aufgebaut, daß es erst die Dateien in das aktuelle Verzeichnis kopiert, dann mit Hilfe Deines Stücks die Dateien aus dem vorherigen Verzeichnis löscht, dann MATLAB ausführt.
Im Optimierungsprogramm wird der Kopiervorgang gezeigt und danach direkt MATLAB gestartet. Keine Fehlermeldungen bei der "Löschen" Stelle, diese wird gar nicht erwähnt. Ganz komisch.

Viele Grüße,
Ozzili
Mitglied: Biber
Biber 20.08.2006 um 17:20:09 Uhr
Goto Top
Hm, Ozzili,

kann ichmir auch nicht erklären. Bei mir klappt es auch, wenn ich es hier teste.
Einzige (schwache) Erklärung wäre, dass sich die jeweilige Batchdatei ("%~p0.") eben nicht in dem Verzeichnis "...\..\Design_0047" befindet.

Aber das würdest Du ja auch erkennen an der "ECHO %thisdir%"-Ausgabe...

Kurz gesagt, ich muss da passen - keine Idee mehr... face-sad

Deshalb meine Bitte: Wenn Du jetzt eine andere Lösung gefunden hast, setze bitte diesen Beitrag auf gelöst.

Danke und schönen Sonntag
Biber