Supportnet Computer
Planet of Tech

Supportnet / Forum / BS-Sonstige

Batch: Dateien löschen





Frage

hallo zusammen, brauch mal unbedingt eure hilfe. folgendes problem: ich möchte durch eine batch-file dateien in einem ordner löschen, die älter sind als 5 tage. habe folgendes ausprobiert: @echo off cd d:\Batch-Log\ for /f %%i in ('dir /B /OGD') do set var=%%i for %%i in (*) do if not %%i==%var% del %%i set var= dadurch werden aber alle dateien außer der aktuellsten gelöscht. ich möchte aber nur die löschen, die älter sind als 5 tage! wie ist das zu machen??? danke vorab MFG Eric

Antwort 1 von steffen2

schau dir mal xset an

Gruß Steffen

Antwort 2 von manei

Hallo,

das ist ja auch ganz klar.

In der ersten for-Zeile sortierst du nach Datum und schreibst in var die jüngste Datei nur mit dem Namen rein (Option /b).

In der zweiten for-Zeile fragst du nun die Namen aller Dateien ab ob sie gleich dem Namen der jüngsten Datei sind und diese sind nie gleich.

Das aktuelle Datum - 5 Tage hast du nirgends definiert.

Deinem Batchaufbau entnehme ich, daß du mit W2k oder WinXP arbeitest. Hier hast du viel mehr Möglichkeiten als unter Win9x-Systemen.
Aber zunächst mußt Du das Datum (heute-5) bestimmen. Da hier ja auch der Monat immer richtig mitbestimmt werden muß geht das am bestem mit einer Batch/vbs wie:

date_5.bat
@echo off
cls
echo S=%date%>%temp%.\~tmp.vbs
echo S=DateAdd("d", -5, (S))>>%temp%.\~tmp.vbs
echo Wscript.Echo "set xd="+CStr(S)>>%temp%.\~tmp.bat
cscript.exe //nologo %temp%.\~tmp.vbs>>%temp%.\~tmp.bat
for %%e in (%temp%.\~tmp.bat del) do call %temp%.\~tmp.???
cls

Damit hast Du das gewünschte Datum in der Variablen xd.

Mir dir bekommst du eine Auflistung mit 7 Spalten. Für Deine Zwecke benötigst Du Spalte 5 (Datum) zum Vergleich und Spalte 7 (Dateiname) zum löschen. Das machst du mit Tokens 5, 7 und den Vergleich des Datums machst du mit LEQ = kleiner/gleich.

Würde deine for-Zeile also lauten

for /f "tokens 5, 7" %%i in ('dir d:\Batch-Log') do if %%i LEQ %xd% del %%j>nul

Deine Batch würde dann aussehen

@echo off
cls
cd d:\Batch-Logcall date_5.bat
for /f "tokens 5, 7" %%i in ('dir d:\Batch-Log') do if %%i LEQ %xd% del %%j>nul
set xd=
cls

Da ich hier kein Win2000 oder XP zur Verfügung habe, konnte das nicht getestet werden, im großen und ganzen müßte es aber stimmen. Speziell die Spalten bei "dir" solltest du vorher mal durch einfachen Aufruf testen. Spalte 5=%%i und Spalte 7=%%j, werden diese anders dargestellt, dann bei tokens entsprechend ändern.

MfG maneich



Antwort 3 von manei

Hallo,

habe mit die Batch date_5.bat nochmals angesehen, waren ein paar kleine Fehler drinnen. so wie es unten steht, ist es aber richtig:

date_5.bat
@echo off
cls
echo S=date>%temp%.\~tmp.vbs
echo S=DateAdd("d", -5, (S))>>%temp%.\~tmp.vbs
echo Wscript.Echo "set xd="+CStr(S)>>%temp%.\~tmp.vbs
cscript.exe //nologo %temp%.\~tmp.vbs>%temp%.\~tmp.bat
pause
for %%e in (%temp%.\~tmp.bat del) do call %%e %temp%.\~tmp.???
cls

MfG maneich

Antwort 4 von muab25X

wow! das hat mich nun wirklich beeindruckt und inspiriert:

wie wuerde es funktionieren via batch DAS aelteste file zu loeschen aber NUR wenn das attrib "archive" nicht (mehr) gesetzt ist?

thx
muab

Antwort 5 von manei

@Eric_ST

sehe gerade, bei der Übertragung der einen Batch hat sich ein Fehler eingeschlichen. Was hier in einer Zeile steht, muß natürlich in 2 Zeilen stehen:

cd d:\Batch-Logcall date_5.bat (muß sein)

cd d:\Batch-Log
call date_5.bat

Bei der if Abfrage wirst Du noch /i benötigen, also

for /f "tokens 5, 7" %%i in ('dir d:\Batch-Log') do if /i %%i LEQ %xd% del %%j>nul

@muab25X

Deine Frage verstehe ich nicht ganz, Archive wird systemmäßig bei jeder Datei gesetzt die abgespeichert wird. Aber was solls.

Mit

dir /b /o:-d Laufw:\Verzeichnis>%temp%.\tmp.txt
for /f "tokens 7" %%i in (%temp%.\tmp.txt) do set x=%%i
for /f "tokens 1" %%i in ('attrib Laufw:\Verzeichnis\%x%) do if /i %%i==A del Laufw:\Verzeichnis\%x%>nul

sollte es klappen

MfG maneich




Antwort 6 von Massaraksch!

Es gibt von M$ das Kommandozeilen-Tool

"forfiles.exe"

Damit ist das Löschen nach Alter in einer Zeile gegessen...

Massaraksch!

Antwort 7 von Massaraksch!

PS: Natürlich nicht nur löschen sondern jede mögliche andere (Kommandozeieln-)Aktion.

Antwort 8 von Rodi

Hi.
Ich sage nur AutoIt rulez. :)
Dabei handelt es sich um eine relativ einfache Skriptsprache, die es ermöglicht fast alle Windows Vorgänge zu skripten und in eine EXE Datei zu packen. Dos Kommandos betrifft das natürlich auch.
Ich persönlich will es gar nicht mehr missen. ;)
www.hiddensoft.com
Kleie Anmerkung. Dieses Programm ist Freeware.
Gruss @all,
Dirk

Antwort 9 von Massaraksch!

Noch'n Beispiel:

FORFILES -pD:\Batch-Log -s -m*.* -d-5 -c"cmd /c del 0x22@FILE0x22"

sollte alle Dateien die älter als 5 Tage sind aus dem Verzeichnis D:\Batch-Log löschen.

Die 0x22-Strings stellen Anf.zeichen im Hex-Code dar wegen evtl. Leerzeichen im Dateinamen. Wenn keine Leerzeichen zu erwarten sind kann man die 0x22 auch weglassen.

Massaraksch!

Antwort 10 von muab25X

@manei

danke =)

die sache ist die dass nach dem kopieren von xcopy (in der autorun meiner externen backup platte) ist das archive naemlich nicht mehr gesetzt.

ergo wuerde deine batch dann nur loeschen wenn ich auch schon ein backup davon habe, und irgendwie muss ich mir noch basteln dass die batch erst startet wenn die platte voll wird...
soweit die theorie.. naja, mal ein bisserl probieren =)

muab

Antwort 11 von manei

Hallo,

Chkdsk liefert Dir in der 8. Zeile 1. Spalte den noch freien Speicherplatz und in der 7. Zeile 1. Spalte den gesamten Speicherplatz in KB. Damit sollte sich was machen lassen.

Mit skip kannst Du ja Zeilen überspringen.

MfG maneich

Antwort 12 von muab25X

@manei

funktionuckelt auch mit dir+find, das auswerten als solches ist wohl nur etwas schwieriger als ich mir vorgestellt hatte =(

Antwort 13 von Massaraksch!

Grad gesehen, daß hier FTP-Links nicht so richtig funktionieren. Sollte doch jemand eine Lösung mit "forfiles.exe" versuchen wollen, dann hier nochmal die Download-Adresse:

ftp.microsoft.com/ResKit/y2kfix/x86/forfiles.exe

Zum Test, wieviel Platz auf einem Laufwerk noch ist, hat mir ein SN-Member mal ein Kommandozeilentool gezeigt:

DskFree

Da könnte man z.B. mittels

dskfree c: 5242880

testen, ob auf c: noch mind. 5MB frei sind. Wenn nicht, dann gibt es einen Errorlevel 1 zurück, den man dann einfach auswerten könnte. Näheres in der dskfree.txt

Massaraksch!

Antwort 14 von Massaraksch!

Ach da fällt mir noch ein...

Ehe man zum Berechnen der Datumsdifferenzen VB-Script zusammen mit Batches einsetzt, dann könnte man das vielleicht besser alles mittels VB-Script lösen. Da geht das dann doch etwas bequemer (ohne große Umleitungen, TMP-Dateien usw.)

Kurzes Beispiel:

'Gewünschte Daten eintragen (Verzeichnis und Dateialter)
verz = "D:\Batch-Log"
tage = 5

Set fso = CreateObject("Scripting.FileSystemObject")
Set verz = fso.GetFolder(verz)
Set dateien = ordner.files
heute = date()
for each datei in dateien
if datei.DateLastModified < (heute - tage) then
datei.delete
end if
next

Zur Ermittlung von freiem Speicherplatz usw. gibts da natürlich auch Funktionen. So ungefähr "if Objekt.FreeSpace < irgendwas then ..."

Massaraksch!

Ich möchte kostenlos eine Frage an die Mitglieder stellen:


Ähnliche Themen:


Suche in allen vorhandenen Beiträgen: