Zum Inhalt wechseln


Foto

Ordner mit Batch nach xx Tagen löschen.


  • Bitte melde dich an um zu Antworten
45 Antworten in diesem Thema

#16 d.stegemann

d.stegemann

    Member

  • 275 Beiträge

 

Geschrieben 18. April 2009 - 08:59

Morgen Braintee,

vielleicht hilft es, wenn du beim delete einen force mitgibst...

also in der Art

fso.DeleteFile(file.Path) True


Ich denke die beiden Links sollten dir weiterhelfen....

In speziellen Ordnern Dateien löschen - microsoft.public.de.german.scripting.wsh | Google Groups

Dateien löschen, Exception - microsoft.public.de.german.scripting.wsh | Google Groups

Gruß

Dirk
Status: MCT

MC* is in da house ;)

#17 lefg

lefg

    Expert Member

  • 20.479 Beiträge

 

Geschrieben 18. April 2009 - 09:16

Ein Ordner/Directory kann gelöscht werden mit del oder rd (remove directory) und Parametern, aufgerufen in einem Task (Geplante Task), da braucht man keine Batch, kein Skript.

Das Messbare messen, das Nichtmessbare messbar machen. Galilei.

 

Diskutiere nicht mit ***en, denn sie ziehen dich auf ihr Niveau und schlagen dich dort mit Erfahrung! (Hab ich bei Tom abgeguckt)

 

Koinzidenz begründet keine Korrelation und ist kein Beweis für Kausalität. (Hab ich bei Daniel abgeguckt) https://de.wikipedia...rgo_propter_hoc

 

Absolutistischer“ Geschäftsführungs-Dogmatismus, der jedwede Empirie aus der „Werkstatt“ schlichtweg ignoriert , führt eben zumeist früher als später ….  (Hab ich von Klabautermann)


#18 Cybquest

Cybquest

    Expert Member

  • 1.882 Beiträge

 

Geschrieben 18. April 2009 - 12:06

Hier mit Log und dem von Dirk erwähnten "force":

Const ForReading = 1, ForWriting = 2, ForAppending = 8

strRootFolder = "D:\Test"
strLogFile = "C:\Killfolderlog.txt"
lngDays = 14

Set fso = CreateObject("Scripting.FileSystemObject")
Set ofolder = fso.GetFolder(strRootFolder)
Set flog = fso.OpenTextFile(strLogFile, ForAppending, True)

flog.writeline "---- Alte Ordner in " & strRootFolder & " werden gelöscht! - " & Now()

'Durchlaufe alle Unterverzeichnisse
for each folder in ofolder.subfolders
  KillFolderSub folder
next

flog.writeline "---- Script beendet - " & Now()


Sub KillfolderSub(objFolder)
on error resume next

  'Durchlaufe alle Unterverzeichnisse
  for each subfolder in objfolder.subfolders
    KillFolderSub subfolder
  next

  'Wenn Ordner vor mehr als x Tagen erstellt wurde...
  if objFolder.datecreated < (Date - lngDays) then

    'Alle Dateien im Ordner löschen
    for each file in objfolder.Files
      Err.Clear
      strFile = file.Path
      fso.DeleteFile strFile, true
      if Err = 0 then
        flog.writeline "Datei " & strFile & " gelöscht"
      else
        flog.writeline "Datei " & strFile & " konnte nicht gelöscht werden! - Fehler " & Err & " (" & Err.Description & ")"
      end if
    next

    'Ordner löschen
    Err.Clear
    strFolder = objFolder.Path
    fso.DeleteFolder(strFolder)
    if Err = 0 then
      flog.writeline "Ordner " & strFolder & " gelöscht"
    else
        flog.writeline "Ordner " & strFolder & " konnte nicht gelöscht werden! - Fehler " & Err & " (" & Err.Description & ")"
    end if
  end if

on error goto 0
End Sub

...und noch Fehlerroutine mit eingebaut...
My name is Frank, you can say you to me.

#19 Braintee

Braintee

    Junior Member

  • 114 Beiträge

 

Geschrieben 20. April 2009 - 20:35

Hallo Cyquest,

Danke.

das Script funktioniert mit Ordner aber wenn ich Dateien auch löschen möchte geht das nicht. Kannst Du vielleicht ein letztes Mal.
Wie gesagt, ich kann das Script jetzt verwenden aber damit es universeller Einsatzfähig ist wäre das super wenn das auch funktionieren würde.

Gruß Braintee

#20 Cybquest

Cybquest

    Expert Member

  • 1.882 Beiträge

 

Geschrieben 22. April 2009 - 11:25

Hi,

sammel mal noch deine restlichen Wünsche ;)
Nächste Woche kann ich mich darum wieder kümmern :)

Grüße, Frank
My name is Frank, you can say you to me.

#21 elta33

elta33

    Newbie

  • 15 Beiträge

 

Geschrieben 26. Mai 2009 - 08:48

@Cyquest

Da hab ich schon ne Weile nach gesucht, besten Dank!
Endlich mal ein Script, dass zu funktionieren scheint...

Alle Tolls, die ich bissher probiert habe, orientieren sich am Datum der Dateien und nicht des Hauptordners, so wie ich es brauche.

Falls sich da noch Verbesserungen ergeben sollten, sehr gerne ;-)

Grüße

#22 elta33

elta33

    Newbie

  • 15 Beiträge

 

Geschrieben 08. Juni 2009 - 11:19

@Cyquest

Gibt es vielleicht ein Möglichkeit eine Art Vortschrittsanzeige einzubauen? Nicht zwingend zeitlich basierend, sondern dass man in einem Fenster (z.B. in der Kommandozeile) sieht, wo der Löschvorgang gerade ist. So in der Art, einfach den aktuellen Ordnernamen ausgeben und dahinter "wird gelöscht".
Hier könnte auch gleich die Ausgabe erfolgen wenn das Script beandet ist, weil man das nicht direkt sieht....

Außerdem habe ich innerhalb des Verzeichnisses, wo ich löschen möchte, einige Ordner, die nicht gelöscht werden dürfen, ich kann sie leider nicht generell an einem anderen Ort spreichern. Also sichere ich diese und kopiere sie nach dem Löschvorgang zurück...
Gibt es eine Möglichkeit Ordner auszuschließen?

Das Script trifft sonst genau das was ich brauche. Klein, aber wirkungsvoll ;-)

Vielleicht lässt sich da noch was umsetzten, ich würde mich Freuen.

Grüße

#23 Cybquest

Cybquest

    Expert Member

  • 1.882 Beiträge

 

Geschrieben 08. Juni 2009 - 14:45

Biddeschöööön :)
'---------------------------------------------------------
' KillOldFolders.vbs by FR
'---------------------------------------------------------

'-Konstanten----------------------------------------------

Const ForReading = 1, ForWriting = 2, ForAppending = 8

'-Variablen-----------------------------------------------

strRootFolder = "J:\DIV\VB"
strLogFile = "J:\DIV\KillfolderLog.txt"
strExcludeFile = "J:\DIV\KillfolderExclude.txt"
lngDays = 14

'---------------------------------------------------------

'Wenn Statusmeldungen in DOS-Box gewünscht, Script mittels "cscript.exe KillOldFolders.vbs" starten!
If LCase (Right (WScript.FullName, 11)) <> "cscript.exe" Then boolcsript = false else boolcscript=true

Set fso = CreateObject("Scripting.FileSystemObject")
Set ofolder = fso.GetFolder(strRootFolder)
Set flog = fso.OpenTextFile(strLogFile, ForAppending, True)

writelog "---- Alte Ordner in " & strRootFolder & " werden gelöscht! - " & Now()
writelog "Ausgeschlossene Verzeichnisse:"

Dim arrEx
maxExcludes=0
if fso.FileExists(strExcludeFile) then
  Set fex = fso.OpenTextFile(strExcludeFile, ForReading)
  do while not fex.AtEndOfStream
    MaxExcludes=MaxExcludes+1
    Redim arrEx(maxExcludes)
    arrEx(maxExcludes) = fex.readline()
    writelog arrEx(maxExcludes)
  loop
  fex.close
end if

writelog "----"

'Durchlaufe alle Unterverzeichnisse
for each folder in ofolder.subfolders
  KillFolderSub folder
next

writelog "---- Script beendet - " & Now()
if not boolcscript then MsgBox "Script beendet - " & Now()

'---------------------------------------------------------
'ENDE
'---------------------------------------------------------

Sub KillfolderSub(objFolder)
on error resume next

  'Durchlaufe alle Unterverzeichnisse
  for each subfolder in objfolder.subfolders
    KillFolderSub subfolder
  next
  
  strFolder = objFolder.Path

  'Wenn Ordner in "Exclude"-Liste steht, nicht löschen!
  boolExclude = false
  For i=1 to maxExcludes
    if strFolder = arrEx(i) then boolExclude = true
  next

  if boolExclude then
    writelog "Ordner " & strFolder & " nicht gelöscht (Exclude-Regel!)"

  else

    'Wenn Ordner vor mehr als x Tagen erstellt wurde...
    if objFolder.datecreated < (Date - lngDays) then

      'Alle Dateien im Ordner löschen
      for each file in objfolder.Files
        Err.Clear
        strFile = file.Path
        fso.DeleteFile strFile, true
        if Err = 0 then
          writelog "Datei " & strFile & " gelöscht"
        else
          writelog "Datei " & strFile & " konnte nicht gelöscht werden! - Fehler " & Err & " (" & Err.Description & ")"
        end if
      next

      'Ordner löschen
      Err.Clear
      fso.DeleteFolder(strFolder)
      if Err = 0 then
        writelog "Ordner " & strFolder & " gelöscht"
      else
        writelog "Ordner " & strFolder & " konnte nicht gelöscht werden! - Fehler " & Err & " (" & Err.Description & ")"
      end if
    else
      writelog "Ordner " & strFolder & " nicht gelöscht (jünger als " & lngDays & " Tage! Datecreated: " & objFolder.datecreated
    end if
  end if

on error goto 0
End Sub

'---------------------------------------------------------

Sub Writelog(strMessage)

  flog.writeline strMessage
  if boolcscript then wscript.echo strMessage

End Sub

My name is Frank, you can say you to me.

#24 elta33

elta33

    Newbie

  • 15 Beiträge

 

Geschrieben 09. Juni 2009 - 11:49

Das ging schnell, Danke.

Mache ich einen Fehler beim Handling der Exclude Liste?
Ich gebe die Pfade ganz normal in der Textdatei an, in der Form:

c:\del\test
C:\del\test2

Diese werden auch sauber in der Ausgabe gelistet als auszuschließende Folder, aber dennoch gelöscht. Mache ich was falsch?

Das mit der Anzeige des Vorganges im CMD Fenter ist völlig OK!

Grüße

#25 Cybquest

Cybquest

    Expert Member

  • 1.882 Beiträge

 

Geschrieben 09. Juni 2009 - 11:55

Ersetz mal
if strFolder = arrEx(i) then boolExclude = true
durch
if strFolder = TRIM(arrEx(i)) then boolExclude = true
Möglicherweise hat's am Ende der Strings noch'n Leerzeichen oder den Zeilenumbruch o.ä.
My name is Frank, you can say you to me.

#26 Braintee

Braintee

    Junior Member

  • 114 Beiträge

 

Geschrieben 09. Juni 2009 - 12:06

Hallo Cybquest,

super das Du noch etwas weiter entwickelst. Das Problem mit dem Exclude Verzeichniss habe ich auch ich teste mal Deinen Vorschlag. Kann ich auch Dateien excluden ?
Dann habe ich noch ein Problem wo ich nicht weiß was ich machen soll, auf einem Server beim Kunden ist es so, dass er die Verzeichnisse einfach komplett löscht. Er beachtet überhaupt kein Alter der Ordner. In der Log Datei steht auch drin Ordner nicht gelöscht da er jünger als z.B. 5 Tage ist. Aber wenn ich danach in das Verzeichniss reingehe ist der Ordner weg. Hast Du da eine Idee wie das sein kann ?

Gruß Braintee

#27 elta33

elta33

    Newbie

  • 15 Beiträge

 

Geschrieben 09. Juni 2009 - 12:17

Hab die eine Zeile getauscht, aber die Folder werden weiterhin gelöscht.

Schreibfehler kann ich ausschließen, er listet meine angegeben Ordner in der CMD ausgabe, so dass ich genau vergleichen kann.

Tragisch ist das nicht, aber vielleicht hast du noch ne Idee.

#28 Cybquest

Cybquest

    Expert Member

  • 1.882 Beiträge

 

Geschrieben 09. Juni 2009 - 12:57

War mal wieder zu schnell dahingescriptet gestern ;)
Dem "Redim" hat der "Preserve" gefehlt! Habs nur mit einem Ordner in der Excludeliste getestet, daher gings da noch...
Hier der korrekte Block:
Dim arrEx()
maxExcludes=0
if fso.FileExists(strExcludeFile) then
  Set fex = fso.OpenTextFile(strExcludeFile, ForReading)
  do while not fex.AtEndOfStream
    maxExcludes=maxExcludes+1
    Redim Preserve arrEx(maxExcludes)
    arrEx(maxExcludes) = fex.readline()
    writelog arrEx(maxExcludes)
  loop
  fex.close
end if

@Braintee: Das mit den Dateien überleg ich mir in ner ruhigen Minute mal...
Das mit dem Ordner, der dennoch gelöscht wird... momentan keine Idee. Konnte es hier noch nicht nachvollziehen...
My name is Frank, you can say you to me.

#29 elta33

elta33

    Newbie

  • 15 Beiträge

 

Geschrieben 09. Juni 2009 - 13:25

Block getauscht, leider wird immer noch alles gelöscht.

Aus deinem letzten Beitrag schließe ich, dass es bei dir funktioniert. Dann muss ich irgendeinen Fehler machen, nur weiß ich nicht welchen.

Du schreibst:
"Habs nur mit einem Ordner in der Excludeliste getestet, daher gings da noch..."

Das war vielleicht ein Missverständnis, bei mir ging es auch bei nur einem Ordner in der Liste nicht.

Ich sehe mir alles noch mal in Ruhe an. Danke erstmal

#30 Cybquest

Cybquest

    Expert Member

  • 1.882 Beiträge

 

Geschrieben 09. Juni 2009 - 13:33

Ggf. einfach mal im Code ein paar "writelog" verteilen und div. Variablen ausgeben lassen (so bin ich auf das fehlende "Preserve" gekommen)
My name is Frank, you can say you to me.