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

Mehrere Dateien in abhängigkeit voneinander Löschen

Frage Entwicklung Batch & Shell

Mitglied: master-chief

master-chief (Level 1) - Jetzt verbinden

18.09.2008, aktualisiert 19.09.2008, 3031 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 ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(1)

Tipp von agowa338 zum Thema Windows 10 ...

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

Frage von cali169 zum Thema Batch & Shell ...

Linux Tools
CURL mehrere Dateien vom ftp-Server herunterladen (10)

Frage von highpriest zum Thema Linux Tools ...

Windows 7
gelöst Mehrere Dateien in Windows umbenennen mit Batchjob (4)

Frage von Jeduja zum Thema Windows 7 ...

Microsoft Office
Excel VBA "SVERWEIS" über mehrere Dateien in Ordner (2)

Frage von Acht85 zum Thema Microsoft Office ...

Heiß diskutierte Inhalte
LAN, WAN, Wireless
gelöst Server erkennt Client nicht wenn er ausserhalb des DHCP Pools liegt (28)

Frage von Mar-west zum Thema LAN, WAN, Wireless ...

Outlook & Mail
Outlook 2010 findet ost datei nicht (18)

Frage von Floh21 zum Thema Outlook & Mail ...

Windows Server
Server 2008R2 startet nicht mehr (Bad Patch 0xa) (18)

Frage von Haures zum Thema Windows Server ...