ich möchte Dateien älter X löschen. Dabei bekomme ich direkt nach dem
Löschen der ersten Datei (delete.f) eine Exception (80020009), obwohl die
Datei gelöscht wird. Warum? Das lief früher[tm] einwandfrei.
Danke und Gruß, Helmut
Option explicit
DIM foldername
DIM folder
DIM fso
DIM files
DIM f
DIM subfolder
DIM f_subfolder
DIM timespan
DIM offset
DIM logfile
foldername = "\\server.domain.tld\DAT"
timespan = 60*24*90 ' Minuten = 90 Tage
offset = timespan*(1/(24*60))
Set fso = CreateObject("Scripting.FileSystemObject")
Set folder = fso.GetFolder(foldername)
Set logfile = fso.CreateTextFile(foldername & "\filestodelete.log", True)
DeleteInFolder(folder)
set fso = Nothing
set folder = Nothing
set logfile = Nothing
wscript.quit
Sub DeleteInFolder(folder)
Set files = folder.Files
For Each f In files
If (((now - (f.DateCreated) >= offset)) AND ((now -
(f.DateLastModified)) >= offset)) then
logfile.WriteLine "Deleting " & f & ", created at " & (now -
(f.DateCreated) >= offset) & ", last modified " & (now -
(f.DateLastModified))
f.Delete
logfile.WriteLine "Deleted" & f
End If
Next
Set subfolder = Folder.SubFolders
For Each f_subfolder In subfolder
DeleteInFolder(f_subfolder)
Next
End Sub
--
No Swen today, my love has gone away
My mailbox stands for lorn, a symbol of the dawn
Es würde mich sehr überraschen, wenn dein Script je einwandfrei lief. In
dieser Zeile
f.Delete
löschst Du das Objekt "f", so dass es nicht mehr existiert, und in der
nächsten Zeile
logfile.WriteLine "Deleted" & f
beziehst Du dich wieder darauf. Das geht natürlich nicht! Am einfachsten ist
es, die Reihenfolge der Zeilen zu ändern:
logfile.WriteLine "Deleting" & f.path
f.Delete
> "Helmut Schneider" <jump...@gmx.de> wrote in message
> news:71sh1lF...@mid.individual.net...
>> Hi,
>>
>> ich möchte Dateien älter X löschen. Dabei bekomme ich direkt nach dem
>> Löschen der ersten Datei (delete.f) eine Exception (80020009), obwohl
>> die Datei gelöscht wird. Warum? Das lief früher[tm] einwandfrei.
[...]
> Es würde mich sehr überraschen, wenn dein Script je einwandfrei lief. In
> dieser Zeile
> f.Delete
> löschst Du das Objekt "f", so dass es nicht mehr existiert, und in der
> nächsten Zeile
>
> logfile.WriteLine "Deleted" & f
>
> beziehst Du dich wieder darauf. Das geht natürlich nicht! Am einfachsten
> ist es, die Reihenfolge der Zeilen zu ändern:
>
> logfile.WriteLine "Deleting" & f.path
> f.Delete
Ja, das war ein copy&paste Fehler. Aber die Exception ist auch das Thema...
Willst du andeuten, dass das Programm, das du uns gezeigt hast, gar nicht
das Programm ist, das du erprobt hast? Dann wäre es eigentlich von Nutzen,
uns das richtige Programm zu zeigen und nicht irgend einen Prototyp. Zudem
empfehle ich, dass du noch ein paar Zeilen von der Form "wscript.echo
f.path" zwecks Debugging einfügst, damit du weisst, bei welcher Datei dein
Programm protestiert. Vermutlich findest du dabei die Ursache deines
Problemes.
Nur, dass die Zeile
logfile.WriteLine "Deleted" & f
im Original nicht vorhanden ist. Aber ist eh egal, ich kann die Exception
nicht mehr nachvollziehen. Dass das Script an einer read-only Datei
gescheitert ist, hab ich inzwischen herausgefunden, aber warum es gleich
eine Exception geworfen hat wird wohl ersteinmal ein Geheimnis bleiben.
Aber Danke trotzdem für den (nicht zu unterschätzenden) geistigen Beistand.
Helmut
>
> im Original nicht vorhanden ist. Aber ist eh egal, ich kann die Exception
> nicht mehr nachvollziehen. Dass das Script an einer read-only Datei
> gescheitert ist, hab ich inzwischen herausgefunden, aber warum es gleich
> eine Exception geworfen hat wird wohl ersteinmal ein Geheimnis bleiben.
vielleicht bringt ein Auszug aus der Scripting Hilfe Licht ins Dunkel.
object.Delete( force ); Hast du es schonmal mit dem Parameter force probiert. Evtl. kommt dann kein Fehler hoch.GrußDirk
Ich hab 'force' versucht, aber wohl immer den falschen Syntax erwischt.
Derweil helfe ich mir mit
f.Attributes = 0
Wie muss der Syntax denn *genau* lauten?
f.delete(force)
bringt immer ein (sinngemäss) ungültige Anzahl von Parametern. Oder liegt es
an den fehlenden Lehrzeichen?!
> Ich hab 'force' versucht, aber wohl immer den falschen Syntax erwischt.
> Derweil helfe ich mir mit
>
> f.Attributes = 0
>
> Wie muss der Syntax denn *genau* lauten?
>
> f.delete(force)
>
> bringt immer ein (sinngemäss) ungültige Anzahl von Parametern. Oder liegt es
> an den fehlenden Lehrzeichen?!
>
ich hab auch ein wenig dran rumexperimentieren müssen...
Irgendwie war das force ein wenig zickig :-)
Hier jetzt mal ein lauffähiges Sample, das eigentlich ziemlich einfach auf deinen Fall zu übertragen ist..
-- Code --
Set oFSO = CreateObject("Scripting.FileSystemObject")
Set oFolder = oFSO.GetFolder(".")
For Each oFile In oFolder.Files
MsgBox oFile.Name
If lcase(Left(oFile.Name, 2)) = "bp" Then
oFile.delete (force)
End If
Next
-- Ende Code--
Gruß
Dirk
Das beruhigt mich, ich hab schon an mir selbst gezweifelt... :)
> oFile.delete (force)
Tut, ja.
Merci, Helmut
> Dirk Stegemann <dsgr...@prima.de> wrote:
>> Hallo Helmut,
>>
>>> Ich hab 'force' versucht, aber wohl immer den falschen Syntax
>>> erwischt. Derweil helfe ich mir mit
/Force/ ist nur ein Platzhalter für einen boolschen Wert, das heißt
entweder *True* oder *False*.
| Boolean value that is *True* if files or folders with the read-only
| attribute set are to be deleted; *False* (default) if they are not.
aus: /Scripting Runtime Library/
*Delete Method*
http://msdn.microsoft.com/en-us/library/0k4wket3(VS.85).aspx
Ferner gibt es die vom Interpreter vordefinierten Konstanten:
Constant Value Description
-----------------------------------------------------------------------
vbUseDefault -2 Use default from computer's regional settings.
vbTrue -1 True
vbFalse 0 False
>> oFile.delete (force)
>
> Tut, ja.
Nee!
Wenn die Methode allein in einer Zeile steht, muss es so lauten:
f.delete True
Es geht aber auch:
Call f.delete(True)
Steht die Methode allein, sind keine Klammern nötig, wird eine Rückgabe
ausgewertet, müssen immer Klammern stehen:
If fso.FileExists(f.Path) Then
fso.DeleteFile f.Path, True
End If
Oda einfach:
oFile.delete True
Existiert mehr als ein Parameter zu einer Methode, so werden die
Parameter durch Kommata getrennt. Wird ein FileSystemObject gelöscht, so
existiert danach das Object natürlich ebenfalls nicht mehr.
--
ЯR
Das ist mir schon klar.
>>> oFile.delete (force)
>>
>> Tut, ja.
>
> Nee!
Schmeisst aber keinen Fehler (oFile.delete (true). Hm...
> Wenn die Methode allein in einer Zeile steht, muss es so lauten:
> f.delete True
Genau das schmiss einen Fehler.
> Es geht aber auch:
> Call f.delete(True)
Das (ohne) call ebenfalls.
> fso.DeleteFile f.Path, True
Das auch.
> oFile.delete True
Ebenso.
Ich hab die Möglichekeiten alle nochmal versucht und jetzt funktionieren
sie. Ich schliesse daraus, dass ich irgendetwas kaputt programmiert hatte.
Egal, läuft ja nun.
>>>> oFile.delete (force)
>>>
>>> Tut, ja.
>>
>> Nee!
>
> Schmeisst aber keinen Fehler (oFile.delete (true). Hm...
Tja, an den Klammern in VBScript haben sich schon etliche Logiker die
Zähne ausgebissen. :-) Ich habe so etwa 10 Jahre gebraucht, um das
richtig zu begreifen. lol Ich habe hier zur Demonstration ein kleinen
Auszug aus einem Skript eingefügt, das alle Dateien in einer
Ordnerhierarchie löscht, jedoch nicht die Ordner, um das noch einmal zu
verdeutlichen:
If fso.FolderExists(strFolder) Then
WScript.Quit(DelFilesHier(fso.GetFolder(strFolder)))
End If
Diese Zeilen rufen die entsprechende Funktion auf und liefern die Anzahl
der gelöschten Dateien als Errorlevel zurück. Da das Skript von Zeit zu
Zeit über den Taskplaner gestartet wird, kann ich so jederzeit im
Explorer im Ordner 'Geplante Tasks' in der Systemsteuerung sehen,
wieviele Dateien zuletzt gelöscht wurden.
Function DelFilesHier(ByRef fsoFolder) ' Löscht alle Dateien in einer
Dim fsoItem, i ' Ordner-Hierarchie
For Each fsoItem In fsoFolder.Files
On Error Resume Next
fsoItem.Delete True
On Error GoTo 0
If Err Then Err.Clear
i = i + 1
Next
For Each fsoItem In fsoFolder.SubFolders
i = i + DelFilesHier(fsoItem)
Next
DelFilesHier = i
End Function
Die ist allerdings nur ein gekürzter Auszug, das Skript ist wesentlich
komplizierter aufgebaut, es löscht hin und wieder die temporären
Internetdateien des IE, den ich nur sehr selten nutze. Über den
Parameter beim Aufruf kann ich jedoch auch jede beliebige andere
Ordnerstruktur bearbeiten:
Const ssfINTERNETCACHE = &h20
Set fso = CreateObject("Scripting.FileSystemObject")
If WScript.Arguments.Count > 0 Then
If fso.FolderExists(WScript.Arguments(0)) Then
strFolder = WScript.Arguments(0)
End If
Else
With CreateObject("Shell.Application")
strFolder = .NameSpace(ssfINTERNETCACHE).Self.Path
End With
End If
Naja, wenn der Name des Ordners flasch eingegeben wurde, bekommt der
dämliche Benutzer nicht einmal eine Fehlermeldung, das macht aber nix,
weil nur ich dieser Kerl sein kann. ;-) Man könnte diese Zeile nach den
Vorhergehenden einfügen, dann wird der Fehler zumindest über den
Rückgabewert signalisiert:
WScript.Quit(-1)
Da die Quit-Methode einen Wert an das Skript zurückliefert, müssen hier
natürlich Klammern gesetzt werden.
--
ЯR