meiseed
Goto Top

Alte Dateien nach x Tagen löschen und dabei bestimmte Dateiendungen ausschließen

HI @ all,

ich hab da mal eine Frage zu diesem Script der in Shell ist.

'************************************************************  
'   
' Löscht alle Dateien, die seit einem bestimmten Datum  
' nicht mehr geändert wurden  
'  
'************************************************************  

Set fso = CreateObject("Scripting.FileSystemObject")  
Set WSHShell = WScript.CreateObject("WScript.Shell")  
On Error Resume Next


'******* hier eigenen Bedürfnissen anpassen *****************  

dim Verzeichnis(2)
Verzeichnis(0) = "Z:\BtD\System_tgl\"  
Verzeichnis(1) = "z:\BtD\Exchange2003\"  
REM Verzeichnis(2) = "C:\Temp\Verlauf"  

Aufheben    = 1 'Anzahl der Tage  

'********Ende der Anpassungen********************************  


for n=0 to 2
	Set ordner = fso.GetFolder(Verzeichnis(n))
	heute = Date()
	DeleteInFolder(ordner)
next

Sub DeleteInFolder(ordner)
	Set dateien = ordner.Files
	' Alle Dateien in diesem Ordner abklappern  
	For Each datei In dateien
	  If datei.DateLastModified < (heute - Aufheben) Then
	    on error resume next
	     datei.delete
             if err and err<>70 then msgbox "Unerwarteter Fehler (Code="&err&")",16 : wscript.quit  
             on error goto 0
	  End If
   	 Next

   	 'Unterordner abklappern, DeleteInFolder rekursiv aufrufen  
   	 For Each unter In ordner.SubFolders
   	   DeleteInFolder(unter)
    	   If (unter.SubFolders.Count + unter.Files.Count) = 0 Then
               unter.Delete
       End If
    Next
End Sub

Hier mal meine Frage kann man den Script so ändern das er bestimmte Dateiendungen nicht löscht wie z.B. *.cfg oder kann man es nicht machen, wenn nicht könnte mir einer von euch einen link geben wo ich so einen Script finden könnte oder mir gleich so einen geben.
Wäre sehr nett von euch.

MFG:
MeiSeed

Content-Key: 73406

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

Printed on: April 18, 2024 at 11:04 o'clock

Member: bastla
bastla Nov 13, 2007 at 11:44:54 (UTC)
Goto Top
Hallo MeiSeed!

Das geänderte Script könnte etwa so aussehen:
Set fso = CreateObject("Scripting.FileSystemObject")  
Set WSHShell = WScript.CreateObject("WScript.Shell")  
On Error Resume Next


'* hier eigenen Bedürfnissen anpassen *  

Verzeichnis = Array(_
	"Z:\BtD\System_tgl\", _  
	"z:\BtD\Exchange2003\", _  
	"C:\Temp\Verlauf" _  
)

Exclude = ".cfg.ini.set" 'Endungen nicht zu löschender Dateien  
Aufheben = 1 'Anzahl der Tage  

' * Ende der Anpassungen *  

Heute = Date()
For n = 0 To UBound(Verzeichnis) 
	Set Ordner = fso.GetFolder(Verzeichnis(n))
	DeleteInFolder(Ordner)
Next

Sub DeleteInFolder(Ordner)
Set Dateien = Ordner.Files
' Alle Dateien in diesem Ordner abklappern  
For Each Datei In Dateien
	If Datei.DateLastModified < (Heute - Aufheben) Then
		Ext = Mid(Datei.Name, InStrRev(Datei.Name, "."))  
		If InStr(Exclude, Ext) = 0 Then
			On Error Resume Next
			Datei.Delete
			If Err And Err <> 70 Then MsgBox "Unerwarteter Fehler (Code=" & Err & ")", vbCritical: WScript.Quit  
			On Error Goto 0
		End If
	End If
Next

'Unterordner abklappern, DeleteInFolder rekursiv aufrufen  
For Each Unter In Ordner.SubFolders
	DeleteInFolder(Unter)
	If (Unter.SubFolders.Count + Unter.Files.Count) = 0 Then Unter.Delete
Next
End Sub

Grüße
bastla
Member: MeiSeed
MeiSeed Nov 13, 2007 at 12:32:41 (UTC)
Goto Top
Danke dir für die antwort werd es mal testen ob es geht

gruß
MeiSeed
Member: MeiSeed
MeiSeed Nov 15, 2007 at 08:30:40 (UTC)
Goto Top
Das Script geht einbeifrei.

Ich hab aber noch eine kleine frage zu dem Script.

Kann man es irgentwie machen das man die Ordner und die nicht zu löschenden dateienendungen nicht in dem Script eintragen muss.

Sondern:

1. das man die in einer textdatei speichert und sich das Script die dann daraus holt.

oder

2. es wird eine messeg angezeigt wo mann die zu löschenden Dateien und Ordner eintragen kann.


gruß
MeiSeed
Member: bastla
bastla Nov 15, 2007 at 14:01:03 (UTC)
Goto Top
Hallo MeiSeed!

Wenn Du in eine Textdatei jeweils einen Ordner je Zeile schreibst, kannst Du diese so lesen:
strOrdnerliste = "D:\Sicherung\Ordnerliste.txt"  

Set fso = CreateObject("Scripting.FileSystemObject")  
Set objOrdnerliste = fso.OpenTextFile(strOrdnerliste, 1)

Verzeichnis = Split(objOrdnerliste.ReadAll, vbCrLF)

objOrdnerliste.Close
Mit ".ReadAll" wird der gesamte Inhalt der Textdatei gelesen und mit "Split()" in ein Array aufgeteilt, wobei als Trennzeichen für die Aufteilung das Zeilenende ("vbCrLF") gilt. Als Ergebnis steht dann jede Zeile der Textdatei in einem Element des Arrays "Verzeichnis" und Du kannst den Rest des Programmes wie bisher verwenden.

Für die nicht zu löschenden Dateiendungen kannst Du eine weitere Textdatei erstellen und alle Endungen (wie im Script für die Variable "Exclude") in eine Zeile schreiben. Zum Auslesen kannst Du wie oben vorgehen, wobei Du allerdings nur die erste Zeile benötigst.
strAusschlussliste = "D:\Sicherung\Ausschluss.txt"  

Set fso = CreateObject("Scripting.FileSystemObject")  
Set objAusschlussliste = fso.OpenTextFile(strAusschlussliste, 1)

If Not objAusschlussliste.AtEndOfStream Then 'falls nicht schon am Dateiende (= Datei ist leer) ...  
	Exclude = objAusschlussliste.ReadLine ' ... erste Zeile lesen und speichern ...  
Else
	Exclude = "" '... ansonsten gibt es keine Ausnahmen beim Löschen.  
End If

objAusschlussliste.Close
Das "Set fso=..." brauchst Du natürlich innerhalb eines Scripts nur einmal zu schreiben.

Grüße
bastla
Member: MeiSeed
MeiSeed Nov 16, 2007 at 07:52:07 (UTC)
Goto Top
hi bastla

irgent wie hab ich da ein fehler drin, weil wenn ich in der ordnerliste pro zeile ein ordner anlege wird nur die erste zeile gelöscht und nicht die andere die list er nicht aus.

Woran kann das liegen.

Und die nicht gelöscht sollen die gehen.


und ich hab es mal auch mal mit Input versucht aber wenn ich die Variable dann in die Array angebe und dann das Script ausführe bekomm ich die meldung das ich ein Ordner angeben soll das mach ich auch aber es wird dann nichts in dem Ordner gelöscht.

Warum wird das was in der Variable steht nicht in die Array übernommen.

Gruß
MeiSeed
Member: bastla
bastla Nov 16, 2007 at 08:57:04 (UTC)
Goto Top
Hallo MeiSeed!

Die beiden Codeabschnitte sollen als Ersatz für die bisher im Script vorgenommenen Festlegungen dienen, also sähe der entsprechende Codeteil so aus:
'* hier eigenen Bedürfnissen anpassen *  

strOrdnerliste = "D:\Sicherung\Ordnerliste.txt"  
strAusschlussliste = "D:\Sicherung\Ausschluss.txt"  

Set fso = CreateObject("Scripting.FileSystemObject")  

Set objOrdnerliste = fso.OpenTextFile(strOrdnerliste, 1)
Verzeichnis = Split(objOrdnerliste.ReadAll, vbCrLF)
objOrdnerliste.Close

Set objAusschlussliste = fso.OpenTextFile(strAusschlussliste, 1)
If Not objAusschlussliste.AtEndOfStream Then 'falls nicht schon am Dateiende (= Datei ist leer) ...  
	Exclude = objAusschlussliste.ReadLine ' ... erste Zeile lesen und speichern ...  
Else
	Exclude = "" '... ansonsten gibt es keine Ausnahmen beim Löschen.  
End If

objAusschlussliste.Close

Aufheben = 1 'Anzahl der Tage  

' * Ende der Anpassungen *  
Eigentlich sollte mit dem dargestellten Code das Einlesen aller einzeln (zeilenweise) angegebenen Ordner gelingen.
Wenn Du mit einer InputBox arbeiten willst (die Eingabe steht dann zb in "strEingabe"), müstest Du diese Eingabe mit
Verzeichnis = Array(strEingabe)
in das Array "Verzeichnis" stellen, damit der Rest des Programmes unverändert bleiben kann.

Grüße
bastla
Member: MeiSeed
MeiSeed Nov 16, 2007 at 09:54:25 (UTC)
Goto Top
Danke dir

Ich hab es jetzt mit der InputBox es geschaft.

Aber das mit den Textdateien klapt leider nicht ist abernicht schlimm weil mit InputBox ist es besser.

Und ich hab da noch ein prob gefunden.

Wenn ich jetzt den Ordner angeb in dem er alles löschen soll löscht er auch aber er löscht nicht die unterordner.
Member: bastla
bastla Nov 16, 2007 at 13:19:34 (UTC)
Goto Top
Hallo MeiSeed!

Ich habe eben das Script in der folgenden Fassung (einzige Änderung gegenüber oben: "Set fso = ..." steht nur in der allerersten Scriptzeile) getestet und keine Problem hinsichtlich des Einlesens der Ordner oder hinsichtlich des Löschens von leeren Ordnern gefunden.
Set fso = CreateObject("Scripting.FileSystemObject")  
Set WSHShell = WScript.CreateObject("WScript.Shell")  
On Error Resume Next

'* hier eigenen Bedürfnissen anpassen *  

strOrdnerliste = "D:\Sicherung\Ordnerliste.txt"  
strAusschlussliste = "D:\Sicherung\Ausschluss.txt"  

Set objOrdnerliste = fso.OpenTextFile(strOrdnerliste, 1)
Verzeichnis = Split(objOrdnerliste.ReadAll, vbCrLF)
objOrdnerliste.Close

Set objAusschlussliste = fso.OpenTextFile(strAusschlussliste, 1)
If Not objAusschlussliste.AtEndOfStream Then 'falls nicht schon am Dateiende (= Datei ist leer) ...  
	Exclude = objAusschlussliste.ReadLine ' ... erste Zeile lesen und speichern ...  
Else
	Exclude = "" '... ansonsten gibt es keine Ausnahmen beim Löschen.  
End If

objAusschlussliste.Close

Aufheben = 1 'Anzahl der Tage  

' * Ende der Anpassungen *  

Heute = Date()
For n = 0 To UBound(Verzeichnis) 
	Set Ordner = fso.GetFolder(Verzeichnis(n))
	DeleteInFolder(Ordner)
Next

Sub DeleteInFolder(Ordner)
Set Dateien = Ordner.Files
' Alle Dateien in diesem Ordner abklappern  
For Each Datei In Dateien
	If Datei.DateLastModified < (Heute - Aufheben) Then
		Ext = Mid(Datei.Name, InStrRev(Datei.Name, "."))  
		If InStr(Exclude, Ext) = 0 Then
			On Error Resume Next
			Datei.Delete
			If Err And Err <> 70 Then MsgBox "Unerwarteter Fehler (Code=" & Err & ")", vbCritical: WScript.Quit  
			On Error Goto 0
		End If
	End If
Next

'Unterordner abklappern, DeleteInFolder rekursiv aufrufen  
For Each Unter In Ordner.SubFolders
	DeleteInFolder(Unter)
	If (Unter.SubFolders.Count + Unter.Files.Count) = 0 Then Unter.Delete
Next
End Sub

Grüße
bastla
Member: MeiSeed
MeiSeed Nov 16, 2007 at 18:00:25 (UTC)
Goto Top
Vielen vielen dank dir

gruß
MeiSeed