Top-Themen

Aktuelle Themen (A bis Z)

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

Mehrere Dateien in abhängigkeit voneinander Löschen

Mitglied: master-chief

master-chief (Level 1) - Jetzt verbinden

18.09.2008, aktualisiert 19.09.2008, 3095 Aufrufe, 7 Kommentare

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.
Mitglied: miniversum
18.09.2008 um 13:13 Uhr
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):
01.
@echo off 
02.
set "Ordner=C:\dateien\" 
03.
set "filter=*.txt" 
04.
FOR /F "delims=" %%i in ('dir /B /A-D "%Ordner%%filter%"') do call:check "%%i" 
05.
goto:eof 
06.
 
07.
:check 
08.
set "filename=%~1" 
09.
if not exist "%Ordner%%filename%" goto:eof 
10.
set delit=0 
11.
FOR /F "tokens=3 delims= " %%j in ('dir /A-D "%Ordner%%filename:~0,4%%filter%"') do if "%%j" neq "0" set delit=1 
12.
if "%delit%" equ "1" ECHO del "%Ordner%%filename:~0,4%%filter%" /Q 
13.
goto:eof
Bitte warten ..
Mitglied: master-chief
18.09.2008 um 14:20 Uhr
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.
Bitte warten ..
Mitglied: miniversum
18.09.2008 um 15:21 Uhr
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:
01.
@echo off 
02.
set "Ordner=C:\dateien\" 
03.
set "filter=*.txt" 
04.
FOR /F "delims=" %%i in ('dir /B /A-D "%Ordner%%filter%"') do call:check "%%i" 
05.
goto:eof 
06.
 
07.
:check 
08.
set "filename=%~1" 
09.
if not exist "%Ordner%%filename%" goto:eof 
10.
set delit=1 
11.
FOR /F "tokens=3 delims= " %%j in ('dir /A-D "%Ordner%%filename:~0,4%%filter%"') do if "%%j" neq "0" set delit=0 
12.
if "%delit%" equ "1" ECHO del "%Ordner%%filename:~0,4%%filter%" /Q 
13.
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.
Bitte warten ..
Mitglied: master-chief
18.09.2008 um 15:46 Uhr
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

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 ?
Bitte warten ..
Mitglied: miniversum
18.09.2008 um 16:16 Uhr
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:
01.
@echo off & setlocal 
02.
set "Ordner=" 
03.
set "filter=*.txt" 
04.
FOR /F "delims=" %%i in ('dir /B /A-D "%Ordner%%filter%"') do call:check "%%i" 
05.
goto:eof 
06.
 
07.
:check 
08.
set "filename=%~1" 
09.
if not exist "%Ordner%%filename%" goto:eof 
10.
set delit=1 
11.
FOR /F "delims=" %%j in ('dir /B /A-D "%Ordner%%filename:~0,4%%filter%"') do ( 
12.
set "size=" 
13.
FOR /F "skip=5 tokens=3 delims= " %%k in ('dir /A-D "%%~j"') do if not defined size ( 
14.
set "size=%%k" 
15.
if "%%k" neq "0" set delit=0 
16.
17.
18.
if "%delit%" equ "1" del "%Ordner%%filename:~0,4%%filter%" /Q 
19.
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).
Bitte warten ..
Mitglied: master-chief
19.09.2008 um 08:31 Uhr
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 ?
Bitte warten ..
Mitglied: miniversum
19.09.2008 um 10:21 Uhr
%%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 /?).
Bitte warten ..
Ähnliche Inhalte
Batch & Shell

Löschen in Abhängigkeit vom verfügbaren Speicherplatz

gelöst Frage von hugohugoBatch & Shell5 Kommentare

Hallo Allerseits, ich sichere meine Daten per simplen copy-job auf wechselnde externe HDDs. Jeden Abend wird ein nach Tagesdatum ...

HTML

Abhängigkeiten in einer HTML-Datei finden

Frage von StefanKittelHTML8 Kommentare

Hallo, ich arbeite gerade an einem Projekt in PHP (7.0) um webseiten statisch abzulegen. Um alle Folgeseiten und Abhängigkeiten ...

Batch & Shell

Dateien in Abhängigkeit des Dateinamens auf eine bestimmte Zeichenzahl kürzen und verschieben

gelöst Frage von Booster07Batch & Shell11 Kommentare

Hallo zusammen, ich habe zwei Probleme, bei denen ich auf Eure kompotente Hilfe hoffe: Problem 1: Ich habe sehr ...

Windows Userverwaltung

2 DCs und mehrere Gruppen bzw. Abteilungen voneinander unsichtbar machen (DC)

Frage von neueradmuserWindows Userverwaltung2 Kommentare

Hallo, ich habe 2 potentielle DC Server und würde dort gerne eine Domäne "ad.dienstleistung.de" einrichten (als Beispiel) die DC's ...

Neue Wissensbeiträge
Sicherheit

MikroTik-Router patchen, Schwachstelle wird ausgenutzt

Information von kgborn vor 16 StundenSicherheit

Am 23. April 2018 wurde von Mikrotik ein Security Advisory herausgegeben, welches auf eine Schwachstelle im RouterOS hinwies. Mikrotik ...

Windows 10

Microcode-Updates KB4090007, KB4091663, KB4091664, KB4091666 für Windows 10

Information von kgborn vor 23 StundenWindows 101 Kommentar

Kurze Information für Administratoren von Windows 10-Systemen, die mit neueren Intel CPUs laufen. Microsoft hat zum 23. April 2018 ...

iOS
Updates für Iphone und Co
Information von sabines vor 1 TagiOS

Gestern abend ist iOS 11.3.1 erschienen, ein kleineres Update, dass einige Lücken schließt und "Lahmlegen" nach einem Display Tausch ...

Windows 7

Windows 7 - Server 2008 R2: Exploit für Total Meltdown verfügbar

Information von kgborn vor 2 TagenWindows 7

Kleine Information für Administratoren, die für die Updates von Windows 7 SP1 und Windows Server 2008 R2 SP1 verantwortlich ...

Heiß diskutierte Inhalte
Batch & Shell
Powershell: Im AD nach Rechnern mit bestimmten IP-Adressen suchen
gelöst Frage von Raven42Batch & Shell36 Kommentare

Hallo zusammen, ich suche nach einer Möglichkeit nach Computern im AD zu suchen , deren IP-Adresse mit 10.11.12. beginnt. ...

C und C++
Frage1 C Programmierung-Makefile Frage2 PHP-Programmierung HTTP-Fehler 404
Frage von KatalinaC und C++34 Kommentare

Hallo, ich habe 2 Fragen, die nichts miteinander zu tun haben aber mit denen ich mich gerade beschäftige: 1. ...

LAN, WAN, Wireless
Watchguard T15 VPN Einrichtung
gelöst Frage von thomasjayLAN, WAN, Wireless25 Kommentare

Hallo zusammen, wir möchten gerne über unsere Watchguard T15 einen VPN-Tunnel (Mobile VPN with IPSec) einrichten! Als Client nutzen ...

Windows Server
Alten DC entfernen
Frage von smartinoWindows Server24 Kommentare

Hallo zusammen, ich habe hier eine Umgebung übernommen und erstmal einen DCDIAG gemacht. Dabei fällt auf, daß eine ganze ...