SubFolder einbinden

  • VBScript

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von VaporiZed.

    SubFolder einbinden

    Hallo, ich benötige Hilfe.
    Ich habe folgenden Code zusammen gebastelt. Er soll eigentlich Dateien nach X Tagen (Anzahl Tage im Dateinamen _d_) in Ordner und auch alle Unterordner löschen aber es läuft nicht. Fehler Meldung: Zeile 10, Zeichen: 1 Fehler Objekt erforderlich: file. Warum wird das Objekt file benötigt?

    VB.NET-Quellcode

    1. Verzeichnis = "D:\Neuer Ordner"
    2. Set fso = CreateObject("Scripting.FileSystemObject")
    3. Set ordner = fso.GetFolder(Verzeichnis)
    4. Set regex = CreateObject("vbscript.regexp")
    5. regex.pattern = "_(\d+)_"
    6. DeleteInFolder(ordner)
    7. Sub DeleteInFolder(ordner)
    8. Set dateien = ordner.Files
    9. For Each datei In dateien
    10. set match = regex.Execute(fso.GetBasename(file.Name))
    11. if match.count > 0 then
    12. intDays = CInt(match(0).submatches(0))
    13. if DateAdd("d",intDays,file.DateLastModified) < Now() then
    14. file.Delete
    15. End If
    16. End If
    17. Next
    18. Set untere = ordner.SubFolders
    19. 'Unterordner abklappern, DeleteInFolder rekursiv aufrufen
    20. For Each unter In untere
    21. DeleteInFolder(unter)
    22. Next
    23. End Sub
    ich bin ein Anfänger, bitte habt Verständnis für meine Unwissenheit und eventuelle schlecht gestellte Fragen ?(
    Weil Du eine Zeile drüber datei definierst, aber in Z#10 mit file arbeitest. Ersetze mal file.name durch datei.name.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Danke für den Hinweis, obwohl ich mich jetzt auf die Dateien beziehe (habe zusätzlich zu Zeile 10 auch 13 und 14 angepasst) funktioniert es noch immer nicht. Fehler Zeile 12, Überlauf: CInt

    Quellcode

    1. Verzeichnis = "D:\Neuer Ordner"
    2. Set fso = CreateObject("Scripting.FileSystemObject")
    3. Set ordner = fso.GetFolder(Verzeichnis)
    4. Set regex = CreateObject("vbscript.regexp")
    5. regex.pattern = "_(\d+)_"
    6. DeleteInFolder(ordner)
    7. Sub DeleteInFolder(ordner)
    8. Set dateien = ordner.Files
    9. For Each datei In dateien
    10. set match = regex.Execute(fso.GetBasename(datei.name))
    11. if match.count > 0 then
    12. intDays = CInt(match(0).submatches(0))
    13. if DateAdd("d",intDays,datei.DateLastModified) < Now() then
    14. datei.Delete
    15. End If
    16. End If
    17. Next
    18. Set untere = ordner.SubFolders
    19. 'Unterordner abklappern, DeleteInFolder rekursiv aufrufen
    20. For Each unter In untere
    21. DeleteInFolder(unter)
    22. Next
    23. End Sub


    Wenn ich den Code ohne Einbindung der Unterordner benutze, funktioniert er tadellos

    Quellcode

    1. FOLDER = "D:\Neuer Ordner"
    2. set fso = CreateObject("Scripting.FilesystemObject")
    3. set regex = CreateObject("vbscript.regexp")
    4. regex.pattern = "_(\d+)_"
    5. for each file in fso.GetFolder(FOLDER).Files
    6. set match = regex.Execute(fso.GetBasename(file.Name))
    7. if match.count > 0 then
    8. intDays = CInt(match(0).submatches(0))
    9. if DateAdd("d",intDays,file.DateLastModified) < Now() then
    10. file.Delete
    11. End if
    12. End if
    13. Next
    ich bin ein Anfänger, bitte habt Verständnis für meine Unwissenheit und eventuelle schlecht gestellte Fragen ?(
    Aha, neuer Fehler, also anderes Problem. Wenn Du schon weißt, dass die Zeile einen Überlauf produziert, dann lass Dir doch alle match(0).submatches(0) entweder in ner MsgBox anzeigen oder in einer Datei ausgeben. Dann wirst Du schon erfahren, bei welchem submatch das Programm aussteigt, weil die Umwandlung in einen Integer nicht funktioniert.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Wie lasse ich es in einer MSGBOX anzeigen?.
    Liegt der Fehler daran, dass ich subtype CInt auf die Files eingehe?. Oder bin ich da auf dem Holzweg?.
    Wie würdest du die Unterordner am Besten einbinden?
    ich bin ein Anfänger, bitte habt Verständnis für meine Unwissenheit und eventuelle schlecht gestellte Fragen ?(

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „knuepel“ ()

    knuepel schrieb:

    Wie lasse ich es in einer MSGBOX anzeigen?

    Erschreckend einfach:

    Visual Basic-Quellcode

    1. MsgBox CInt(match(0).submatches(0))

    knuepel schrieb:

    Liegt der Fehler daran, dass ich subtype CInt auf die Files eingehe?. Oder bin ich da auf dem Holzweg?
    Keine Ahnung, was Du Dir von der CInt-Zeile erhoffst. Bei Regex bin ich noch raus. Aber Du wandelst irgendwas in ne Ganzzahl um. Wenn es Dir was hilft, dann mach es.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Du hast wohl offensichtlich mehr als 32k matches in einem deiner Unterverzeichnisse.
    ​CInt can handle betweeen -32,768 and 32,767

    Abgesehen von der Tatsache, dass das sicher der allgemeinen Performance schadet, ist das auch sehr unübersichtlich für die Anwender.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Abgesehen von der Tatsache, dass das sicher der allgemeinen Performance schadet, ist das auch sehr unübersichtlich für die Anwender
    .
    Leider reichen meine wenigen Kenntnisse für ein besseren Code aus, ich war Anfangs froh das der unten stehende Code das tut was er soll. Der Code sucht den Ordner D:\Neuer Ordner nach Dateien (PDF) ab und löscht sie nach Anzahl Tage im Dateiname. Beispiel: im Ordner liegen mehrere PDF Dateien mit den unterschiedlichen Namen. Alle haben aber irgendwo im Dateiname _Zahl_ stehen, diese Zahl gibt die verbleibe Dauer in Tagen an. Also "Dokumnet123_5_.pdf" wird nach 5 Tage gelöscht, Dokument987_3_ Test.pdf wird nach 3 Tage gelöscht usw.
    Nun soll das Script auch alle Unterordner absuchen und entsprechend der Zahl die Dateien löschen. Kannst du mir bitte einen besseren bzw. funktionierenden Code zu Verfügung stellen?. Am besten mit ein paar kleinen Erklärungen.

    Quellcode

    1. FOLDER = "D:\Neuer Ordner"
    2. set fso = CreateObject("Scripting.FilesystemObject")
    3. set regex = CreateObject("vbscript.regexp")
    4. regex.pattern = "_(\d+)_"
    5. for each file in fso.GetFolder(FOLDER).Files
    6. set match = regex.Execute(fso.GetBasename(file.Name))
    7. if match.count > 0 then
    8. intDays = CInt(match(0).submatches(0))
    9. if DateAdd("d",intDays,file.DateLastModified) < Now() then
    10. file.Delete
    11. End if
    12. End if
    13. Next
    ich bin ein Anfänger, bitte habt Verständnis für meine Unwissenheit und eventuelle schlecht gestellte Fragen ?(
    Jetzt versuch doch erstmal den Fehler zu identifizieren und zu posten. Ein Beispiel:

    Visual Basic-Quellcode

    1. On Error Resume Next
    2. Dim i, j
    3. j = 9999999999
    4. i = CInt(j)
    5. If Err.Number <> 0 Then ShowError()
    6. Sub ShowError(strMessage)
    7. WScript.Echo Err.Number & " Srce: " & Err.Source & " Desc: " & Err.Description & ": " & j
    8. Err.Clear
    9. End Sub

    j ist absichtlich zu hoch eingestellt. Es wird daraufhin sauber angezeigt, was das Problem ist und welchen Wert dabei j hat. Pack den Code so in Deinen Code rein, dass eben angezeigt wird, was match(0).submatches(0) ist, wenn der Fehler auftritt, damit da Dir uns uns erstmal klar wird, welch fieser Wert da überhaupt das Problem erzeugt.

    btw: abgekupfert von hier
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Ich glaube es liegt an der Art und Weise wie ich die Unterordner Eingebunden habe, zum Verständnis die Vorgehensweise beim ein einbinden der Unterordner:
    Es müssen die Namen sämtlicher Unterverzeichnisse eingelesen werden müssen und diese in einem Array ablegt werden. Anschließend den Array durchzählen und die Anzahl Iterationen inkl. Array dem Sub übergeben. Ist das richtig?.
    ich bin ein Anfänger, bitte habt Verständnis für meine Unwissenheit und eventuelle schlecht gestellte Fragen ?(
    Es liegt in erster Linie mal daran, dass Du immer noch nicht sagst, was bei match(0).submatches(0) rauskommt, wenn der Fehler kommt. Es geht doch hier momentan nur um diese Zeile: Du wandelst einen RegEx-Match in eine Zahl um. Daran hängt sich irgendwann das Programm auf. Ich hab - wie geschrieben - von RegEx keine Ahnung. Irgendwas mit: Dateiname = _Zahl..._ Wie es dann weitergeht, weiß ich nicht. Aber ohne weitere Infos kann ich nicht mehr weiterhelfen. Da bin ich dann hier raus.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.