anfaenger500
Goto Top

Auch Ordner per vbs löschen, Logfile erstellen und per Email versenden

Hallo Forumteilnehmer,
ich habe hier ein Script was mir mal ein Bekannter zusammengebastelt hatte.

Ich selber kann kein VB und wollte deshalb bei euch anfragen, ob ihr mir bitte weiterhelfen könnt.

Beim Script möchte ich gern auch Ordner löschen können statt nur Dateien.
Desweiteren hatte ich mir vorgestellt, dass mir nach erfolgter Löschung ein Logfile erzeugt wird und dieses dann per E-Mail versendet wird.

Mir ist bewusst, dass das Forum dazu dient um zu lernen, aber mir fehlen ja schon die Basics und daher hoffe ich auf eure Mithilfe.

Vielen Dank schonmal.

'*************************************************************************  
'   
'Dateien die älter als intTage sind löschen  
'  
'DateLastModified=Änderungsdatum; DateCreated=Erstellungsdatum  
'WScript.Echo intZahl & " Dateien gelöscht." (Ausgabe gelöschter Dateien  
'  
'*************************************************************************  

Set objFSO = CreateObject("Scripting.FileSystemObject")  
strOrdner = "D:\"			'Ordnerpfad angeben  
strExtension = ""	  
intTage = 1				'Anzahl der Tage angeben  

Set objOrdner = objFSO.GetFolder(strOrdner)
intZahl = 0
For Each objDatei In objOrdner.Files
    If LCase(Right(objDatei.name, Len(strExtension))) = LCase(strExtension) _ 
        And DateDiff("d", objDatei.DateLastModified, Now) > intTage Then  
        objDatei.Delete
        intZahl = intZahl + 1
    End If
Next

Content-Key: 162124

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

Printed on: April 19, 2024 at 23:04 o'clock

Member: bastla
bastla Mar 06, 2011 at 19:27:12 (UTC)
Goto Top
Hallo anfaenger500!

Um auch Unterordner zu löschen, wäre etwa folgender (ungetesteter) Zusatz erforderlich:
For Each objUnterordner In objOrdner.SubFolders
    If DateDiff("d", objUnterordner.DateLastModified, Now) > intTage Then  
        objUnterordner.Delete
        intOrdner = intOrdner + 1
    End If
Next
WScript.Echo intOrdner & " Ordner gelöscht."  
Hier wird nur auf das Alter abgestellt - eine Überprüfung des Namens wäre aber analog zum obigen Ansatz ebenfalls möglich ...

Grüße
bastla
Member: anfaenger500
anfaenger500 Mar 07, 2011 at 21:53:41 (UTC)
Goto Top
Hallo bastla,

habe den Code man angepasst und ausgeführt.

Nur leider passiert da gar nichts. face-sad

Könntest du mir bitte nochmal helfen!

Danke und Gruß

'*************************************************************************  
'   
'Dateien die älter als intTage sind löschen  
'  
'DateLastModified=Änderungsdatum; DateCreated=Erstellungsdatum  
'WScript.Echo intZahl & " Dateien gelöscht." (Ausgabe gelöschter Dateien  
'  
'*************************************************************************  

Set objFSO = CreateObject("Scripting.FileSystemObject")  
strOrdner = "C:\Sicherungsordner"			'Ordnerpfad angeben  
strExtension = ""	  
intTage = 1				'Anzahl der Tage angeben  

Set objOrdner = objFSO.GetFolder(strOrdner)
intZahl = 0
For Each objDatei In objOrdner.Files
    If LCase(Right(objDatei.name, Len(strExtension))) = LCase(strExtension) _ 
        And DateDiff("d", objDatei.DateLastModified, Now) > intTage Then  
        objDatei.Delete
        intZahl = intZahl + 1
    End If
Next
 
For Each objUnterordner In objOrdner.SubFolders 
    If DateDiff("d", objUnterordner.DateLastModified, Now) > intTage Then   
    	objUnterordner.Delete 
    	intOrdner = intOrdner + 1 
    End If 
Next 
Member: bastla
bastla Mar 08, 2011 at 06:41:21 (UTC)
Goto Top
Hallo Anfaenger500!

Versuch es mit der folgenden - um ein wenig Dokumentation erweiterten, aber immer noch ungetesteten - Variante:
For Each objUnterordner In objOrdner.SubFolders
    Doku = Doku & vbCrLf & DateDiff("d", objUnterordner.DateLastModified, Now) & vbTab & objUnterordner.Name  
    If DateDiff("d", objUnterordner.DateLastModified, Now) > intTage Then  
    	objUnterordner.Delete
    	intOrdner = intOrdner + 1
    End If
Next
WScript.Echo Mid(Doku, 3)
Es wird für jeden Unterordner das ermittelte Alter angezeigt ...

Grüße
bastla
Member: anfaenger500
anfaenger500 Mar 08, 2011 at 16:44:49 (UTC)
Goto Top
Hallo bastla,

habe das Script wie folgt erweitert:

'*************************************************************************  
'   
'Dateien die älter als intTage sind löschen  
'  
'DateLastModified=Änderungsdatum; DateCreated=Erstellungsdatum  
'WScript.Echo intZahl & " Dateien gelöscht." (Ausgabe gelöschter Dateien)  
'  
'*************************************************************************  

Set objFSO = CreateObject("Scripting.FileSystemObject")  
strOrdner = "D:\"			'Ordnerpfad angeben  
strExtension = ""	  
intTage = 1				'Anzahl der Tage angeben  

Set objOrdner = objFSO.GetFolder(strOrdner)
intZahl = 0
For Each objDatei In objOrdner.Files
    If LCase(Right(objDatei.name, Len(strExtension))) = LCase(strExtension) _ 
        And DateDiff("d", objDatei.DateLastModified, Now) > intTage Then  
        objDatei.Delete
        intZahl = intZahl + 1
    End If
Next

For Each objUnterordner In objOrdner.SubFolders 

    Doku = Doku & vbCrLf & DateDiff("d", objUnterordner.DateLastModified, Now) & vbTab & objUnterordner.Name   

    If DateDiff("d", objUnterordner.DateLastModified, Now) > intTage Then   

       objUnterordner.Delete 

       intOrdner = intOrdner + 1 

    End If 

Next 

WScript.Echo Mid(Doku, 3)

Nur leider bekomme ich da folgende Fehlermeldung:

Kann leider keine Bilder hochladen, daher schreibe ich es mal so ab.
Zeile: 32
Zeichen: 8
Fehler: Erlaubnis verweigert
Code: 800A0046
Quelle: Laufzeitfehler in Microsoft VBScript

Ist echt doof, wenn man die Scprache nicht kann. face-sad

Danke und Gruß
Member: bastla
bastla Mar 08, 2011 at 16:55:29 (UTC)
Goto Top
Hallo anfaenger500!
Ist echt doof, wenn man die Scprache nicht kann. face-sad
"Erlaubnis verweigert" (dürfte sich auf die "Lösch"-Zeile, gepostet als Zeile 31, beziehen) bedarf aber doch eigentlich keiner Übersetzung ...

Wenn Du das Script aus der CMD-Shell mit
cscript C:\Scriptordner\Scriptname.vbs
startest, könntest Du den letzten Teil (ab Zeile 25) auf
For Each objUnterordner In objOrdner.SubFolders 
    If DateDiff("d", objUnterordner.DateLastModified, Now) > intTage Then   
        WScript.Echo "Lösche jetzt " & objUnterordner.Name  
        objUnterordner.Delete 
    End If 
Next 
ändern und Dir jeweils den zu löschenden Ordner vorweg anzeigen lassen, damit Du erkennen kannst, welcher Ordner (jetzt / von Dir) nicht gelöscht werden kann ...

Grüße
bastla
Member: Biber
Biber Mar 08, 2011 at 17:59:06 (UTC)
Goto Top
Moin anfaenger500 und bastla,

ich lese diesen Thread auch von Beginn an mit... und immer mit etwas Skepsis.

Ich würde wirklich die zuletzt von bastla geposteten Zeile noch weiter entschärfen durch ein Auskommentieren der Zeile 4, also des .delete-Befehls.

bis wirklich auch klar ist, was denn passieren würde, wenn über den in (ein Skript vorher in Zeile 11) stehenden
strOrdner = "D:\" 'Ordnerpfad angeben
...drübergewalzt wird.
Ob das so wirklich der echte Plan ist, da alles zu löschen, was sich seit einem Tag nicht bewegt hat...

Ich halte es für KEINE gute Idee, ein VBS-Löschskript auf dem Rechner zu haben, wenn der Inhalt noch nicht vollständig klar und nachvollziehbar ist.

@anfaenger500:
Das soll keine Abwertung deiner Fähigkeiten sein, aber .... du fängst ja gerade an mit VBS-Krams.
Und Löschen per Skript ist zumindest unter Windows nicht die beste Spielwiese.

Grüße
Biber
Member: anfaenger500
anfaenger500 Mar 09, 2011 at 22:13:53 (UTC)
Goto Top
Hallo Biber,

vielen Dank für deinen Beitrag, aber wie würdest du folgende Anforderung lösen?

Das ganze soll automatisch und nachts vollzogen werden.

Alle Backups und D:\ sollen nach voreingestellter Zeitangabe (Tage) gelöscht werden, damit mir die Platte nicht vollläuft.

Bin wirklich für alle Vorschläge offen. Nur so kann man effektiv dazuz lernen.

Danke und Grüße
Member: Biber
Biber Mar 10, 2011 at 07:50:53 (UTC)
Goto Top
Moin anfaenger500,

meinen ersten Schritt habe ich schon genannt - ich würde -eigentlich immer, noch immerer bei Löschskripten erstmal einen <proof-of-concept mit einer ECHO bzw. WScript.echo-Ausgabe machen, um zu sehen, was passieren würde.

Ich weiss, dass das ein sehr banaler Vorschlag ist, aber denke dennoch, dass er dir durchaus ein paar Probleme vom Hals halten könnte

Grüße
Biber