sansebastian
Goto Top

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

Hallo Zusammen!
Der Artikel bezieht sich teilweise auf den Thread:


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

Content-ID: 34554

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

Ausgedruckt am: 17.11.2024 um 04:11 Uhr

Biber
Biber 12.02.2007 um 13:55:36 Uhr
Goto Top
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:
' DelOldScrap.vbs <inAndBelowFolder> <AgeInDays>  
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

for each subfolder in mySubfolders
   <b> If Lcase(Subfolder.name) != LCase( "X:\Subfolder\NameVomFolderDerIgnoriertWerden soll") then </b>  
         If subfolder.DateCreated < olddate then
             subfolder.Delete
         end if
   <b>end if</b>
next 

Sub DisplayInfo
    MsgBox "Usage: deleteoldfolders.vbs [FolderPath] [Anzahl Tage]", vbExclamation, "Missing Arguments"  
End Sub
[Ungetestete Skizze]

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

Gruss
Biber
sansebastian
sansebastian 12.02.2007 um 14:00:18 Uhr
Goto Top
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....
sansebastian
sansebastian 12.02.2007 um 14:06:56 Uhr
Goto Top
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....!?
sansebastian
sansebastian 12.02.2007 um 14:45:00 Uhr
Goto Top
Ich habe da eine Fehlermeldung.....
Er will bestimmt eine Anweisung bezüglich 'Then'. Hab es mal mit 'next' versucht ... geht aber nicht.... face-sad

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
bastla
bastla 13.02.2007 um 12:01:58 Uhr
Goto Top
Hallo sansebastian!

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

Grüße
bastla
bastla
bastla 13.02.2007 um 12:34:47 Uhr
Goto Top
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
sansebastian
sansebastian 14.02.2007 um 09:12:46 Uhr
Goto Top
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
bastla
bastla 16.02.2007 um 08:53:07 Uhr
Goto Top
Hallo sansebastian!

Hat leider etwas gedauert ...

Versuch mal die folgende Variante:
' DelOldScrap.vbs <BelowFolder> <AgeInDays>  
Const Chef="ChefDaten" 'Ordnername ohne Pfadangabe  

Set myArguments = WScript.Arguments
If myArguments.Count <> 2 Then    
	Usage
    Wscript.Quit (1)
End if

Heute = FormatDateTime(Date, 2)
OldDate = DateAdd("d","-" & myArguments(1), Heute)  

Set objFS = CreateObject("Scripting.FilesystemObject")  
If objFS.FolderExists(myArguments(0)) Then
	DoSubFolders objFS.GetFolder(myArguments(0))
Else
	Usage
End If
MsgBox "Fertig."  
Sub DoSubFolders (Folder)
For Each SubFolder In Folder.SubFolders
    If LCase(SubFolder.Name) <> LCase(Chef) Then
		For Each File In SubFolder.Files
			If File.DateCreated < OldDate Then 'oder .DateLastModified für "letzte Änderung"  
				File.Delete
			End If
		Next
		DoSubFolders(SubFolder)
		If (SubFolder.SubFolders.Count + SubFolder.Files.Count) = 0 Then
			SubFolder.Delete
		End If
	End If
Next 
End Sub
Sub Usage
MsgBox "Usage: " & WScript.ScriptName & " StartPfad TageAnzahl", vbExclamation, "Argumente überprüfen ..."  
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
Scriptname.vbs Startpfad Tageanzahl
Der Startpfad muss vorhanden sein, kann aber zB auch "T:\" lauten.

Grüße
bastla
bastla
bastla 16.02.2007 um 08:54:45 Uhr
Goto Top
Doppelpost ...
sansebastian
sansebastian 01.03.2007 um 11:16:45 Uhr
Goto Top
??? Doppelpost ???
bastla
bastla 01.03.2007 um 11:23:54 Uhr
Goto Top
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
sansebastian
sansebastian 01.03.2007 um 11:30:35 Uhr
Goto Top
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.
sansebastian
sansebastian 02.03.2007 um 14:05:01 Uhr
Goto Top
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
TSglueck
TSglueck 19.02.2009 um 13:38:02 Uhr
Goto Top
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
bastla
bastla 19.02.2009 um 21:31:17 Uhr
Goto Top
Hallo TSglueck!

Danke fürs Bedanken ... face-smile

Etwas leichter erweiterbar (wenn's denn nötig sein sollte) durch Hinzufügen einer weiteren "Case"-Zeile wäre folgende Variante:
Set objFS = CreateObject("Scripting.FilesystemObject")  
Set mySubfolders = objFS.GetFolder("C:\Dokumente und Einstellungen").Subfolders  
For Each Subfolder In mySubfolders
    Select Case LCase(Subfolder.Name)
        Case LCase("Administrator")  
        Case LCase("All Users")  
        Case LCase("Default User")  
        Case LCase("LocalService")  
        Case LCase("NetworkService")  
        Case Else	
            Subfolder.Delete
    End Select
Next
Grüße
bastla
Alkenix
Alkenix 26.10.2010 um 11:49:18 Uhr
Goto Top
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:

Set fso = CreateObject("Scripting.FileSystemObject")   
Set WSHShell = WScript.CreateObject("WScript.Shell")   
On Error Resume Next 
' * hier eigenen Bedürfnissen anpassen *   
strOrdnerliste = "C:\Dokumente und Einstellungen\pweberling\Desktop\Ordnerliste.txt"   
strAusschlussliste = "C:\Dokumente und Einstellungen\pweberling\Desktop\Ausschluss.txt"   
Aufheben = 0 'Anzahl der Tage   
' * Ende der Anpassungen *   
Set objOrdnerliste = fso.OpenTextFile(strOrdnerliste, 1) 
Verzeichnis = Split(objOrdnerliste.ReadAll, vbCrLF) 
objOrdnerliste.Close 
Set objAusschlussliste = fso.OpenTextFile(strAusschlussliste, 1) 
Exclude = Split(objAusschlussliste.ReadAll, vbCrLF) 
objAusschlussliste.Close 
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 
		ToKeep = False 
		For Each Ex In Exclude 
			If LCase(Right(Datei.Name, Len(Ex))) = LCase(Ex) Then 
				ToKeep = True 
				Exit For 
			End If 
		Next 
		If Not ToKeep 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

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]
bastla
bastla 26.10.2010 um 15:05:04 Uhr
Goto Top
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:
Set fso = CreateObject("Scripting.FileSystemObject")   
Set WSHShell = WScript.CreateObject("WScript.Shell")   
'On Error Resume Next '## während der Testphase kontraproduktiv ##  

' * hier eigenen Bedürfnissen anpassen *   
strOrdnerliste = "C:\Dokumente und Einstellungen\pweberling\Desktop\Ordnerliste.txt"   
strAusschlussliste = "C:\Dokumente und Einstellungen\pweberling\Desktop\Ausschluss.txt"   
Aufheben = 3 'Anzahl der Tage   
' * Ende der Anpassungen *   

Set objOrdnerliste = fso.OpenTextFile(strOrdnerliste) 
Verzeichnis = Split(objOrdnerliste.ReadAll, vbCrLF) 
objOrdnerliste.Close 
Set objAusschlussliste = fso.OpenTextFile(strAusschlussliste) 
Exclude = "#" & Replace(objAusschlussliste.ReadAll, vbCrLF, "#") & "#"  
objAusschlussliste.Close 

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
        'nur Dateien, deren Name nicht wie ein Eintrag der Ausschlussliste endet  
        '(für exakte Übereinstimmung - außer Groß-/Kleinschreibung - wäre  
        '"#" & Datei.Name & "#"  
        'zu verwenden)  
        If InStr(1, Exclude, Datei.Name & "#", vbTextCompare) = 0 Then  
            On Error Resume Next
            WScript.Echo "-" &Datei.DateLastModified&" "&Datei.Path '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
    'nur Ordner, deren Name nicht wie ein Eintrag der Ausschlussliste endet  
    If InStr(1, Exclude, Unter.Name & "#", vbTextCompare) = 0 Then   
        DeleteInFolder(Unter)
        If (Unter.SubFolders.Count + Unter.Files.Count) = 0 Then WScript.Echo "--"&Unter.Path 'Unter.Delete  
    End If
Next 
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
Alkenix
Alkenix 26.10.2010 um 15:23:52 Uhr
Goto Top
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! face-smile

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..^^
bastla
bastla 26.10.2010 um 15:45:04 Uhr
Goto Top
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 ... face-smile
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
Alkenix
Alkenix 26.10.2010 um 16:17:39 Uhr
Goto Top
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?
bastla
bastla 26.10.2010 um 16:22:08 Uhr
Goto Top
Hallo Alkenix!
Das sah für mich "ok" aus. Oo
Da passiert zumindest gar nix (Schlimmes) ... face-wink
Welche Tageanzahl in Zeile 8 verwendest Du? Wie oben angeführt müsstest Du hier 0 oder sogar -1 einsetzen ...

Grüße
bastla
Alkenix
Alkenix 26.10.2010 um 16:28:07 Uhr
Goto Top
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
bastla
bastla 26.10.2010 um 16:41:32 Uhr
Goto Top
Hallo Alkenix!

Neuer Versuch (mit - hinsichtlich der Ausschlüsse - altem Code):
Set fso = CreateObject("Scripting.FileSystemObject")   
Set WSHShell = WScript.CreateObject("WScript.Shell")   

' * hier eigenen Bedürfnissen anpassen *   
strOrdnerliste = "C:\Dokumente und Einstellungen\pweberling\Desktop\Ordnerliste.txt"   
strAusschlussliste = "C:\Dokumente und Einstellungen\pweberling\Desktop\Ausschluss.txt"   
Aufheben = 0 'Anzahl der Tage   
' * Ende der Anpassungen *   

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

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 Int(Datei.DateLastModified) <= (Heute - Aufheben) Then
        ToKeep = False  
        For Each Ex In Exclude  
            If LCase(Right(Datei.Name, Len(Trim(Ex)))) = LCase(Trim(Ex)) Then  
                ToKeep = True  
                Exit For  
            End If  
        Next  
        If Not ToKeep Then
            On Error Resume Next
            WScript.Echo "-" &Datei.DateLastModified&" "&Datei.Path '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 WScript.Echo "--"&Unter.Path 'Unter.Delete  
Next 
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)...
Alkenix
Alkenix 26.10.2010 um 16:50:59 Uhr
Goto Top
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..^^
bastla
bastla 26.10.2010 um 17:05:01 Uhr
Goto Top
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
Alkenix
Alkenix 28.10.2010 um 10:58:24 Uhr
Goto Top
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.
bastla
bastla 28.10.2010 um 12:12:52 Uhr
Goto Top
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
Alkenix
Alkenix 28.10.2010 um 12:28:27 Uhr
Goto Top
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
bastla
bastla 28.10.2010, aktualisiert am 18.10.2012 um 18:43:55 Uhr
Goto Top
Hallo Alkenix!
Und jetze? :o
... machst du, was hier nach "Wenn alles ok aussieht" beschrieben ist ... face-wink

Grüße
bastla
Alkenix
Alkenix 28.10.2010 um 15:00:06 Uhr
Goto Top
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
bastla
bastla 28.10.2010 um 16:48:31 Uhr
Goto Top
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)":
Sub DeleteInFolder(Ordner)
ToKeepF = False
For Each Ex In Exclude  
    If InStr(1, Ordner.Name, Trim(Ex), vbTextCompare) > 0 Then  
        ToKeepF = True  
        Exit For  
    End If  
Next  
If Not ToKeepF Then
    Set Dateien = Ordner.Files 
    ' Alle Dateien in diesem Ordner abklappern   
    For Each Datei In Dateien 
        If Int(Datei.DateLastModified) <= (Heute - Aufheben) Then
            ToKeep = False  
            For Each Ex In Exclude  
                If InStr(1, Datei.Name, Trim(Ex), vbTextCompare) > 0 Then 
                    ToKeep = True  
                    Exit For  
                End If  
            Next  
            If Not ToKeep 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 If
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
Alkenix
Alkenix 08.11.2010 um 09:11:12 Uhr
Goto Top
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. ._.
bastla
bastla 08.11.2010, aktualisiert am 18.10.2012 um 18:44:01 Uhr
Goto Top
Hallo Alkenix!

"Komplett ersetzt" war dann doch etwas drastisch face-wink - 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
Alkenix
Alkenix 09.11.2010 um 11:45:55 Uhr
Goto Top
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! face-smile

Und ich denke/hoffe, man rennt sich nochmal übern weg. :P
Alkenix
Alkenix 11.11.2010 um 14:00:58 Uhr
Goto Top
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. ._.
Biber
Biber 11.11.2010 um 16:04:48 Uhr
Goto Top
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