Ordnernamen auslesen und in Exceldatei schreiben

  • VBScript

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von silence.

    Ordnernamen auslesen und in Exceldatei schreiben

    Ich habe folgendes Problem, ich habe einen Ordner mit mehreren Unterordnern, die Namen dieser Unterordner (nur die Namen kein Pfad)
    sollen in eine Exceltabelle importiert werden und zwar immer mit 2 Zeilen Abstand, also so:

    Aus:

    C:\Ordner 1\Unterordner 1
    C:\Ordner 1\Unterordner 2
    C:\Ordner 1\Unterordner 3
    C:\Ordner 1\Unterordner 4

    Solle eine Excelliste werden, die so aussieht:

    Zeile1: Unterordner1
    Zeile2:
    Zeile3:
    Zeile4: Unterordner2
    Zeile5:
    Zeile6:
    Zeile7: Unterordner3

    Kann mir da jemand weiterhelfen ?
    VBS, es soll eine Datei werden, die ich einfach in einen beliebigen Ordner kopiere und wenn ich sie ausführe dann eben die Unterordner in diesem Ordner gelistet werden,
    das bekomm ich auch selbst hin, nur das Grundgerüst fehlt mir.

    Momentan bekomm ich eine .txt Datei, diese ist aber nicht korrekt sortiert, sondern schmeisst die Ordner durcheinander.

    Mein Script sieht derzeit so aus:

    Option Explicit

    Dim WSHShell, fso, oArgs
    Dim oFolders, oSubFolder, oFiles, Folder
    Dim i, Text, Pfad, DateiX, VerzX, Verz(), Datei()

    Set WSHShell = WScript.CreateObject("WScript.Shell")
    Set fso = WScript.CreateObject("Scripting.FileSystemObject")
    set oArgs = Wscript.Arguments

    If oArgs.Count > 0 Then ' gibt es Argumente?
    Pfad = oArgs.item(0) ' erstes Argument

    if fso.FileExists( Pfad ) then Pfad = fso.GetParentFolderName( Pfad )

    ' obige Zeile wird nur ausgeführt, wenn "Pfad" eine Datei ist

    Else ' es gibt keine Argumente!
    Pfad = fso.GetFolder( "." ) ' Verzeichnis, in dem sich das Skript befindet
    End If

    if not fso.FolderExists( Pfad ) then

    MsgBox UCase(Pfad) & " existiert nicht!" & vbCRLF & vbCRLF & " . . . das ist das Ende.", , WScript.ScriptName
    WScript.Quit

    End If

    ' Verzeichnisliste an Array übergeben

    i = 0

    Set oFolders = fso.GetFolder( Pfad )
    Set oSubFolder = oFolders.SubFolders

    For Each VerzX In oSubFolder
    ReDim Preserve Verz(i)
    Verz(i) = VerzX.Name
    i = i + 1
    Next
    Set oFiles = nothing
    Set oFolders = nothing

    ' Array an Text übergeben

    Text = ""

    If i > 0 then ' wenn es Verzeichnis(se) gibt
    For i = 0 to UBound( Verz )
    Text = Text & Verz(i) & vbCRLF & vbCRLF & vbCRLF
    Next
    Else
    Text = "keine Unterverzeichnisse vorhanden."
    End If

    Dim objFSO, objFile
    Const ForWriting = 2
    Const Create = true

    Set objFSO = Wscript.CreateObject("Scripting.FileSystemObject")
    Set objFile = objFSO.OpenTextFile("C:\Windows\test.txt", ForWriting, Create)

    objFile.WriteLine Text
    objFile.close

    Set objFile = nothing
    Set objFSO = nothing
    Hallo,

    spätestens, wenn die Unterordner weitere Unterordner haben, wird es unübersichtlich. Dann musst Du noch abfangen, wenn jemand ein Laufwerk drauf zieht. Das gibt erstmal viele Unterordner und zweitens Probleme bei SystemOrdnern wie Mülltonne und Wiederherstellungsdateien.

    Edit:
    um soweit alles abzufangen, musste ich doch etwas mehr Zeit verbraten, als ich Anfangs dachte.

    Damit das nicht umsonst war, hier mein Lösungsvorschlag. Ich hoffe, das sind keine Hausaufgaben. Dann besser selber probieren. Vorsichtshalber habe ich keine Bemerkungen angefügt ;)

    Visual Basic-Quellcode

    1. Option Explicit
    2. dim ws, objExplorer, WSHShell, fSO, objFile, Arg, Pfad, Dateiname, Abbruch, Ordner()
    3. Const ForReading = 1, ForWriting = 2, ForAppending = 8
    4. const Sortieren=0
    5. Abbruch=0
    6. if WScript.Arguments.Count > 0 then
    7. dim result, l
    8. redim Ordner(0)
    9. Set fSO = CreateObject("Scripting.FileSystemObject")
    10. Dateiname=Pfadname(Wscript.Arguments(0)) & "Ordnerliste.csv"
    11. on error resume next
    12. if fSO.FileExists(Dateiname) = true then
    13. fSO.DeleteFile Dateiname
    14. end if
    15. if err.number=0 then
    16. on error goto 0
    17. For Each Arg in Wscript.Arguments
    18. if isDrive(Arg) then
    19. if msgbox("Achtung, Wurzelverzeichnis eines Laufwerks ausgewählt." & vblf & "Soll wirklich eine Ordnerliste erstellt werden?",vbcritical+vbyesno,Pfadname(Arg))=vbno then
    20. Abbruch=1
    21. exit for
    22. end if
    23. end if
    24. if fSO.FolderExists(Arg) then
    25. Ordnerlesen Arg
    26. elseif fSO.FileExists(Arg) then
    27. Ordnerlesen Pfadname(Arg)
    28. end if
    29. next
    30. if Abbruch=0 then
    31. if ubound(Ordner)>1 and Sortieren =1 then
    32. QuickSort Ordner, 1, ubound(Ordner)
    33. end if
    34. Set objFile = fSO.CreateTextFile(Dateiname, True)
    35. for l = 1 to ubound(Ordner)
    36. objFile.WriteLine Ordner(l)
    37. objFile.WriteLine
    38. objFile.WriteLine
    39. next
    40. objFile.close
    41. Set objFile = Nothing
    42. msgbox "Fertig" , vbinformation+vbokonly,"Ordnerkontrolle"
    43. end if
    44. else
    45. msgbox "Konnte 'Ordnerliste.csv' nicht löschen" , vbcritical+vbokonly,"Abbruch - Ordnerkontrolle"
    46. err.clear
    47. end if
    48. Set fSO = Nothing
    49. end if
    50. private function isDrive(byval S)
    51. dim ff
    52. isDrive=False
    53. if fSO.FileExists(S) then
    54. set ff=fSO.GetFile(S)
    55. S=ff.parentfolder
    56. end if
    57. if len(S)<4 then
    58. isDrive=True
    59. end if
    60. end function
    61. private function Pfadname(byval S)
    62. dim ff
    63. if fSO.FileExists(S) then
    64. set ff=fSO.GetFile(S)
    65. Pfadname=ff.parentfolder
    66. else
    67. if right(S,1)<>"\" then
    68. S=S & "\"
    69. end if
    70. if fSO.FolderExists(S) then
    71. if fSO.DriveExists(S) then
    72. Pfadname=S
    73. else
    74. set ff=fSO.GetFolder(S)
    75. Pfadname=ff.parentfolder
    76. end if
    77. else
    78. Pfadname=S
    79. end if
    80. end if
    81. Pfadname=trim(Pfadname)
    82. if right(Pfadname,1)<>"\" then
    83. Pfadname=Pfadname & "\"
    84. end if
    85. set ff=nothing
    86. end function
    87. private function Ordnername(byval S)
    88. dim ff
    89. if fSO.FileExists(S) then
    90. set ff=fSO.GetFile(S)
    91. Ordnername = ff.parentfolder
    92. else
    93. if right(S,1)<>"\" then
    94. S=S & "\"
    95. end if
    96. if fSO.FolderExists(S) then
    97. set ff=fSO.GetFolder(S)
    98. Ordnername = ff.name
    99. else
    100. Ordnername = S
    101. end if
    102. end if
    103. set ff=nothing
    104. end function
    105. Private Sub QuickSort(ByRef ArrayToSort, ByVal Low, ByVal High)
    106. Dim vPartition, vTemp
    107. Dim i, j
    108. If Low > High Then Exit Sub
    109. vPartition = ArrayToSort((Low + High) \ 2)
    110. i = Low: j = High
    111. Do
    112. Do While ArrayToSort(i) < vPartition
    113. i = i + 1
    114. Loop
    115. Do While ArrayToSort(j) > vPartition
    116. j = j - 1
    117. Loop
    118. If i <= j Then
    119. vTemp = ArrayToSort(j)
    120. ArrayToSort(j) = ArrayToSort(i)
    121. ArrayToSort(i) = vTemp
    122. i = i + 1
    123. j = j - 1
    124. End If
    125. Loop Until i > j
    126. If (j - Low) < (High - i) Then
    127. QuickSort ArrayToSort, Low, j
    128. QuickSort ArrayToSort, i, High
    129. Else
    130. QuickSort ArrayToSort, i, High
    131. QuickSort ArrayToSort, Low, j
    132. End If
    133. End Sub
    134. Private Sub Ordnerlesen(ByVal sPfad)
    135. Dim fld, f
    136. Set fld = fSO.GetFolder(sPfad)
    137. err.clear
    138. on error resume next
    139. For Each f In fld.SubFolders
    140. if err.number=0 then
    141. redim preserve Ordner(ubound(Ordner)+1)
    142. Ordner(ubound(Ordner))=f.name
    143. else
    144. err.clear
    145. end if
    146. Next
    147. For Each f In fld.SubFolders
    148. if err.number=0 then
    149. Ordnerlesen (f.Path)
    150. else
    151. err.clear
    152. end if
    153. Next
    154. End Sub

    Gruß
    Peterfido

    Keine Unterstützung per PN!

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