master-chief
Goto Top

Mehrere Dateien in abhängigkeit voneinander Löschen

Hallo Leute,

ich brauch ein wenig Hilfe oder den richtigen Anstoß.

Ich habe folgendes Problem. In einem Ordner befinden sich x Dateien. Die dateien fangen alle mit 4 Zahlen an die eindeutig sind. Es gibt immer 3 Dateien mit diesem "Schlüssel". Also in etwa so:

6344_test_1.txt
6344_test_2.txt
6344_test_3.txt
4125_test_1.txt
4125_test_2.txt
4125_test_3.txt
1532_test_1.txt
1532_test_2.txt
1532_test_3.txt

In diesen Datein KANN etwas stehen, muss aber nicht. Falls in alle 3 Dateien mit gleichem Schlüssel leer sind werden sie gelöscht. Beispiel

6344_test_1.txt 0kB
6344_test_2.txt 0kB
6344_test_3.txt 0kB
4125_test_1.txt 1kB
4125_test_2.txt 0kB
4125_test_3.txt 0kB
1532_test_1.txt 4kB
1532_test_2.txt 6kB
1532_test_3.txt 1kB

Wenn mein Programm durchgelaufen ist sollten die ersten 3 Dateien verschwunden sein.

Ich habe das Problem schon in C# realiesiert. Der Kern des ALgorithmus ist der:

for (int i = 0; i <= dateien.Length-2; i=i+3)
{
if ((dateien[i].Length == 0) && (dateien[i+1].Length == 0) && (dateien[i+2].Length == 0)
{
dateien[i].Delete();
dateien[i+1].Delete();
dateien[i+2].Delete();
}
}

Das funktioniert auch Prima. Nun möcht ich aber gerne das Problem auch über eine Batch Datei lösen, ist das überhaupt möglich?

Ich hatte mir gedacht ich hol mir erstma den Ordner mit Dir * und schreib das in eine Datei. Mit einer For-Schleife wollte ich dann irgendwie die Dateien die Raus müssen in eine andere Datei schreiben. Ich hatte mir gedacht es wäre ersteinmal hilfreich wenn die Dateien, mit Semikolon getrennt, aufgelistet sind. Etwa so:

6344_test_1.txt;6344_test_2.txt;6344_test_3.txt
4125_test_1.txt;4125_test_2.txt;4125_test_3.txt
1532_test_1.txt;1532_test_2.txt;1532_test_3.txt

Allerdings bin ich mir nicht sicher ob das mit Batch überhaupt möglich ist, wegen der Zeilenweise abarbeitung.

Ich hoffe ihr könnt mir einen Tipp oder hinweis geben in welche Richtung das ganze gehen sollte damit es funktioniert. Ich bin noch totaler Batch-Newbie, verlange aber keine fertigen Scripts, über denkanstöße und kleine Hilfen dir mir auf den Weg zum Ziel helfen wäre ich sehr dankbar.

Content-Key: 97254

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

Printed on: April 25, 2024 at 12:04 o'clock

Member: miniversum
miniversum Sep 18, 2008 at 11:13:09 (UTC)
Goto Top
Ich würde das eher so lösen dass du die dateien einzeln durchgehst. Du nimmst die erste, schuchst die beiden andern dazu, prüfst die dateigröße und löscht wenn alle drei 0 sind.
Das würde dann so gehen (ungetestet):
@echo off
set "Ordner=C:\dateien\"  
set "filter=*.txt"  
FOR /F "delims=" %%i in ('dir /B /A-D "%Ordner%%filter%"') do call:check "%%i"  
goto:eof

:check
set "filename=%~1"  
if not exist "%Ordner%%filename%" goto:eof  
set delit=0
FOR /F "tokens=3 delims= " %%j in ('dir /A-D "%Ordner%%filename:~0,4%%filter%"') do if "%%j" neq "0" set delit=1  
if "%delit%" equ "1" ECHO del "%Ordner%%filename:~0,4%%filter%" /Q  
goto:eof
Member: master-chief
master-chief Sep 18, 2008 at 12:20:21 (UTC)
Goto Top
Danke für deine schnelle Antwort. Ich habe mich jetzt versucht ein wenig in den Code rein zu denken. Leider funkioniert er nicht 100%ig, er will immer alle dateien Löschen. Allerdings sind es ja schonmal alle.

Allerdings sind mir beim Versuch das Script zu verstehen 2 Sachen aufgefallen.

Zeile 11: Müsste das zweite "%j" mit 2 %-Zeichen versehen werden?
Und, immernoch Zeile 11 direkt nach dem do. Muss da nicht eine Klammer hin damit die beiden If-Befehle innerhalb der For-Schleife abarbeitet werden ?

Aufjedenfall schonmal danke für die super Hilfe, bin schon einen Großen Schritt weiter.
Member: miniversum
miniversum Sep 18, 2008 at 13:21:59 (UTC)
Goto Top
Ja mit der Zeile 11 hast du recht.
Aber es müssen nicht beide Ifs in die Klammer um For. Dafür kann Zeile 13 entfallen.
Ich habs oben korrigiert.

Versuchs mal damit:
@echo off
set "Ordner=C:\dateien\"  
set "filter=*.txt"  
FOR /F "delims=" %%i in ('dir /B /A-D "%Ordner%%filter%"') do call:check "%%i"  
goto:eof

:check
set "filename=%~1"  
if not exist "%Ordner%%filename%" goto:eof  
set delit=1
FOR /F "tokens=3 delims= " %%j in ('dir /A-D "%Ordner%%filename:~0,4%%filter%"') do if "%%j" neq "0" set delit=0  
if "%delit%" equ "1" ECHO del "%Ordner%%filename:~0,4%%filter%" /Q  
goto:eof

in "check" werden alle dateien gesucht mit den gleichen 4 anfangsbuchstaben wie die übergebene Datei. Ist eine Dieser Datien größer 0 Byte wird das Flag "delit" auf 0 gesetzt. Ist anschließend das flag auf 1 werden alle Dateien gelöscht, da ja alle leer sein sollten. Hier war ein Fehler beim setzen des Flags. So sollte es gehen.
Wenn dann richtig gelöscht werden soll das "ECHO" entfernen.
Member: master-chief
master-chief Sep 18, 2008 at 13:46:25 (UTC)
Goto Top
Super, nochmal danke für die rasante Hilfe.
Es funktioniert leider immer nochnicht so wie gewollt.

Von der Theorie her sollte es funktioniert. Zumindest ist das setzen des Flags alles korrekt. (in dem Quellcode oben muss in Zeile 10 das flag auf 1 vordefiniert werden oder = )

Allerdings funktioniert es leider nicht, es wird genau nichts ausgegeben. Ich hab das Script noch nicht alles 100%ig verinnerlicht aber langsam wirds.
In der ersten For-Schleife wird jede Datei einzeln ausgewählt. Dann werden in der 2ten Schleife alle Dateienzusammengesammelt die sich in den ersten 4 Zeiche gleichen. Wenn eine dieser Dateien >0 ist wird das flag auf 0 gesetz. Ist am ende der Schleife das Flag immernoch auf eins sind also alle 3 Datein 0kb groß und können weg.

So ist jetzt meine Vorstellung wie das Script funktioniert, nur tut es das leider nicht face-sad

Edit: gänzlich unklar ist mir noch die Syntax mit den Variablen. Bei der deklarieung steht um delite normal da. Bei der Belegung auch. Beim auslesen des Werts in "%%". Ich dachte bisher immer Varibalen werden in %% oder mit % am Anfang geschrieben ?
Member: miniversum
miniversum Sep 18, 2008 at 14:16:49 (UTC)
Goto Top
Der Ablauf wie du ihn Beschrieben hast stimtm auch und war auch genau so geplant.
Bei der Verwendung von Variabeln benutzt man die mit % (bzw. mit ! wenn delayed expansion verwendet wird). Bei der Zuweisung von Werten mit set aber ohne %.
Ich hab das bei mir hier mal getestet jetzt und mich auf die Fehlersuche gemacht. Herausgekommen ist das hier:
@echo off & setlocal
set "Ordner="  
set "filter=*.txt"  
FOR /F "delims=" %%i in ('dir /B /A-D "%Ordner%%filter%"') do call:check "%%i"  
goto:eof

:check
set "filename=%~1"  
if not exist "%Ordner%%filename%" goto:eof  
set delit=1
FOR /F "delims=" %%j in ('dir /B /A-D "%Ordner%%filename:~0,4%%filter%"') do (  
set "size="  
FOR /F "skip=5 tokens=3 delims= " %%k in ('dir /A-D "%%~j"') do if not defined size (  
set "size=%%k"  
if "%%k" neq "0" set delit=0  
)
)
if "%delit%" equ "1" del "%Ordner%%filename:~0,4%%filter%" /Q  
goto:eof
Die ermittlung der Größe ging schief udn daher stand imemr der Gleiche wert drin. Daher auch imemr die gleichen ergebnisse. So sollte es jetzt funktionieren (zumindest bei meinem kurzen Test hier).
Member: master-chief
master-chief Sep 19, 2008 at 06:31:15 (UTC)
Goto Top
Gute morgen miniversum,

Nach einer klitzekleinen änderung Funktioniert jetzt alles bestens.
(Zeile 13, in-klausel muss lauten ("%ordner%%%~j"), dann funktioniert alles prima)

Ich danke dir nochmal für deine MÜhe. Eine kleine Frage habe ich aber noch. Was bewirkt der ~ vor dem "j" in der dritten For-Schleife ?
Member: miniversum
miniversum Sep 19, 2008 at 08:21:36 (UTC)
Goto Top
%%j würde ja den Dateinamen darstellen.
%%~j Stellt auch den Dateinamen dar mit dem Unterschied dass eventuell vorhandene Anführungszeichen am Anfang und Ende (was bei Dateinamen mit Leerzeichen vielleicht vorkommen könnte) entfernt werden. Da der ganze ausdruck in anführungszeichen ist macht das allerdings nichts aus. Je nach dem kann mann auch ein einfaches %%j nehmen aber es stört auch nicht. Genauer kannst Du das nachlesen in der Hilfe zum for befehl (For /?).