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
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
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
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
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
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!
"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
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!
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
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
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 =(
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!
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!
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!

