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
GELÖST

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

Frage Entwicklung Batch & Shell

Mitglied: diekoenigs

diekoenigs (Level 1) - Jetzt verbinden

25.11.2008, aktualisiert 26.11.2008, 4910 Aufrufe, 8 Kommentare

Hallo Helferlein.

Ich möchte auf unserem Server gern einen Job laufen lassen,
welcher mir die Arbeit erleichtert. Dafür ist sowas ja da.
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..

Vielen Dank!

Gruß
Alex
Mitglied: napperman
25.11.2008 um 16:23 Uhr
Du willst zwar keine exe verwenden, aber delage32 ist dafür echt praktisch.
Bitte warten ..
Mitglied: diekoenigs
25.11.2008 um 17:50 Uhr
Okok.. wenn Du meinst.

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

Gruß
Alex
Bitte warten ..
Mitglied: Ren
25.11.2008 um 18:11 Uhr
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.
01.
@echo off & setlocal 
02.
 
03.
FOR /F %%i IN ('dir /aD /b ') DO call :checkIfEmpty "%%i" 
04.
goto :eof 
05.
 
06.
:checkIfEmpty 
07.
::Wenn es kein Verzeichns ist, ist doof 
08.
if not exist "%~1\*.*" goto :eof 
09.
if exist "%~1\*.*" dir /a-D "%~1\*.*" >nul 2>nul 
10.
if "%errorlevel%"=="1" echo "%~1" ist leer! 
11.
if "%errorlevel%"=="0" goto :eof 
12.
::mal nachgucken, wie alt das Verzeichnis ist... 
13.
set dirDate=%~t1 
14.
echo Das Verzeichnis ist vom %dirDate%. 
15.
goto :eof
Bitte warten ..
Mitglied: Ren
25.11.2008 um 18:23 Uhr
Und hier wären dann die leeren Dateien:
01.
FOR /F %%i IN ('dir /a-D /b ') DO call :checkIfEmpty1 "%%i" 
02.
:checkIfEmpty1 
03.
::Wenn es ein Verzeichns ist, ist doof 
04.
if exist "%~1\*.*" goto :eof 
05.
::mal nachgucken, wie alt die Datei ist... 
06.
set fileDate=%~t1 
07.
set fileSize=%~z1 
08.
if not "%fileSize%"=="0" goto :eof 
09.
echo Die Datei "%~1"" ist vom %dirDate% und leer. 
10.
goto :eof
Bitte warten ..
Mitglied: bastla
25.11.2008 um 19:52 Uhr
@Ren
Angeblich geht das mit VBS ganz einfach
Kannst Du ja selbst beurteilen:
01.
@echo off & setlocal 
02.
set TDiff=-1 
03.
set g=%Temp%\Gestern.vbs 
04.
>%g% echo g=DateAdd("d",%TDiff%,Date):WScript.Echo Left(g,2),Mid(g,4,2),Right(g,4) 
05.
for /f "tokens=1-3" %%i in ('cscript //nologo %g%') do set "Gestern=%%i.%%j.%%k" 
06.
del %g% 
07.
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" (Tag, Monat und Jahr werden getrennt zurückgegeben) ...

Grüße
bastla
Bitte warten ..
Mitglied: Biber
25.11.2008 um 21:53 Uhr
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
01.
set g=%Temp%\IsOlder.vbs 
02.
>%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.
01.
>for %i in (t*.txt) do @cscript //nologo %g% "%~ti" 80 && echo "%~ti"  älter als 80 Tage: %i 
02.
"23.01.07 10:52"  älter als 80 Tage: target4.txt 
03.
"24.10.06 19:12"  älter als 80 Tage: teltarif_2006-10-02_171541.txt 
04.
"24.01.07 00:00"  älter als 80 Tage: test37.txt 
05.
"20.02.08 12:24"  älter als 80 Tage: test97.txt 
06.
"20.02.08 12:24"  älter als 80 Tage: test98.txt 
07.
"20.02.08 12:24"  älter als 80 Tage: test99.txt 
08.
"26.02.08 20:57"  älter als 80 Tage: testout.txt 
09.
"08.05.08 10:32"  älter als 80 Tage: testrar.txt 
10.
"04.06.08 18:26"  älter als 80 Tage: testset.txt 
11.
"07.07.08 12:04"  älter als 80 Tage: text.txt 
12.
"30.10.07 19:23"  älter als 80 Tage: tmp2.txt 
13.
 
14.
(=21:37:31  D:\temp=) 
15.
>for %i in (t*.txt) do @cscript //nologo %g% "%~ti" 80 || echo "%~ti"  nicht älter als 80 Tage: %i 
16.
"15.09.08 17:45"  nicht älter als 80 Tage: text27.txt 
17.
"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...

Grüße
Biber
Bitte warten ..
Mitglied: diekoenigs
26.11.2008 um 09:01 Uhr
Hallo. Vielen Danke für die Antworten.

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

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

01.
FOR /F %%i IN ('dir /a-D /b ') DO call :checkIfEmpty1 "%%i" 
02.
:checkIfEmpty1 
03.
::Wenn es ein Verzeichns ist, ist doof 
04.
if exist "%~1\*.*" goto :eof 
05.
::mal nachgucken, wie alt die Datei ist... 
06.
set fileDate=%~t1 
07.
set fileSize=%~z1 
08.
if not "%fileSize%"=="0" goto :eof 
09.
echo Die Datei "%~1"" ist vom %dirDate% und leer. 
10.
goto :eof
Ist das so korrekt?
Bitte warten ..
Mitglied: diekoenigs
26.11.2008 um 09:26 Uhr
Ich denk es hat sich erledigt.

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.

Gruß
Alex
Bitte warten ..
Neuester Wissensbeitrag
Ähnliche Inhalte
Entwicklung
Versteckte .(Punkt)Dateien löschen (3)

Frage von DarkJM zum Thema Entwicklung ...

Batch & Shell
gelöst Powershell ältere Dateien löschen (6)

Frage von Cougar77 zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (33)

Frage von patz223 zum Thema Windows Userverwaltung ...

LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (21)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Viren und Trojaner
Aufgepasst: Neue Ransomware Goldeneye verbreitet sich rasant (20)

Link von Penny.Cilin zum Thema Viren und Trojaner ...