Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Dateien aus wechselnden Verzeichnissen löschen

Frage Entwicklung Batch & Shell

Mitglied: Ozzili

Ozzili (Level 1) - Jetzt verbinden

12.08.2006, aktualisiert 20.08.2006, 8936 Aufrufe, 9 Kommentare

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
Mitglied: Biber
12.08.2006 um 20:39 Uhr
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:
01.
... 
02.
... 
03.
For /f %%i in ('dir /b /a:d d:\temp\matlab\Design*') do @rd %%i /s /q 
04.
...
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:
01.
... 
02.
.. 
03.
matlab.exe [parameter...] 
04.
set lastDesignDir= 
05.
if errorlevel 1 for /f %%i in ('dir /b /a:d /o:d c:\temp\matlab\design*') do set lastDesigndir=%%i 
06.
if defined lastdesigndir rd /s /q lastdesigndir  
07.
...
Bitte warten ..
Mitglied: Ozzili
12.08.2006 um 21:14 Uhr
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
Bitte warten ..
Mitglied: Ozzili
12.08.2006 um 21:17 Uhr
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.
Bitte warten ..
Mitglied: Biber
12.08.2006 um 23:46 Uhr
Sorry, Ozzily,

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

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:
01.
@echo off & setlocal 
02.
.... 
03.
For %%i In ("%~p0.") Do (Set "thisDir=%%~ni") 
04.
@echo ThisDir:[%thisDir%] ...ab Stelle7 [%thisDir:~7%]  
05.
Set /a lfdnr=1%thisDir:~7% -1 
06.
set "dirVorher=Design_%lfdnr:~1%" 
07.
@echo dirVorher=Design_%lfdnr:~1% 
08.
 
09.
if exist ..\%dirVorher% ( 
10.
     PushD  ..\%dirVorher% 
11.
     REM --- nun bist Du im Vorgängerverzeichnis "Design_0046" 
12.
     REM Del dieseUndJene.dat 
13.
     REM ..... 
14.
     PopD 
15.
     REM ...wieder im Verzeichnis "Design_0047" 
16.
17.
...
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.
Bitte warten ..
Mitglied: Ozzili
13.08.2006 um 00:43 Uhr
Ah, vielen Dank! Da sieht sehr vielversprechend aus. Werde es morgen auf der Arbeit gleich mal ausprobieren. Dankeschön!
Bitte warten ..
Mitglied: Ozzili
13.08.2006 um 21:30 Uhr
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
Bitte warten ..
Mitglied: Biber
16.08.2006 um 12:34 Uhr
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
Bitte warten ..
Mitglied: Ozzili
16.08.2006 um 15:58 Uhr
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
Bitte warten ..
Mitglied: Biber
20.08.2006 um 17:20 Uhr
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...

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
Bitte warten ..
Neuester Wissensbeitrag
Humor (lol)

Linkliste für Adventskalender

(3)

Information von nikoatit zum Thema Humor (lol) ...

Ähnliche Inhalte
Batch & Shell
gelöst älteste dateien via batch löschen (6)

Frage von cali169 zum Thema Batch & Shell ...

Batch & Shell
gelöst Powershell: Dateien nach Version löschen in mehreren Ordnern (4)

Frage von ImmerKind zum Thema Batch & Shell ...

Batch & Shell
gelöst Dateien mit Powershell löschen und nur leere (symbolische) Datei hinterlassen (6)

Frage von evolution zum Thema Batch & Shell ...

Batch & Shell
gelöst Dateien (keine Ordner) löschen die älter sind als (4)

Frage von siziigilendirmez zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Windows Server
DHCP Server switchen (25)

Frage von M.Marz zum Thema Windows Server ...

SAN, NAS, DAS
gelöst HP-Proliant Microserver Betriebssystem (14)

Frage von Yannosch zum Thema SAN, NAS, DAS ...

Grafikkarten & Monitore
Win 10 Grafikkarte Crash von Software? (13)

Frage von Marabunta zum Thema Grafikkarten & Monitore ...

Erkennung und -Abwehr
Spam mit eigener Domain (12)

Frage von NoobOne zum Thema Erkennung und -Abwehr ...