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.
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.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 97254
Url: https://administrator.de/forum/mehrere-dateien-in-abhaengigkeit-voneinander-loeschen-97254.html
Ausgedruckt am: 22.04.2025 um 11:04 Uhr
7 Kommentare
Neuester Kommentar
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):
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
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:
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.
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.
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:
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).
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
%%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 /?).
%%~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 /?).