Dateien aus Unterordnern kopieren und am Ziel nummerieren

  • VBScript

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von Tschapajew.

    Dateien aus Unterordnern kopieren und am Ziel nummerieren

    Hallo Forum,

    ausgangssituation ist, dass in einem Ordner viele Unterordner mit Dateien liegen. Mein Script soll nun ausgehend vom übergeordneten Ordner, in welchem es auch aufgerufen wird, dessen Namen ermitteln. Dann soll es einen Ordner mit dem Namen des übergeordneten Ordners anlegen, welcher zusätzlich noch den Suffix _files bekommt. Nun soll das Script durch alle unterordner des übergeordneten Ordners iterieren, alle dort befindlichen Dateien in den Ordner [Elternordner]_files kopieren. Dabei ist wichtig, dass alle Dateien am Zielort einen numerischen Präfix bekommen. Das Script soll also vorher zählen, wie viele Dateien es insgesamt zu kopieren hat und anhand der Anzahl von Ziffern in dieser Zahl alle Präfixe mit führenden Nullen auffüllen.
    Mein Script sieht bisher so aus:

    Visual Basic-Quellcode

    1. ' Ordner aus dem aufgerufen wird ermitteln.
    2. currentFolder = CreateObject("WScript.Shell").CurrentDirectory
    3. ' Ordnernamen ermitteln (Nur den letzten teil)
    4. folderName = Right(currentFolder, Len(currentFolder) - InStrRev(currentFolder, "\"))
    5. ' Zielordner definieren
    6. targetFolder = currentFolder & "\" & folderName & "_files"
    7. ' Zielordner anlegen, wenn er noch nicht existiert
    8. Set objFSO = CreateObject("Scripting.FileSystemObject")
    9. If Not objFSO.FolderExists(targetFolder) Then
    10. objFSO.CreateFolder(targetFolder)
    11. End If
    12. ' Zählvariable für Dateinamen
    13. counter = 1
    14. ' Ermittlung, wie viele Führungsnullen gebraucht werden
    15. numDigits = 0
    16. For Each objSubfolder In objFolder.SubFolders
    17. Set objSubfolder = objFSO.GetFolder(objSubfolder.Path)
    18. For Each objFile In objSubfolder.Files
    19. ' Anzahl der Ziffern in der größten Zahl aktualisieren
    20. numDigits = Max(numDigits, Len(counter))
    21. counter = counter + 1
    22. Next
    23. Next
    24. ' Nochmal durch die Unterordner iterieren
    25. counter = 1
    26. For Each objSubfolder In objFolder.SubFolders
    27. Set objSubfolder = objFSO.GetFolder(objSubfolder.Path)
    28. For Each objFile In objSubfolder.Files
    29. ' Datei zum Zielort kopieren und Präfix aus Counter anbringen
    30. objFSO.CopyFile objFile.Path, targetFolder & "\" & Right(String(numDigits, "0") & counter, numDigits) & "-" & objFile.Name
    31. counter = counter + 1
    32. Next
    33. Next


    Leider funktioniert das nicht so, wie ich mir das gedacht habe. Ich Bekomme beim objFolder in Zeile 21 die Fehlermeldung, dass das Objekt erforderlich sei. Dabei dachte ich, ich hätte das oben mit dem Create Statement erzeugt.
    Kann mir hier jemand helfen?

    LG

    Richard

    *Code-BBCode eingefügt*

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Servus Marcus,

    das hat zumindest nun etwas geholfen. Ich habe mal ein wscript.echo eingefügt, um zu schauen, ob er überhaupt einen Ordner zu greifen bekommt, was auch der Fall ist. Leider scheint es noch Probleme zugeben, wenn die Führungsnullen hochgesetzt werden sollen. Hier mein neues Script:

    Visual Basic-Quellcode

    1. ' Get the current folder
    2. currentFolder = CreateObject("WScript.Shell").CurrentDirectory
    3. ' Get the folder name
    4. folderName = Right(currentFolder, Len(currentFolder) - InStrRev(currentFolder, "\"))
    5. ' Define the target folder
    6. targetFolder = currentFolder & "\" & folderName & "_files"
    7. ' Create the target folder if it does not exist
    8. Set objFSO = CreateObject("Scripting.FileSystemObject")
    9. If Not objFSO.FolderExists(targetFolder) Then
    10. objFSO.CreateFolder(targetFolder)
    11. End If
    12. ' Create a counter for the file naming
    13. counter = 1
    14. ' Find the number of digits in the highest number
    15. numDigits = 0
    16. Set objFolder = objFSO.GetFolder(currentFolder)
    17. For Each objSubfolder In objFolder.SubFolders
    18. Set objSubfolder = objFSO.GetFolder(objSubfolder.Path)
    19. For Each objFile In objSubfolder.Files
    20. wscript.echo(objFile)
    21. ' Update the number of digits in the highest number
    22. numDigits = Max(numDigits, Len(counter))
    23. counter = counter + 1
    24. Next
    25. Next
    26. ' Iterate through all subfolders again
    27. counter = 1
    28. For Each objSubfolder In objFolder.SubFolders
    29. Set objSubfolder = objFSO.GetFolder(objSubfolder.Path)
    30. For Each objFile In objSubfolder.Files
    31. ' Copy the file to the target folder and rename it with the counter
    32. objFSO.CopyFile objFile.Path, targetFolder & "\" & Right(String(numDigits, "0") & counter, numDigits) & "-" & objFile.Name
    33. counter = counter + 1
    34. Next
    35. Next


    Danke für deine Mühe und

    LG

    Richard

    *Nochmal Code-BBCode eingefügt, bitte demnächst selbst machen!*

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()