diekoenigs
Goto Top

Batch soll Verzeichnisse und Dateien löschen die älter als 3 Tage UND leer sind

Hallo Helferlein.

Ich möchte auf unserem Server gern einen Job laufen lassen,
welcher mir die Arbeit erleichtert. Dafür ist sowas ja da. face-smile
Und zwar, wie im Titel beschrieben:

Dateien und Ordner sollen gelöscht werden wenn
- sie leer nicht
UND
- älter als 3 Tage sind

Ich möchte keine exe verwenden!!!
Nur BATCH oder VBS.

Bitte helft.. face-smile

Vielen Dank!

Gruß
Alex

Content-ID: 102646

Url: https://administrator.de/contentid/102646

Ausgedruckt am: 25.11.2024 um 19:11 Uhr

napperman
napperman 25.11.2008 um 16:23:53 Uhr
Goto Top
Du willst zwar keine exe verwenden, aber delage32 ist dafür echt praktisch.
diekoenigs
diekoenigs 25.11.2008 um 17:50:52 Uhr
Goto Top
Okok.. wenn Du meinst. face-smile

Dann aber bitte mit nem Screenshot.
Denn mein "Vorgänger" meinte in einer Mail, er hätte es damit schon versucht. :D

Gruß
Alex
Ren
Ren 25.11.2008 um 18:11:23 Uhr
Goto Top
hm... Mit Datum in einer Batch rechen ist eklig. Angeblich geht das mit VBS ganz einfach, damit kenne ich mich aber nicht aus. Hier hättest du schon mal alle Verzeichnisse, die leer sind, und das Datum dazu auch, bezogen auf das Verzeichnis, aus dem die Batch gestartet wurde, ohne Unterverzeichnisse.
@echo off & setlocal

FOR /F %%i IN ('dir /aD /b ') DO call :checkIfEmpty "%%i"  
goto :eof

:checkIfEmpty
::Wenn es kein Verzeichns ist, ist doof
if not exist "%~1\*.*" goto :eof  
if exist "%~1\*.*" dir /a-D "%~1\*.*" >nul 2>nul  
if "%errorlevel%"=="1" echo "%~1" ist leer!  
if "%errorlevel%"=="0" goto :eof  
::mal nachgucken, wie alt das Verzeichnis ist...
set dirDate=%~t1
echo Das Verzeichnis ist vom %dirDate%.
goto :eof
Ren
Ren 25.11.2008 um 18:23:07 Uhr
Goto Top
Und hier wären dann die leeren Dateien:
FOR /F %%i IN ('dir /a-D /b ') DO call :checkIfEmpty1 "%%i"  
:checkIfEmpty1
::Wenn es ein Verzeichns ist, ist doof
if exist "%~1\*.*" goto :eof  
::mal nachgucken, wie alt die Datei ist...
set fileDate=%~t1
set fileSize=%~z1
if not "%fileSize%"=="0" goto :eof  
echo Die Datei "%~1"" ist vom %dirDate% und leer.  
goto :eof
bastla
bastla 25.11.2008 um 19:52:22 Uhr
Goto Top
@Ren
Angeblich geht das mit VBS ganz einfach
Kannst Du ja selbst beurteilen:
@echo off & setlocal
set TDiff=-1
set g=%Temp%\Gestern.vbs
>%g% echo g=DateAdd("d",%TDiff%,Date):WScript.Echo Left(g,2),Mid(g,4,2),Right(g,4)  
for /f "tokens=1-3" %%i in ('cscript //nologo %g%') do set "Gestern=%%i.%%j.%%k"  
del %g%
echo %Gestern%
Anstelle von "-1" für "gestern" die gewünschte Tagedifferenz in %TDiff% festlegen.

Um in einem Batch vergleichen zu können, wird wohl die Umwandlung beider Datumswerte in das Format "JJJJMMTT" am sinnvollsten sein (dann hast Du de facto "Zahlen") - daher auch das Script in der Fassung mit der Lizenz zum "Datum selber bauen" face-wink (Tag, Monat und Jahr werden getrennt zurückgegeben) ...

Grüße
bastla
Biber
Biber 25.11.2008 um 21:53:06 Uhr
Goto Top
Na, dann will ich mich auch nicht lumpen lassen.

Mein Ansatz:
1) Wenn es so ein Sahnetool wie Horst Schaffers DelAge32 gibt, kann es keinen vernünftigen Grund geben, diese Funktionalität mit ein paar VBSkript/Batchzeilen neu erfinden zu wollen.

2) Um irgendwelche quengeligen Ich-will-aber-Anwender zufrieden (oder zumindest ruhig) zu stellen, würde ich den VBSkript-Oneliner so gestalten (Demo am CMD-Prompt): Zeile für Zeile Copy & Pasten as is.
%temp%\isolder.vbs anlegen
set g=%Temp%\IsOlder.vbs
>%g% echo wscript.echo wscript.quit (1+(DateDiff("d",wscript.arguments(0),date) ^> int(wscript.arguments(1))))  

Proof-of-Concept: welche Dateien t*.txt sind älter als (beispielsweise) 80 Tage:
Zeilen mit ">" beginnend sind die Test-Befehle, der Rest ist Ausgabe.
>for %i in (t*.txt) do @cscript //nologo %g% "%~ti" 80 && echo "%~ti"  älter als 80 Tage: %i  
"23.01.07 10:52"  älter als 80 Tage: target4.txt  
"24.10.06 19:12"  älter als 80 Tage: teltarif_2006-10-02_171541.txt  
"24.01.07 00:00"  älter als 80 Tage: test37.txt  
"20.02.08 12:24"  älter als 80 Tage: test97.txt  
"20.02.08 12:24"  älter als 80 Tage: test98.txt  
"20.02.08 12:24"  älter als 80 Tage: test99.txt  
"26.02.08 20:57"  älter als 80 Tage: testout.txt  
"08.05.08 10:32"  älter als 80 Tage: testrar.txt  
"04.06.08 18:26"  älter als 80 Tage: testset.txt  
"07.07.08 12:04"  älter als 80 Tage: text.txt  
"30.10.07 19:23"  älter als 80 Tage: tmp2.txt  

(=21:37:31  D:\temp=)
>for %i in (t*.txt) do @cscript //nologo %g% "%~ti" 80 || echo "%~ti"  nicht älter als 80 Tage: %i  
"15.09.08 17:45"  nicht älter als 80 Tage: text27.txt  
"20.11.08 12:45"  nicht älter als 80 Tage: tmp3.txt  

Gefühlter Vorteil meiner Variante:
  • Ich übergebe den Wert "Differenz in Tagen" als Parameter, habe also -falls ich die ISOlder.vbs Nicht als Temp-Datei, sondern als Utility dauerhaft nutzen wollte, ein Mindestmaß an Flexibilität
  • Da ich nur True/False bzw Errorlevel 0 oder 1 zurückgebe, brauche ich nicht mit dem blöden Datum rumrechnen im Batch

In Kauf genommene Nachteile:
  • ist kryptisch und fast unwartbar
  • und, da keine Ausgabe des Datums oder auch nur der Datumsdifferenz erfolgt, muss man/frau das Funktionieren dieses Schnipsels entweder vorher ausgiebig testen.... oder halt glauben...
  • es ist natürlich Dönekens, für 1000 Dateien 1000x vom Batch aus eine Zeile VBS aufzurufen. Es sollte komplett in einem VBS-Schnipsel abgefackel werden.
  • größter Nachteil: es ist - verglichen mit DelAge32 natürlich so langsam wie ein Scharping spricht.

Aber damit wir hier endlich einen Haken an das Thema bekommen... face-wink

Grüße
Biber
diekoenigs
diekoenigs 26.11.2008 um 09:01:12 Uhr
Goto Top
Hallo. Vielen Danke für die Antworten.

Für mich als VBS Neuling.. muss ich nun die beiden Scripte zusammenschnipseln?

@echo off & setlocal
set TDiff=-1
set g=%Temp%\Gestern.vbs
>%g% echo g=DateAdd("d",%TDiff%,Date):WScript.Echo Left(g,2),Mid(g,4,2),Right(g,4)  
for /f "tokens=1-3" %%i in ('cscript //nologo %g%') do set "Gestern=%%i.%%j.%%k"  
del %g%
echo %Gestern%

und dann

FOR /F %%i IN ('dir /a-D /b ') DO call :checkIfEmpty1 "%%i"  
:checkIfEmpty1
::Wenn es ein Verzeichns ist, ist doof
if exist "%~1\*.*" goto :eof  
::mal nachgucken, wie alt die Datei ist...
set fileDate=%~t1
set fileSize=%~z1
if not "%fileSize%"=="0" goto :eof  
echo Die Datei "%~1"" ist vom %dirDate% und leer.  
goto :eof

Ist das so korrekt?
diekoenigs
diekoenigs 26.11.2008 um 09:26:42 Uhr
Goto Top
Ich denk es hat sich erledigt. face-smile

Es sollen nun doch IMMER alles Ordner gelöscht werden, wenn sie älter als 3 Tage sind.
Somit habe ich nun ein Scribt.

Danke für die Hilfe. face-smile

Gruß
Alex