Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Dateien löschen, Exception

20 views
Skip to first unread message

Helmut Schneider

unread,
Mar 12, 2009, 9:29:25 AM3/12/09
to
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.

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

Pegasus [MVP]

unread,
Mar 12, 2009, 1:07:28 PM3/12/09
to

"Helmut Schneider" <jump...@gmx.de> wrote in message
news:71sh1lF...@mid.individual.net...

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

unread,
Mar 12, 2009, 3:28:29 PM3/12/09
to
Pegasus [MVP] <ne...@microsoft.com> wrote:

> "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...

Pegasus [MVP]

unread,
Mar 12, 2009, 4:20:26 PM3/12/09
to

"Helmut Schneider" <jump...@gmx.de> wrote in message
news:71t62uF...@mid.individual.net...

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.


Helmut Schneider

unread,
Mar 12, 2009, 6:22:10 PM3/12/09
to

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

Dirk Stegemann

unread,
Mar 12, 2009, 8:24:53 PM3/12/09
to
Hallo 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

Helmut Schneider

unread,
Mar 13, 2009, 9:39:08 AM3/13/09
to

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?!

Dirk Stegemann

unread,
Mar 14, 2009, 5:30:08 AM3/14/09
to
Hallo Helmut,


> 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

Helmut Schneider

unread,
Mar 14, 2009, 8:38:20 AM3/14/09
to
Dirk Stegemann <dsgr...@prima.de> wrote:
> Hallo Helmut,
>
>> 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 :-)

Das beruhigt mich, ich hab schon an mir selbst gezweifelt... :)

> oFile.delete (force)

Tut, ja.

Merci, Helmut

Ruediger Roesler

unread,
Mar 14, 2009, 10:27:01 AM3/14/09
to
Helmut Schneider <jump...@gmx.de> typed:

> 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

Helmut Schneider

unread,
Mar 14, 2009, 11:47:19 AM3/14/09
to
Ruediger Roesler <admini...@schutzwall.invalid> wrote:
> Helmut Schneider <jump...@gmx.de> typed:
>
>> Dirk Stegemann <dsgr...@prima.de> wrote:
>>>> 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*.

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.

Ruediger Roesler

unread,
Mar 16, 2009, 12:29:14 PM3/16/09
to
Helmut Schneider <jump...@gmx.de> typed:

>>>> 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

0 new messages