knuefi
Goto Top

Mehrere Verzeichnisse in einen Script angeben

Hallo zusammen, ich brauche eure Hilfe.
Ich habe unten stehendes Script zum löschen ältere Dateien in einen Unterordner. Nun möchte ich das Skript über mehre Unterordner bzw. mehre Verzeichnisse laufen lassen. Wie bekomme ich mehre Verzeichnisse in diesen Script?
Oder ist es möglich in einen Ordner mit mehren Verknüfungen zu den Verzeichnisse zu verwenden?, So gebe ich nur ein Verzeichnis im Script an, gelöscht werden aber in den Verknüfungen befindliche Unterordner.

Verzeichnis = "\\test.com\Homedir\Max\Arbeitsauftrag"
Aufheben = 10
Set fso = CreateObject("Scripting.FileSystemObject")
Set ordner = fso.GetFolder(Verzeichnis)
heute = Date()
DeleteInFolder(ordner)

Sub DeleteInFolder(ordner)
Set dateien = ordner.Files
' Alle Dateien in diesem Ordner abklappern
For Each datei In dateien
If datei.DateLastModified < (heute - Aufheben) Then
datei.Delete
End If
Next
Set untere = ordner.SubFolders
'Unterordner abklappern, DeleteInFolder rekursiv aufrufen
For Each unter In untere
DeleteInFolder(unter)
Next
End Sub

Content-Key: 292075

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

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

Mitglied: 114757
114757 Jan 02, 2016 updated at 13:50:48 (UTC)
Goto Top
Moin,
bitte Suchfunktion nutzen, wurde hier schon öfters abgehandelt
Datei auf Festplatte per VBA suchen und löschen ( access 2010)
Skript suche Ordner in Unterordner
usw...
DEINORDNER = "\\test.com\Homedir\Max\Arbeitsauftrag"  
SUCHE_IN_UNTERORDNERN = True

olddate = DateAdd("d", -10, Date)  
set objFS = CreateObject("Scripting.FilesystemObject")  
parseFolders objFS.GetFolder(DEINORDNER),SUCHE_IN_UNTERORDNERN

Function parseFolders(strFldr,boolRecursion)
	for each myFile in strFldr.Files
		If myFile.DateCreated < olddate then
			myFile.Delete
		End If
	Next
	If boolRecursion Then
		For Each subFolder in strFldr.SubFolders
			parseFolders subFolder, True
		Next
	End If
End Function
Gruß jodel32
Member: Knuefi
Knuefi Jan 02, 2016 updated at 14:14:48 (UTC)
Goto Top
Hallo jodel32,
danke für deine sehr schnelle Antwort. Wenn ich das Script richtig lese, ist das eine Variante mit Verzeichnis und dort befindliche Unterordner. Läuft das auch im Verzeichnis befindliche Verknüfungen?
Ich würde dann einen Ordner anlegen, dort lege ich die Verknüfungen rein. Werden dann auch die Dateien im Unterordner der Verknüfungen gelöscht?
Mitglied: 114757
114757 Jan 02, 2016 updated at 14:39:13 (UTC)
Goto Top
Das Skript löscht alle Verknüpfungen älter als 10 Tage in einem Verzeichnis und berücksichtigt selbstverständlich auch alle Verknüpfungen in allen Unterordnern Rekursiv...
Member: Knuefi
Knuefi Jan 02, 2016 at 14:46:57 (UTC)
Goto Top
Löscht die Verknüpfungen die älter als 10 Tage sind?, dass sollte nicht so sein.
Es sollen die Dateien in den Verknüpfungen gelöscht werden, die Verknüfungen sollen erhalten bleiben.
Mitglied: 114757
Solution 114757 Jan 02, 2016, updated at Jan 03, 2016 at 18:09:10 (UTC)
Goto Top
Sag schreib das doch gleich so in deinen Beitrag oder kommt jetzt noch mehr unbekanntes ans Tageslicht ? ... dann ist die Verknüpfung aber auch tot face-smile
Dass hier macht das beschriebene. Ich gehe hier davon aus das deine Verknüpfungen, Verknüpfungen zu Dateien sind...
DEINORDNER = "\\test.com\Homedir\Max\Arbeitsauftrag"  
SUCHE_IN_UNTERORDNERN = True
olddate = DateAdd("d", -10, Date)  
set objFS = CreateObject("Scripting.FilesystemObject")  
Set objShell = CreateObject("Wscript.Shell")  

parseFolders objFS.GetFolder(DEINORDNER),SUCHE_IN_UNTERORDNERN

Function parseFolders(strFldr,boolRecursion)
	for each myFile in strFldr.Files
                ' Wenn Datei ein Link ist ...  
		If LCase(objFS.GetExtensionName(myFile.Name)) = "lnk" then  
                        ' Zielpfad des Links auslesen  
			target = objShell.CreateShortcut(myFile.Path).TargetPath
                        ' Wenn Zieldatei existiert ...  
			If objFS.FileExists(target) Then
                                ' und Änderungs-Datum älter als X Tage ist lösche Datei  
				If objFS.GetFile(target).DateLastModified < olddate Then
					objFS.DeleteFile target,True
				End If
			End If
		End If
	Next
        'Für jeden Unterordner, rufe die Funktion rekursiv erneut auf.  
	If boolRecursion Then
		For Each subFolder in strFldr.SubFolders
			parseFolders subFolder, True
		Next
	End If
End Function
Member: Knuefi
Knuefi Jan 02, 2016 at 22:52:59 (UTC)
Goto Top
Da bin ich wieder, ich konnte mich leider keine frühere Rückmeldung geben.
Leider funktioniert das Script nicht, es kommt auch keine Fehlermeldung. Hast du eine Idee?
Mitglied: 114757
114757 Jan 02, 2016 updated at 22:59:51 (UTC)
Goto Top
Geht hier wie immer einwandfrei, wurde ja getestet ...
Du nutzt aber schon simple *.lnk Files oder arbeitest du hier mit Softlinks oder Junctions ?
Member: Knuefi
Knuefi Jan 03, 2016 at 13:43:56 (UTC)
Goto Top
Hallo Jodel32,

Ich habe auf mein Desktop einen Ordner (Name neuer Ordner) erstellt, dort habe ich die Verknüfungen (mit der Endung .ink) gepackt. Die Verknüfungen haben unterschiedliche Ziele, hier zwei Beispiele:\\test.com\bbb\Homedir\Carsten\Arbeitsauftrag und \\test.com\bbb\Homedir\Stefan\Arbeitsauftrag. In den Ordnern Arbeitsaufträge befinden sich Dateien die älter als 10 Tage sind, diese werden aber leider nicht gelöscht. Das soll aber Ziel des Skript sein. Kann es sein, dass das Skript nur in das erste Unterverzeichnis geht?
Hier das angepasste Skript:
DEINORDNER = "D:\Users\Maxmustermann\Desktop\Neuer Ordner"
SUCHE_IN_UNTERORDNERN = True
olddate = DateAdd("d", -10, Date)
set objFS = CreateObject("Scripting.FilesystemObject")
Set objShell = CreateObject("Wscript.Shell")

parseFolders objFS.GetFolder(DEINORDNER),SUCHE_IN_UNTERORDNERN

Function parseFolders(strFldr,boolRecursion)
for each myFile in strFldr.Files
' Wenn Datei ein Link ist ...
If LCase(objFS.GetExtensionName(myFile.Name)) = "lnk" then
' Zielpfad des Links auslesen
target = objShell.CreateShortcut(myFile.Path).TargetPath
' Wenn Zieldatei existiert ...
If objFS.FileExists(target) Then
' und Änderungs-Datum älter als X Tage ist lösche Datei
If objFS.GetFile(target).DateLastModified < olddate Then
objFS.DeleteFile target,True
End If
End If
End If
Next
'Für jeden Unterordner, rufe die Funktion rekursiv erneut auf.
If boolRecursion Then
For Each subFolder in strFldr.SubFolders
parseFolders subFolder, True
Next
End If
End Function
Mitglied: 114757
114757 Jan 03, 2016 updated at 15:52:56 (UTC)
Goto Top
Mal wieder typisches Beispiel von blindem kopieren, hättest du meinen Post mit dem Code vollständig gelesen hättest du dort rauslesen können das dieses nur Verknüpfungen zu Dateien und nicht zu Ordnern unterstützt.

Kann es sein, dass das Skript nur in das erste Unterverzeichnis geht?
Nein, der Ordner in dem die Verknüpfungen liegen werden rekursiv nach Verknüpfungen untersucht.

Für Ordner muss man es natürlich noch anpassen. Aber das mach ich erst wenn du jetzt endlich mal mit allen Details deines Vorhabens rausrückst damit hier nicht immer wieder neue Details ans Licht kommen die ich mit meiner Glaskugel nicht kenne, Monsieur !! Also bitte. Danke.


DEINORDNER = "\\test.com\Homedir\Max\Arbeitsauftrag"  
SUCHE_IN_UNTERORDNERN = True
olddate = DateAdd("d", -10, Date)  
set objFS = CreateObject("Scripting.FilesystemObject")  
Set objShell = CreateObject("Wscript.Shell")  

parseFolders objFS.GetFolder(DEINORDNER)

Function parseFolders(strFldr)
	for each myFile in strFldr.Files
		' Wenn Datei ein Link ist ...  
		If LCase(objFS.GetExtensionName(myFile.Name)) = "lnk" then  
			' Zielpfad des Links auslesen  
			target = objShell.CreateShortcut(myFile.Path).TargetPath
                       ' Wenn Zielpfad existiert ...  
			If objFS.FolderExists(target) Then
				'Entferne im Zielpfad rekursiv alle älteren Dateien  
				RemoveOldFiles objFS.GetFolder(target)
			End If
		End If
	Next
	For Each subFolder in strFldr.SubFolders
		parseFolders subFolder
	Next
End Function

Function RemoveOldFiles(strFldr)
	For Each f In strFldr.Files
		If f.DateLastModified < olddate Then
			objFS.DeleteFile f.Path,True
		End If
	Next
	For Each subFolder in strFldr.SubFolders
		RemoveOldFiles subFolder
	Next
End Function
Member: Knuefi
Knuefi Jan 03, 2016 at 14:39:16 (UTC)
Goto Top
das ist das was gewünscht ist:

Es gibt einen Ordner auf den Desktop (Name: neuer Ordner), dort befinden sich ca. 45 Verknüpfungen (.ink) mit einer Zieladressen. Hier zwei Beispiele von den Pfaden der Verknüpfungen: \\test.com\bbb\Homedir\Carsten\Arbeitsauftrag und \\test.com\bbb\Homedir\Stefan\Arbeitsauftrag. In den Zielordnern Arbeitsauftrag befinden sich Dateien, die gelöscht werden sollen, und zwar die, die älter wie 10 Tage sind.
Ich hoffe, ich habe es jetzt besser beschrieben.
Mitglied: 114757
114757 Jan 03, 2016 updated at 15:56:00 (UTC)
Goto Top
s. Skript im letzten Post. Es wird das LastModifiedDate herangezogen, wenn du stattdessen das DateCreated Datum für die Auswertung heranziehen willst ändere das in Zeile 29
If f.DateCreated < olddate Then 
geht einwandfrei.
Member: Knuefi
Knuefi Jan 03, 2016 at 18:07:25 (UTC)
Goto Top
Danke für deine Geduld und deine Hilfe, es läuft Perfekt.
DANKE!!!!!
Member: Knuefi
Knuefi Jan 04, 2016 at 20:24:08 (UTC)
Goto Top
Hallo Jodel32,

kannst du mir bitte nochmals weiterhelfen?. Ist es möglich eine Meldung über den Start, Ende und eventuell Fortschritt des Script anzuzeigen zu lassen. Die Möglichkeit über regedit und HideStartupScripts besteht leider nicht, es fehlen die Admin Rechte.

Gruß
Mitglied: 114757
114757 Jan 04, 2016 at 23:22:58 (UTC)
Goto Top
Schon mal was von MsgBox gehört ?!
msgbox "Fertig"
Hirn einschalten ....
Member: Knuefi
Knuefi Jan 16, 2016 at 21:54:31 (UTC)
Goto Top
Hallo zusammen,

kann ich bei den Script auch Dateien vor den löschen schützen?. Ich würde gerne im Dateinamen ein Wort (Schutz) zusätzlich schreiben (zB. Einladung zur Geburtagsfeierschutz.doc) und diese Datei würde verschont bleiben.
Zudem würde ich gerne spezifischer bzw. Ziel genauer löschen. Nach der Verknüpfung folgen zwei Unterordner (Mitteilung und Sonstiges), hier würde ich gerne nur die Dateien löschen, die sich in den Unterordner Mitteilung befinden.
Gruß
knefi
Mitglied: 114757
Solution 114757 Jan 16, 2016, updated at Jan 17, 2016 at 12:29:05 (UTC)
Goto Top
Einfach die IF-Bedingung im Skript Zeile 29 so ändern:
If f.DateLastModified < olddate and not InStr(1,f.Name,"schutz") > 0 and Left(objFS.GetParentFolderName(f.Path),12) = "Mitteilungen" Then  

Wie wär's ab und zu mal mit lesen...
http://www.w3schools.com/asp/vbscript_default.asp
Member: Biber
Biber Jan 17, 2016 at 10:11:13 (UTC)
Goto Top
[OT]
Moin Knuefi,

ich habe mir jetzt doch mal diesen Beitrag und auch die anderen Beiträge angeschaut.
Dabei sind mir positive Punkte und einige andere mit Verbesserungspotential aufgefallen,

Deshalb möchte ich hier mal einschreiten als Moderator.

Positiv werte ich:
- du gibst Feedback, beantwortest Rückfragen, setzt auch die Beiträge auf "Gelöst", wenn eine Lösung erarbeitet wurde.

Ein bisschen Luft nach oben sehe ich dagegen bei diesen Punkten:
- die anfängliche Problembeschreibung müssen in jedem deiner Beiträge erst durch mehrfache Rückfragen von Hilfswilligen geklärt werden
- in jedem Beitrag tröpfeln so nach und nach immer weitere Zusatzanforderungen und neue Randbedingungen nach, so dass Titel und Inhalt des Beitrags sehr auseinanderlaufen
- du verwendest nie Codeformatierung beim Posten von Codeschnipseln.

Du hast in einem anderen Beitrag sinngemäß geschrieben "Ein Forum ist immer so gut wie seine Mitglieder.".
Das gilt aber nicht nur für die Antwortenden, sondern auch für die Fragesteller.

Bitte versuche in künftigen Fragen eine vollständige und klare Formulierung in der Problembeschreibung und bleibe dann auch beim ursprünglich angegebenen Thema.
Und verwende zur Lesbarkeit von Codeschipseln auch Codeformatierung.

Diese Frage hier -die du ja auch schon auf "Gelöst" gesetzt hast - schliesse ich jetzt.

Grüße
Biber
[/OT]