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
Kommentar vom Moderator Biber am 11.11.2010 um 16:06:27 Uhr
Den seit Monaten gelösten Beitrag geschlossen wegen Trittbrettfahrerei.
GELÖST

Löschen von alten Dateien und Verzeichnissen per VBS mit Ausnahmen....

Frage Entwicklung Batch & Shell

Mitglied: sansebastian

sansebastian (Level 1) - Jetzt verbinden

12.02.2007, aktualisiert 18.10.2012, 9544 Aufrufe, 36 Kommentare

Hallo Zusammen!
Der Artikel bezieht sich teilweise auf den Thread:
http://www.administrator.de/Batch_Datei%3A_Alte_Dateien_nach_gewissen_A ...

Ich habe folgendes Problem:
Auf einem FileSRV befindet sich ein Transferlaufwerk, auf welchem Dateien zum Transfer
und für eine kurze Ablage zwischen den Abteilungen eingerichtet wurde.
Leider wurde diese Laufwerk nie gepfelgt und mittlerweile beträgt das Volumen mehr als 480GB.
Fremde Software darf leider nicht angwanden werden, womit DelAge nicht mehr in Frage kommt.
Also bleibt mir nur die Variante mit dem VBScript übrig.
Diese sollte einmal im Monat laufen und alle Dateien und Verzeichnisse in der Laufwerkstruktur löschen, die älter als 120 Tage sind.
Dabei soll ein bestimmter Ordner (Chef ) nicht angepackt werden.
Wie baue ich eine Ausnahme in dieses Script mit ein??
Ausserdem hab ich festgestellt, dass das Script nur die Dateien löscht, die leeren Verzeichnisse und Unterverzeichnisse aber beibehält.
Kann ich nicht die For-Schleifen myFiles und myFolder in ein Script packen??
Danke für Eure Hilfe!
Sebastian






[Edit Biber] 18.02.2009 Beitrag auf "Gelöst" gesetzt und verschoben von "Tools & Utilities" nach "Batch & Shell" [Edit]
36 Antworten
Mitglied: Biber
12.02.2007 um 13:55 Uhr
Moin sansebastian,

willkommen im Forum.

Nicht, dass ich der Frage ausweichen will, aber ich würde (wie auch im damaligen Thread) anregen, nochmal zu (hinter-)fragen, WTF den DelAge32.exe NICHT eingesetzt werden darf/soll.
Tools wie dieses sind nun wirklich nicht gemeint gewesen mit "keine Software auf undserem Server installieren".

Eine Anpassung von Softmeisters VBS-Schnipsel könnte so aussehen:
01.
' DelOldScrap.vbs <inAndBelowFolder> <AgeInDays> 
02.
Set myArguments = WScript.Arguments 
03.
 
04.
If myArguments.Count <> 2 Then     
05.
    call DisplayInfo 
06.
    Wscript.Quit (1) 
07.
End if 
08.
 
09.
Dim heute, olddate 
10.
heute = FormatDateTime(Date, 2) 
11.
olddate = DateAdd("d","-" & myArguments(1), heute) 
12.
 
13.
set objFS = CreateObject("Scripting.FilesystemObject") 
14.
set myFolder = objFS.GetFolder(myArguments(0)) 
15.
set mySubfolders = myFolder.Subfolders 
16.
 
17.
for each subfolder in mySubfolders 
18.
   <b> If Lcase(Subfolder.name) != LCase( "X:\Subfolder\NameVomFolderDerIgnoriertWerden soll") then </b> 
19.
         If subfolder.DateCreated < olddate then 
20.
             subfolder.Delete 
21.
         end if 
22.
   <b>end if</b> 
23.
next  
24.
 
25.
Sub DisplayInfo 
26.
    MsgBox "Usage: deleteoldfolders.vbs [FolderPath] [Anzahl Tage]", vbExclamation, "Missing Arguments" 
27.
End Sub
[Ungetestete Skizze]

Eine batchlösung kann ebenfalls auf Anfrage kurzfristig geliefert werden.

Gruss
Biber
Bitte warten ..
Mitglied: sansebastian
12.02.2007 um 14:00 Uhr
Also das liegt an unserer Sicherheitsabteilung.....
Kann ich nichts dran machen!!
Ich darf auch, warum auch immer, keine OpenSource Software einsetzten!
Naja, muss ich mit leben....
Bitte warten ..
Mitglied: sansebastian
12.02.2007 um 14:06 Uhr
Löscht dieses Script dann auch anschließend die leeren Verzeichnisse??
for each subfolder in mySubfolders bedeutet doch, das nur Verzeichnisse gesucht werden. Die Files bleiben dabei außen vor....!?
Bitte warten ..
Mitglied: sansebastian
12.02.2007 um 14:45 Uhr
Ich habe da eine Fehlermeldung.....
Er will bestimmt eine Anweisung bezüglich 'Then'. Hab es mal mit 'next' versucht ... geht aber nicht....

Set myArguments = WScript.Arguments

If myArguments.Count <> 2 Then
call DisplayInfo
Wscript.Quit (1)
End if

Dim heute, olddate
heute = FormatDateTime(Date, 2)
olddate = DateAdd("d","-" & myArguments(1), heute)

set objFS = CreateObject("Scripting.FilesystemObject")
set myFolder = objFS.GetFolder(myArguments(0))
set mySubfolders = myFolder.Subfolders

'MsgBox "Heute ist der: " & heute &" Wollen sie wirklich alle Dateien, die vor dem "& Olddate &" erstellt wurden, löschen?"

for each subfolder in mySubfolders
If Lcase(Subfolder.name) != LCase( "H:\ChefData\") then next?????
If subfolder.DateCreated < olddate then
subfolder.Delete
end if
end if
next

Sub DisplayInfo
MsgBox "Eingabe: loedat_beta.vbs [Pfadangabe] [Anzahl Tage]", vbExclamation, "Missing Arguments"
End Sub
Bitte warten ..
Mitglied: bastla
13.02.2007 um 12:01 Uhr
Hallo sansebastian!

Den Rest hab' ich mir nicht angesehen, aber schreib mal statt des "!=" ein "<>".

Grüße
bastla
Bitte warten ..
Mitglied: bastla
13.02.2007 um 12:34 Uhr
Hallo sansebastian!

Löscht dieses Script dann auch anschließend die leeren Verzeichnisse??
for each subfolder in mySubfolders bedeutet doch, das nur Verzeichnisse gesucht werden. Die Files bleiben dabei außen vor....!?
Ganz im Gegentum - sobald ein Ordner alt genug ist, wird er samt Inhalten (Dateien und Unterordner) entsorgt - die nötigen Berechtigungen vorausgesetzt.

Grüße
bastla
Bitte warten ..
Mitglied: sansebastian
14.02.2007 um 09:12 Uhr
Guten Morgen!
Bei einem Test des Scriptes habe ich leider feststellen müssen, dass mit den Vergleichsoperatoren <> keine Ausnahme vor der Datei gemacht wird und diese mit gelöscht wird. Ausserdem geht dieses Script nur eine Ebene in der Verzeichnisstruktur tiefer. Deren Unterverzeichnisse werden nicht angefasst. Hatt jemand eine Idee??
Vielen Dank,
Sebastian
Bitte warten ..
Mitglied: bastla
16.02.2007 um 08:53 Uhr
Hallo sansebastian!

Hat leider etwas gedauert ...

Versuch mal die folgende Variante:
01.
' DelOldScrap.vbs <BelowFolder> <AgeInDays> 
02.
Const Chef="ChefDaten" 'Ordnername ohne Pfadangabe 
03.
 
04.
Set myArguments = WScript.Arguments 
05.
If myArguments.Count <> 2 Then     
06.
	Usage 
07.
    Wscript.Quit (1) 
08.
End if 
09.
 
10.
Heute = FormatDateTime(Date, 2) 
11.
OldDate = DateAdd("d","-" & myArguments(1), Heute) 
12.
 
13.
Set objFS = CreateObject("Scripting.FilesystemObject") 
14.
If objFS.FolderExists(myArguments(0)) Then 
15.
	DoSubFolders objFS.GetFolder(myArguments(0)) 
16.
Else 
17.
	Usage 
18.
End If 
19.
MsgBox "Fertig." 
20.
Sub DoSubFolders (Folder) 
21.
For Each SubFolder In Folder.SubFolders 
22.
    If LCase(SubFolder.Name) <> LCase(Chef) Then 
23.
		For Each File In SubFolder.Files 
24.
			If File.DateCreated < OldDate Then 'oder .DateLastModified für "letzte Änderung" 
25.
				File.Delete 
26.
			End If 
27.
		Next 
28.
		DoSubFolders(SubFolder) 
29.
		If (SubFolder.SubFolders.Count + SubFolder.Files.Count) = 0 Then 
30.
			SubFolder.Delete 
31.
		End If 
32.
	End If 
33.
Next  
34.
End Sub 
35.
Sub Usage 
36.
MsgBox "Usage: " & WScript.ScriptName & " StartPfad TageAnzahl", vbExclamation, "Argumente überprüfen ..." 
37.
End Sub
Gelöscht werden in den Unterordnern des übergebenen Startordners Dateien nach dem Erstellungsdatum (siehe Kommentar im Script für "Datum der letzten Änderung") und leere Ordner, ausgenommen der "Chef"-Ordner und dessen Unterordner.

Aufgerufen wird das Script mit
01.
Scriptname.vbs Startpfad Tageanzahl
Der Startpfad muss vorhanden sein, kann aber zB auch "T:\" lauten.

Grüße
bastla
Bitte warten ..
Mitglied: bastla
16.02.2007 um 08:54 Uhr
Doppelpost ...
Bitte warten ..
Mitglied: sansebastian
01.03.2007 um 11:16 Uhr
??? Doppelpost ???
Bitte warten ..
Mitglied: bastla
01.03.2007 um 11:23 Uhr
Hallo sansebastian!

??? Doppelpost ???
Obwohl ich mir sehr vorgenommen hatte, dass es mir nicht passieren sollte, einen Beitrag doppelt oder mehrfach zu posten, hatte ich es leider doch geschafft (Reaktionszeit des Forums war zu dieser Zeit bei etwa 2 Minuten) und daher den zweiten, gleichlautenden Beitrag entfernt und durch obigen Hinweis ersetzt.

Grüße
bastla
Bitte warten ..
Mitglied: sansebastian
01.03.2007 um 11:30 Uhr
Das Problem ist, das eine solch ähnliche Struktur vorliegt und das Script nur ein Ebene tiefer nach Dateien sucht... Bin gerade dabei, was zu basteln....(mit Rekursion)
Root-
|
Verz1--UnterVerz1.1
| |
| UnterVerz1.2--Datei
| |
| --Unterverz1.2.1--Datei
|
Verz2--Unterverz2.1
| |
| --Unterverz2.1.1
| |__UnterVerz2.1.1.1--Datei
Verz3--Datei
usw.
Bitte warten ..
Mitglied: sansebastian
02.03.2007 um 14:05 Uhr
Update.....
Hab mal ein wenig mit jemandem gebastelt....
Dim heute, olddate
Dim strToolPath
Dim wshell

Set wshell = CreateObject("Wscript.shell")


strToolPath = "D:\Diese Verzeichnis nicht Pfad"

Set myArguments = WScript.Arguments


If myArguments.Count = 2 Then
heute = FormatDateTime(Date, 2)
olddate = DateAdd("d", "-" & myArguments(1), heute)

Set objFS = CreateObject("Scripting.FilesystemObject")
Set myFolder = objFS.GetFolder(myArguments(0))
Set mySubfolders = myFolder.SubFolders


If MsgBox("Heute ist der: " & heute & _
" Wollen sie wirklich alle Dateien, die vor dem " & olddate & _
" erstellt wurden, löschen?", vbyesno) = vbYes Then

For Each subfolder In mySubfolders
If LCase(subfolder.Name) <> LCase(strToolPath) And _
subfolder.DateCreated < olddate Then

' hier beginnt die Rekursion
msgbox Chr(34) & WScript.ScriptFullName & Chr(34) & Chr(32) _
& Chr(34) & myArguments(0) & "\" & subfolder & Chr(34) & Chr(32) & _
myArguments(1)
wshell.Run Chr(34) & WScript.ScriptFullName & Chr(34) & Chr(32) _
& Chr(34) & subfolder & Chr(34) & Chr(32) & _
myArguments(1)
subfolder.Delete
MsgBox "Lösche Folder: " & subfolder.Name
End If
Next

Else
' Falsch aufgerufen!
Call DisplayInfo

End If

End If

Sub DisplayInfo()
MsgBox "Eingabe: loeschen.vbs [Pfadangabe] [Anzahl Tage]", vbExclamation, "Missing Arguments"
End Sub



Bekomme aber leider beim löschen einen Runtime error
Bitte warten ..
Mitglied: TSglueck
19.02.2009 um 13:38 Uhr
Hallo,
wollt mich nur mal bedanken. Hab mit der Hilfe dieses Threads - also Eurer - ein Script geschrieben, dass beim Start der PCs die lokalen Kopien der Profile löscht, die hätten eigentlich beim Herunterfahren gelöscht werden sollen.

Const Bleibt1=""
Const Bleibt2="Administrator"
Const Bleibt3="All Users"
Const Bleibt4="Default User"
Const Bleibt5="LocalService"
Const Bleibt6="NetworkService"
set objFS = CreateObject("Scripting.FilesystemObject")
set myFolder = objFS.GetFolder("C:\Dokumente und Einstellungen")
set mySubfolders = myFolder.Subfolders
for each subfolder in mySubfolders
If Lcase(Subfolder.name) <> LCase(Bleibt1) and Lcase(Subfolder.name) <> LCase(Bleibt2) and Lcase(Subfolder.name) <> LCase(Bleibt3) and Lcase(Subfolder.name) <> LCase(Bleibt4) and Lcase(Subfolder.name) <> LCase(Bleibt5) and Lcase(Subfolder.name) <> LCase(Bleibt6) then
subfolder.Delete
end if
next
Bitte warten ..
Mitglied: bastla
19.02.2009 um 21:31 Uhr
Hallo TSglueck!

Danke fürs Bedanken ...

Etwas leichter erweiterbar (wenn's denn nötig sein sollte) durch Hinzufügen einer weiteren "Case"-Zeile wäre folgende Variante:
01.
Set objFS = CreateObject("Scripting.FilesystemObject") 
02.
Set mySubfolders = objFS.GetFolder("C:\Dokumente und Einstellungen").Subfolders 
03.
For Each Subfolder In mySubfolders 
04.
    Select Case LCase(Subfolder.Name) 
05.
        Case LCase("Administrator") 
06.
        Case LCase("All Users") 
07.
        Case LCase("Default User") 
08.
        Case LCase("LocalService") 
09.
        Case LCase("NetworkService") 
10.
        Case Else	 
11.
            Subfolder.Delete 
12.
    End Select 
13.
Next
Grüße
bastla
Bitte warten ..
Mitglied: Alkenix
26.10.2010 um 11:49 Uhr
Hallöchen, ich bin neu hier.

Ich denke ihr werdet gleich lachen,
aber ich versteh so rein garnichts vom Programmieren.
D.H. ich hab hier was kopiert aus einem der Foren hier,
aber irgendwie geht das nicht.

Ich suche eig. ein Vbs Script, das Dateien und Ordner in einem Order auf dem Desktop löscht, welche älter als 3 Tage alt sind und Ausnahmen beinhaltet (nichtlöschen.txt z.B.). -> Was ich gezielt hier nicht finde.

Was ich kopiert (schon angepasst) hab ist folgendes:

01.
Set fso = CreateObject("Scripting.FileSystemObject")  
02.
Set WSHShell = WScript.CreateObject("WScript.Shell")  
03.
On Error Resume Next  
04.
' * hier eigenen Bedürfnissen anpassen *  
05.
strOrdnerliste = "C:\Dokumente und Einstellungen\pweberling\Desktop\Ordnerliste.txt"  
06.
strAusschlussliste = "C:\Dokumente und Einstellungen\pweberling\Desktop\Ausschluss.txt"  
07.
Aufheben = 0 'Anzahl der Tage  
08.
' * Ende der Anpassungen *  
09.
Set objOrdnerliste = fso.OpenTextFile(strOrdnerliste, 1)  
10.
Verzeichnis = Split(objOrdnerliste.ReadAll, vbCrLF)  
11.
objOrdnerliste.Close  
12.
Set objAusschlussliste = fso.OpenTextFile(strAusschlussliste, 1)  
13.
Exclude = Split(objAusschlussliste.ReadAll, vbCrLF)  
14.
objAusschlussliste.Close  
15.
Heute = Date()  
16.
For n = 0 To UBound(Verzeichnis)   
17.
	Set Ordner = fso.GetFolder(Verzeichnis(n))  
18.
	DeleteInFolder(Ordner)  
19.
Next  
20.
Sub DeleteInFolder(Ordner)  
21.
Set Dateien = Ordner.Files  
22.
' Alle Dateien in diesem Ordner abklappern  
23.
For Each Datei In Dateien  
24.
	If Datei.DateLastModified < (Heute - Aufheben) Then  
25.
		ToKeep = False  
26.
		For Each Ex In Exclude  
27.
			If LCase(Right(Datei.Name, Len(Ex))) = LCase(Ex) Then  
28.
				ToKeep = True  
29.
				Exit For  
30.
			End If  
31.
		Next  
32.
		If Not ToKeep Then  
33.
			On Error Resume Next  
34.
			Datei.Delete  
35.
			If Err And Err <> 70 Then MsgBox "Unerwarteter Fehler (Code=" & Err & ")", vbCritical: WScript.Quit  
36.
			On Error Goto 0  
37.
		End If  
38.
	End If  
39.
Next  
40.
'Unterordner abklappern, DeleteInFolder rekursiv aufrufen  
41.
For Each Unter In Ordner.SubFolders  
42.
	DeleteInFolder(Unter)  
43.
	If (Unter.SubFolders.Count + Unter.Files.Count) = 0 Then Unter.Delete  
44.
Next  
45.
End Sub
In meiner Ausschluss.txt steht die Datei/Ordnerbezeichnung die nicht gelöscht werden sollen:

nichtloeschen

In meiner Ordnerliste.txt steht der explorer Link zu dem Test-Ordner aufem Desktop:

C:\Dokumente und Einstellungen\pweberling\Desktop\Test

Ich wollte das erstmal bei mir testen, bevor ich das auf den Firmenserver anwenden lasse.
Bitte um Hilfe. :/

[Edit Biber] Codeformatierung[/Edit]
Bitte warten ..
Mitglied: bastla
26.10.2010 um 15:05 Uhr
Hallo Alkenix und willkommen im Forum!
Bitte um Hilfe. :/
Wo ist Dein konkretes Problem?

Bis auf die Überprüfung der Ausschlüsse (sollte in der unten dargestellten Variante etwas performanter sein) würde ich bestenfalls noch Kleinigkeiten anpassen:
01.
Set fso = CreateObject("Scripting.FileSystemObject")  
02.
Set WSHShell = WScript.CreateObject("WScript.Shell")  
03.
'On Error Resume Next '## während der Testphase kontraproduktiv ## 
04.
 
05.
' * hier eigenen Bedürfnissen anpassen *  
06.
strOrdnerliste = "C:\Dokumente und Einstellungen\pweberling\Desktop\Ordnerliste.txt"  
07.
strAusschlussliste = "C:\Dokumente und Einstellungen\pweberling\Desktop\Ausschluss.txt"  
08.
Aufheben = 3 'Anzahl der Tage  
09.
' * Ende der Anpassungen *  
10.
 
11.
Set objOrdnerliste = fso.OpenTextFile(strOrdnerliste)  
12.
Verzeichnis = Split(objOrdnerliste.ReadAll, vbCrLF)  
13.
objOrdnerliste.Close  
14.
Set objAusschlussliste = fso.OpenTextFile(strAusschlussliste)  
15.
Exclude = "#" & Replace(objAusschlussliste.ReadAll, vbCrLF, "#") & "#" 
16.
objAusschlussliste.Close  
17.
 
18.
Heute = Date()  
19.
 
20.
For n = 0 To UBound(Verzeichnis)   
21.
    Set Ordner = fso.GetFolder(Verzeichnis(n))  
22.
    DeleteInFolder(Ordner)  
23.
Next  
24.
 
25.
Sub DeleteInFolder(Ordner)  
26.
Set Dateien = Ordner.Files  
27.
' Alle Dateien in diesem Ordner abklappern  
28.
For Each Datei In Dateien  
29.
    If Datei.DateLastModified < (Heute - Aufheben) Then 
30.
        'nur Dateien, deren Name nicht wie ein Eintrag der Ausschlussliste endet 
31.
        '(für exakte Übereinstimmung - außer Groß-/Kleinschreibung - wäre 
32.
        '"#" & Datei.Name & "#" 
33.
        'zu verwenden) 
34.
        If InStr(1, Exclude, Datei.Name & "#", vbTextCompare) = 0 Then 
35.
            On Error Resume Next 
36.
            WScript.Echo "-" &Datei.DateLastModified&" "&Datei.Path 'Datei.Delete 
37.
            If Err And Err <> 70 Then MsgBox "Unerwarteter Fehler (Code=" & Err & ")", vbCritical: WScript.Quit  
38.
            On Error Goto 0  
39.
        End If  
40.
    End If  
41.
Next 
42.
 
43.
'Unterordner abklappern, DeleteInFolder rekursiv aufrufen  
44.
For Each Unter In Ordner.SubFolders 
45.
    'nur Ordner, deren Name nicht wie ein Eintrag der Ausschlussliste endet 
46.
    If InStr(1, Exclude, Unter.Name & "#", vbTextCompare) = 0 Then  
47.
        DeleteInFolder(Unter) 
48.
        If (Unter.SubFolders.Count + Unter.Files.Count) = 0 Then WScript.Echo "--"&Unter.Path 'Unter.Delete 
49.
    End If 
50.
Next  
51.
End Sub
Das effektive Löschen habe ich hier durch Ausgabe des Datei-/Ordnerpfades ersetzt, daher bitte mit "cscript Script.vbs" aus einer CMD-Shell heraus testen!

Leere Ordner werden in dieser Simulation nur als zu löschen angezeigt, wenn sie bereits leer waren (da ja noch keine Dateien gelöscht werden). Für das Dateialter habe ich lt Beschreibung oben 3 Tage angesetzt.

Grüße
bastla
Bitte warten ..
Mitglied: Alkenix
26.10.2010 um 15:23 Uhr
Joa, danke.. Oo
Mein Problem liegt, lag daran, das es für mich Fachchinesisch ist.
Ich hab das zwar kopiert, und nen wenig gerallt, aber leider hab ich z.B. schon wieder keine Ahnung davon,
was du mit dieses Satz meinst @bastla "Das effektive Löschen habe ich hier durch Ausgabe des Datei-/Ordnerpfades ersetzt, daher bitte mit "cscript Script.vbs" aus einer CMD-Shell heraus testen!". Was ist ne CMD-Shell? Ist das die cmd, die ich aufrufen kann?
Also, tut mir leid, aber bin da echt ungebildet auf dem Gebiet.

Aber lernwillig!

Also wenn ich die 3 Tage auf 0 setze, dann kann ichs ja sofort testen, richtig?
Dann müssten in dem Ordner nurnoch die Dateien und Ordner vorhanden sein, die "nichtloeschen" heißen, richtig?

Und soll ich die Dateiendung auf .vbs belassen? Oder doch eher .bat? ._.

Tut mir leid das ich so viele Fragen stelle..^^
Bitte warten ..
Mitglied: bastla
26.10.2010 um 15:45 Uhr
Hallo Alkenix!
Mein Problem liegt, lag daran, das es für mich Fachchinesisch ist.
... was es (nach etwas Beschäftigung damit) ja nicht unbedingt bleiben muss ...
Da Dein Vorhaben ja nicht ganz ungefährlich ist (auch wenn es vorläufig nur um Testdaten geht), hielt ich es für sinnvoll, zunächst eine Simulation in der Form vorzunehmen, dass für jede zu löschende Datei eine Zeile der Art
-24.10.2010 17:58:28 C:\Dokumente und Einstellungen\pweberling\Desktop\Test\Ein Unterordner\WegDamit.txt
und für jeden Ordner eine Zeile
--C:\Dokumente und Einstellungen\pweberling\Desktop\Test\Ein Unterordner
ausgegeben wird. Damit schon während der Testphase auch Ordner "gelöscht" werden, müssen diese bereits leer sein. Im Echtbetrieb werden vorweg die Dateien gelöscht und dann untersucht, ob dadurch auch ein Ordner gänzlich leer ist - wenn ja, wird dieser ebenfalls entfernt.

Deine Vorgangsweise sollte so sein:
  • Datei als zB "C:\Loeschen.vbs" speichern (Achtung, wenn Du den Windows-Editor verwendest, hängt dieser noch ein ".txt" an den Namen an, daher beim Speichern als "Dateityp" "Alle Dateien" wählen oder den Namen unter Anführungszeichen setzen).
  • Mit Windows-Taste + r (= Ausführen...) und der Eingabe von cmd eine CMD-Shell (früher: "DOS-Eingabeaufforderung" genannt) öffnen.
  • In dieser Shell mit cscript C:\Loeschen.vbs das Script starten und die Ausgaben prüfen.

Wenn alles ok aussieht, die Zeile 36 auf
Datei.Delete
reduzieren und die Zeile 48 zu
If (Unter.SubFolders.Count + Unter.Files.Count) = 0 Then Unter.Delete
machen - dadurch wird beim nächsten Start des Scripts (dann auch per Doppelklick möglich) nix mehr ausgegeben, sondern nur noch gelöscht.

Zum Nachlesen der Befehle könntest Du Dir die Befehlsreferenz "script56de.chm" etwa von http://dieseyer.de/ besorgen ...
Also wenn ich die 3 Tage auf 0 setze, dann kann ichs ja sofort testen, richtig?
Damit würden alle Dateien, die vor heute erstellt wurden, erfasst - um auch die heutigen Dateien einzubeziehen, müsstest Du -1 verwenden.

Grüße
bastla
Bitte warten ..
Mitglied: Alkenix
26.10.2010 um 16:17 Uhr
So..Also ich hab das ma getestet..
Dann kam folgendes in der CMD:

I:\>cscript C:\Loeschen.vbs
Microsoft (R) Windows Script Host, Version 5.7
Copyright (C) Microsoft Corporation 1996-2001. Alle Rechte vorbehalten.

Das sah für mich "ok" aus. Oo

Und nun hab ich das halt ma umgeändert, und wenn ich doppelklicke passiert nix. :D
Naja, und wenn ich das wieder mit dem cmd befehlt ausführe, passiert ebenfalls nix.

Erm, ich benutze das Notepad++ zum bearbeiten und habe die "bekannten Endungen" ausgestellt.
Somit seh ich ja ob es vbs oder txt ist.


Nur es passiert halt nichts. Seltsam, oder nicht?
Bitte warten ..
Mitglied: bastla
26.10.2010 um 16:22 Uhr
Hallo Alkenix!
Das sah für mich "ok" aus. Oo
Da passiert zumindest gar nix (Schlimmes) ...
Welche Tageanzahl in Zeile 8 verwendest Du? Wie oben angeführt müsstest Du hier 0 oder sogar -1 einsetzen ...

Grüße
bastla
Bitte warten ..
Mitglied: Alkenix
26.10.2010 um 16:28 Uhr
Ich hab zur Zeit die 0 drin. :o
Das sollte doch dann für heute sein?
Ich setz das einfach ma auf -1?
Probieren geht ja bekanntlich über studieren..>.<
Sekunde....

Unerwartet Fehler (Code=438) kommt mit der -1 als Tageszahl oben. :o
Bitte warten ..
Mitglied: bastla
26.10.2010 um 16:41 Uhr
Hallo Alkenix!

Neuer Versuch (mit - hinsichtlich der Ausschlüsse - altem Code):
01.
Set fso = CreateObject("Scripting.FileSystemObject")  
02.
Set WSHShell = WScript.CreateObject("WScript.Shell")  
03.
 
04.
' * hier eigenen Bedürfnissen anpassen *  
05.
strOrdnerliste = "C:\Dokumente und Einstellungen\pweberling\Desktop\Ordnerliste.txt"  
06.
strAusschlussliste = "C:\Dokumente und Einstellungen\pweberling\Desktop\Ausschluss.txt"  
07.
Aufheben = 0 'Anzahl der Tage  
08.
' * Ende der Anpassungen *  
09.
 
10.
Set objOrdnerliste = fso.OpenTextFile(strOrdnerliste, 1)  
11.
Verzeichnis = Split(objOrdnerliste.ReadAll, vbCrLF)  
12.
objOrdnerliste.Close  
13.
Set objAusschlussliste = fso.OpenTextFile(strAusschlussliste, 1)  
14.
Exclude = Split(objAusschlussliste.ReadAll, vbCrLF) 
15.
objAusschlussliste.Close  
16.
 
17.
Heute = Date()  
18.
 
19.
For n = 0 To UBound(Verzeichnis)   
20.
    Set Ordner = fso.GetFolder(Verzeichnis(n))  
21.
    DeleteInFolder(Ordner)  
22.
Next  
23.
 
24.
Sub DeleteInFolder(Ordner)  
25.
Set Dateien = Ordner.Files  
26.
' Alle Dateien in diesem Ordner abklappern  
27.
For Each Datei In Dateien  
28.
    If Int(Datei.DateLastModified) <= (Heute - Aufheben) Then 
29.
        ToKeep = False   
30.
        For Each Ex In Exclude   
31.
            If LCase(Right(Datei.Name, Len(Trim(Ex)))) = LCase(Trim(Ex)) Then   
32.
                ToKeep = True   
33.
                Exit For   
34.
            End If   
35.
        Next   
36.
        If Not ToKeep Then 
37.
            On Error Resume Next 
38.
            WScript.Echo "-" &Datei.DateLastModified&" "&Datei.Path 'Datei.Delete 
39.
            If Err And Err <> 70 Then MsgBox "Unerwarteter Fehler (Code=" & Err & ")", vbCritical: WScript.Quit  
40.
            On Error Goto 0  
41.
        End If  
42.
    End If  
43.
Next 
44.
 
45.
'Unterordner abklappern, DeleteInFolder rekursiv aufrufen  
46.
For Each Unter In Ordner.SubFolders 
47.
    DeleteInFolder(Unter) 
48.
    If (Unter.SubFolders.Count + Unter.Files.Count) = 0 Then WScript.Echo "--"&Unter.Path 'Unter.Delete 
49.
Next  
50.
End Sub
"0 Tage" ist jetzt so zu verstehen, dass auch Dateien von heute nicht verschont werden sollen ...
Die Ausschlüsse werden übrigens nur für Dateien, nicht für Ordner berücksichtigt.
Es sind jetzt nochmals die Bildschirmausgaben integriert (daher über "cscript" starten!), da so (zur Kontrolle) für jede zu löschende Datei das Dateidatum angezeigt werden kann.

Grüße
bastla

P.S.:
Unerwartet Fehler (Code=438) kommt mit der -1 als Tageszahl oben. :o
Bei Fehlermeldungen bitte auch die Zeile anführen (die Meldung konnte in diesem Fall allerdings nur aus Zeile 37 stammen und daher war eine Angabe der Zeile weder möglich noch nötig)...
Bitte warten ..
Mitglied: Alkenix
26.10.2010 um 16:50 Uhr
Servus..Oo

Nun hat er alles ordentlich angezeigt.
Also immer mit Datum und so.
DOCH, irgendwie hätte er auch die "nichtloeschen.txt"s gelöscht. Oo
Das soll er ja nicht..^^
Bitte warten ..
Mitglied: bastla
26.10.2010 um 17:05 Uhr
Hallo Alkenix!
DOCH, irgendwie hätte er auch die "nichtloeschen.txt"s gelöscht. Oo
Steht in der "Ausschluss.txt" ev vor oder nach dem Eintrag "nichtloeschen.txt" noch ein Leerzeichen? Ich editiere oben die Zeile 31, um diesem Umstand vorzubeugen - ansonsten hätte ich vorerst keine Erklärung (bei meinen Tests werden die Ausschlüsse beachtet) ...

Grüße
bastla
Bitte warten ..
Mitglied: Alkenix
28.10.2010 um 10:58 Uhr
Hi bastla!

Entschuldige die späte Antwort.
Ich hab in meiner Ausschluss.txt lediglich stehen: nichtloeschen.
Schließlich sollen ALLE Dateitypen nicht gelöscht werden, die im Namen "nichtloschen" beeinhalten/so heißen.
Bitte warten ..
Mitglied: bastla
28.10.2010 um 12:12 Uhr
Hallo Alkenix!
Ich hab in meiner Ausschluss.txt lediglich stehen: nichtloeschen.
In diesem Fall ist die Zeile 31 auf
If InStr(1, Datei.Name, Trim(Ex), vbTextCompare) > 0 Then
zu ändern ...

Grüße
bastla
Bitte warten ..
Mitglied: Alkenix
28.10.2010 um 12:28 Uhr
Ok, nun löscht er ja noch nicht, richtig?
Aber er hat die Ausnahmen angenommen.
Also (Ich hab ne "nichtloeschen.txt und nen "nichtloeaschen" ordner) beides wurd nicht "per Popup" bemäkelt.^^

Und jetze? :o
Bitte warten ..
Mitglied: bastla
28.10.2010, aktualisiert 18.10.2012
Hallo Alkenix!
Und jetze? :o
... machst du, was hier nach "Wenn alles ok aussieht" beschrieben ist ...

Grüße
bastla
Bitte warten ..
Mitglied: Alkenix
28.10.2010 um 15:00 Uhr
Ok, also das läuft super.
Nur eine Sache ist ja nun noch. ._.
Wenn ein Ordner "nichtloeschen" heißt, dann werden leider alle Dateien darin die nicht "nichtloschen" heißen gelöscht,
und es wäre mir lieber, wenn dann der gesamte Ordner nicht angerührt wird.


Kriegste das noch irgendwie erklärt?>.< Das wäre bombig. :o
Ansonsten ist bis jetzt schonmal alles super. ^^
Ich bin stolz auf dich. xD

Add: Reicht es wenn ich das hier lösche?

'Unterordner abklappern, DeleteInFolder rekursiv aufrufen
For Each Unter In Ordner.SubFolders
DeleteInFolder(Unter)
If (Unter.SubFolders.Count + Unter.Files.Count) = 0 Then Unter.Delete 'Unter.Delete
Bitte warten ..
Mitglied: bastla
28.10.2010 um 16:48 Uhr
Hallo Alkenix!
Reicht es wenn ich das hier lösche?
Wenn Du nur eine Ordnerebene bearbeiten wolltest - ja; ansonsten lass es mal besser wie's ist bzw ersetze gleich das gesamte Unterprogramm "DeleteInFolder(Ordner)":
01.
Sub DeleteInFolder(Ordner) 
02.
ToKeepF = False 
03.
For Each Ex In Exclude   
04.
    If InStr(1, Ordner.Name, Trim(Ex), vbTextCompare) > 0 Then   
05.
        ToKeepF = True   
06.
        Exit For   
07.
    End If   
08.
Next   
09.
If Not ToKeepF Then 
10.
    Set Dateien = Ordner.Files  
11.
    ' Alle Dateien in diesem Ordner abklappern  
12.
    For Each Datei In Dateien  
13.
        If Int(Datei.DateLastModified) <= (Heute - Aufheben) Then 
14.
            ToKeep = False   
15.
            For Each Ex In Exclude   
16.
                If InStr(1, Datei.Name, Trim(Ex), vbTextCompare) > 0 Then  
17.
                    ToKeep = True   
18.
                    Exit For   
19.
                End If   
20.
            Next   
21.
            If Not ToKeep Then 
22.
                On Error Resume Next 
23.
                Datei.Delete 
24.
                If Err And Err <> 70 Then MsgBox "Unerwarteter Fehler (Code=" & Err & ")", vbCritical: WScript.Quit  
25.
                On Error Goto 0  
26.
            End If  
27.
        End If  
28.
    Next 
29.
 
30.
    'Unterordner abklappern, DeleteInFolder rekursiv aufrufen  
31.
    For Each Unter In Ordner.SubFolders 
32.
        DeleteInFolder(Unter) 
33.
        If (Unter.SubFolders.Count + Unter.Files.Count) = 0 Then Unter.Delete 
34.
    Next 
35.
End If 
36.
End Sub
Diese Schreibweise führt dazu, dass auch alle Unterordner des betreffenden Ordners von der Bearbeitung ausgeschlossen werden - wenn dies nicht gewünscht sein sollte (also zwar die Dateien des Ordners selbst - unabhängig von ihrem Alter - erhalten bleiben sollen, dies aber nicht für Dateien der Unterordner gelten sollte) müsste das "End If" aus der Zeile 35 in die Zeile 29 verschoben werden.

Grüße
bastla
Bitte warten ..
Mitglied: Alkenix
08.11.2010 um 09:11 Uhr
Guten Morgen Bastla,

ich hab das Script über meinem Post hier komplett für das alte ersetzt, aber nun tut sich garnichts mehr, wenn ich es ausführen möchte. ._.
Bitte warten ..
Mitglied: bastla
08.11.2010, aktualisiert 18.10.2012
Hallo Alkenix!

"Komplett ersetzt" war dann doch etwas drastisch - gemeint war, den Teil ab der Zeile
Sub DeleteInFolder(Ordner)
(das wäre zB Zeile 24 in meiner letzten oben geposteten Version) zu ersetzen ...

Grüße
bastla
Bitte warten ..
Mitglied: Alkenix
09.11.2010 um 11:45 Uhr
Joa, habs auch bemerkt, tut mir leid. :D
Ich war wohl ein wenig voreilig. xD

Joa, dann wars das ja an sich. Oo
Großen Dank für alles!

Und ich denke/hoffe, man rennt sich nochmal übern weg. :P
Bitte warten ..
Mitglied: Alkenix
11.11.2010 um 14:00 Uhr
Ich weiß nicht wohin damit, aber ich hätte da noch ne private Frage..Oo

Kann man auch ne vbs für nen bestimmten Ordner (Name: Ordner) schreiben,
die einem dann alle MP3 Dateien darin umbenennt?
Also in der Detailübersicht mit Rechtsklick sieht man ja immer "Name, Interpret, Nummer, Jahr, usw".

Und ich möchte nun gerne wissen, ob man eine .vbs so schreiben kann, das sie jede MP3 umbennent von z.B.:

01 Burning Down.mp3
zu
01 - Burning Down.mp3

oder von

01 Bandname Burning down.mp3
zu
01 - Burning Down.mp3
?
Falls wer ne Idee hat, wäre ich demjenigen MEHR als dankbar, weil ich das schon seit Jahren manuell mache, und das bei unmengen von Dateien. ._.
Bitte warten ..
Mitglied: Biber
11.11.2010 um 16:04 Uhr
Moin Alkenix,

Zitat von Alkenix:
Ich weiß nicht wohin damit, aber ich hätte da noch ne private Frage..Oo
Das kann ich beantworten.
  • Erstelle einen eigenen Beitrag im Bereich "Batch & Shell" unterhalb von "Programmierung/Entwicklung",
  • wähle aus der Combobox aus "Ich hab da mal ne Frage"
  • und denke dir den Titel "Mp3-Dateien nach bestimmtem Muster per Script umbenennen" oder so ähnlich aus.

Ansonsten suche mal in unseren FAQ nach "Trittbrettfahrer" bzw neudeutsch "Take-Over" oder "Questnapping".

Kann man auch ne vbs für nen bestimmten Ordner (Name: Ordner) schreiben,
die einem dann alle MP3 Dateien darin umbenennt?
Ja.

Und ich möchte nun gerne wissen, ob man eine .vbs so schreiben kann, das sie jede MP3 umbennent von z.B.:
Set /a rgc+=1
#718
Und wenn du grad in den FAQ bist, suche auch nach rgc.

... weil ich das schon seit Jahren manuell mache, und das be unmengen von Dateien.
Oh, oh.... GEMA liest mit...


Diesen Beitrag hier schliesse ich jetzt.

Grüße
Biber
Bitte warten ..
Neuester Wissensbeitrag
Microsoft

Lizenzwiederverkauf und seine Tücken

(5)

Erfahrungsbericht von DerWoWusste zum Thema Microsoft ...

Ähnliche Inhalte
VB for Applications
VBS Script zum versenden mehrerer Verknüpfungen zu Dateien per Lotus Notes

Frage von Sentinel87 zum Thema VB for Applications ...

Batch & Shell
gelöst älteste dateien via batch löschen (6)

Frage von cali169 zum Thema Batch & Shell ...

Entwicklung
Versteckte .(Punkt)Dateien löschen (3)

Frage von DarkJM zum Thema Entwicklung ...

Heiß diskutierte Inhalte
LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (17)

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

Windows Netzwerk
Windows 10 RDP geht nicht (16)

Frage von Fiasko zum Thema Windows Netzwerk ...

Windows Server
Outlook Verbindungsversuch mit Exchange (15)

Frage von xbast1x zum Thema Windows Server ...