Dir Size auslesen und in Datei Speichern

  • VBScript

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von petaod.

    Dir Size auslesen und in Datei Speichern

    Hallo @ alle,

    Ich habe hier ein kleines Problem.

    Wir sollen für unser Backup die Ordnergrössen (Wachstum) aufzeichnen und Speichern um einen Speicherplatz Forcast ertellen zu können.

    Am Anfang hatte es sich nur um einen Ordner mit Unterordner gehandelt, das war kein Problem wenn auch ( Asche über mein Haupt ) dies ziemlich dirty gelöst habe.

    CODE HIER

    Visual Basic-Quellcode

    1. ' Declaration parts here
    2. Set MyFiles = CreateObject("Scripting.FileSystemObject")
    3. Set wshnet = CreateObject("WScript.Network")
    4. Set wshshell = CreateObject("WScript.Shell")
    5. Dim strComputer
    6. strComputer = wshnet.Computername
    7. Dim ausgabe
    8. Dim datum
    9. Dim zeit
    10. set ausgabe = WScript.CreateObject("WScript.Shell")
    11. datum = Date
    12. zeit = Time
    13. timestamp = datum & " " & zeit
    14. '=============================================================================================================================================================================================
    15. ' Include the Folders
    16. '*****************************************************************************************
    17. ''Folder 1
    18. strPfad1 = "S:\Backup\Linux_Full"
    19. Set objFSO = CreateObject("Scripting.FileSystemObject")
    20. Set objFolder = objFSO.GetFolder(strPfad1)
    21. varSize = objFolder.Size
    22. GBsize1 = round(varsize / 1024 /1024 /1024,2)
    23. MsgBox "Size: " & GBSize1 & " GB"
    24. '*****************************************************************************************
    25. 'Folder 2
    26. strPfad2 = "S:\Backup\SAP_Full"
    27. Set objFSO = CreateObject("Scripting.FileSystemObject")
    28. Set objFolder = objFSO.GetFolder(strPfad2)
    29. varSize = objFolder.Size
    30. GBsize2 = round(varsize / 1024 /1024 /1024,2)
    31. MsgBox "Size: " & GBSize2 & " GB"
    32. '*****************************************************************************************
    33. 'Folder 3
    34. strPfad3 = "S:\Backup\SQL_Full"
    35. Set objFSO = CreateObject("Scripting.FileSystemObject")
    36. Set objFolder = objFSO.GetFolder(strPfad3)
    37. varSize = objFolder.Size
    38. GBsize3 = round(varsize / 1024 /1024 /1024,2)
    39. MsgBox "Size: " & GBSize3 & " GB"
    40. '*****************************************************************************************
    41. 'Folder 4
    42. strPfad4 = "S:\Backup\VeeamConfigBackup"
    43. Set objFSO = CreateObject("Scripting.FileSystemObject")
    44. Set objFolder = objFSO.GetFolder(strPfad4)
    45. varSize = objFolder.Size
    46. GBsize4 = round(varsize / 1024 /1024 /1024,2)
    47. MsgBox "Size: " & GBSize4 & " GB"
    48. '*****************************************************************************************
    49. 'Folder 5
    50. strPfad5 = "S:\Backup\Win2003_Full"
    51. Set objFSO = CreateObject("Scripting.FileSystemObject")
    52. Set objFolder = objFSO.GetFolder(strPfad5)
    53. varSize = objFolder.Size
    54. GBsize5 = round(varsize / 1024 /1024 /1024,2)
    55. MsgBox "Size: " & GBSize5 & " GB"
    56. '*****************************************************************************************
    57. 'Folder 6
    58. strPfad6 = "S:\Backup\Win2012R2_Full"
    59. Set objFSO = CreateObject("Scripting.FileSystemObject")
    60. Set objFolder = objFSO.GetFolder(strPfad6)
    61. varSize = objFolder.Size
    62. GBsize6 = round(varsize / 1024 /1024 /1024,2)
    63. MsgBox "Size: " & GBSize6 & " GB"
    64. '=============================================================================================================================================================================================
    65. ' create the loging Data output
    66. Logeintrag1 = timestamp & ";" & strComputer & ";" & strPfad1 & ";" & GBsize1
    67. Logeintrag2 = timestamp & ";" & strComputer & ";" & strPfad2 & ";" & GBsize2
    68. Logeintrag3 = timestamp & ";" & strComputer & ";" & strPfad3 & ";" & GBsize3
    69. Logeintrag4 = timestamp & ";" & strComputer & ";" & strPfad4 & ";" & GBsize4
    70. Logeintrag5 = timestamp & ";" & strComputer & ";" & strPfad5 & ";" & GBsize5
    71. Logeintrag6 = timestamp & ";" & strComputer & ";" & strPfad6 & ";" & GBsize6
    72. '=============================================================================================================================================================================================
    73. 'Deklaration der Variablen für das Logfile
    74. filename = "C:\TEMP\test.logdat" ' <---- Hier den Pfad und den Dateinamen des zu schreibenden Logfiles eintragen
    75. '=============================================================================================================================================================================================
    76. ' create the filesystem Object
    77. Const ForAppending = 8
    78. Set fs = CreateObject("Scripting.FileSystemObject")
    79. ' Logdatei zum Anhängen der Eintrage laden
    80. Set textstream = fs.OpenTextFile(filename, ForAppending, True)
    81. ok = (Err.number = 0)
    82. If ok Then
    83. On Error Goto 0
    84. textstream.WriteLine Logeintrag1
    85. textstream.WriteLine Logeintrag2
    86. textstream.WriteLine Logeintrag3
    87. textstream.WriteLine Logeintrag4
    88. textstream.WriteLine Logeintrag5
    89. textstream.WriteLine Logeintrag6
    90. textstream.Close'
    91. Logeintrag_OK = "Folgender Logeintrag wurde erzeugt:" & vbcr & vbcr & Logeintrag
    92. ' MsgBox Logeintrag_OK,,"Logeintragung erfolgreich:"
    93. Else
    94. MsgBox "Fehler: " & Err.Description
    95. End If


    Nun Haben Sich aber die Bedingungen geändert und es sind wesentlich mehr Ordner inklusive Unterordner dazu gekommen.

    Hier meine frage an euch fällt euch eine Möglichkeit ein das ganze Rekrusiv zu machen ?





    Danke für eure Hilfe im Voraus

    Gruss

    Ref

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Refnex“ () aus folgendem Grund: Servernamen entfernt

    Hallo,

    als allererstes würde ich mir mal alle TopDirectory's in eine Liste packen ;) Denn zeig mir deinen Code wenn du 100 Ordner durchsuchst :D
    Das müsste schonmal ein guter ansatz sein --> [VB.NET] Rekursiv alle Dateien eines Ordners inkl. Unterordner erfassen
    --> [VB 2010] Rekursive Dateisuche mit anonymer Methode
    Wer fragt, ist ein Narr für eine Minute. Wer nicht fragt, ist ein Narr sein Leben lang.
    :rolleyes: Hi Hi

    Das das kein guter Ansatz ist war mir klar deswegen frag ich hier wies besser gehen könnte, am anfang mir den Paar ordner hatt es auch so gereicht. :whistling:

    Nur als kleine Frage habe noch nie VB Programmiert, oder ist der Syntax in vbs der gleiche ? ich denke nicht oder ?

    PS: bin keine 100%tige leuchte in vbs
    fällt euch eine Möglichkeit ein das ganze Rekrusiv zu machen

    Visual Basic-Quellcode

    1. Set FSO=CreateObject("Scripting.FileSystemObject")
    2. ExecuteFolder "c:"
    3. Sub ExecuteFolder (Foldername)
    4. Set Folder=FSO.GetFolder(Foldername)
    5. textstream.WriteLine Foldername & " " & Folder.Size
    6. For Each SubFolder in Folder.Folders
    7. ExecuteFolder SubFolder.Path
    8. Next
    9. End Sub
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Moin zusammen ,

    Cool danke für die Hilfe, jedoch Bricht mir die for each schleife immer nach der ersten runde ab

    " Das Objekt unterstützt diese Eigenschaft oder Methode nicht 'Folder.Folders' "

    Oder bin ich nur zur Implementierung zu blöde ?( 8|

    Bitte nicht verzweifeln an mir das tu ich schon selbst ;( :D
    grrrrrrrr. ok denke ich habe das Problem finden können jedoch noch keine Möglichkeit wie ich das ändern kann.

    Denke es liegt an dem System Volume Information der immer nen Erlaubnis verweigert :cursing:

    Visual Basic-Quellcode

    1. dim liste
    2. set fs = createobject("Scripting.FileSystemObject")
    3. sub Listordner(ordner)
    4. set ordner = fs.getfolder(ordner)
    5. for each unterordner in ordner.subfolders
    6. liste = liste & unterordner.path & " ;" & unterordner.DateCreated & "; " & unterordner.Size & vbcr
    7. Listordner unterordner
    8. next
    9. end sub
    10. ordner ="s:"
    11. Listordner ordner
    12. msgbox liste

    Refnex schrieb:

    Das Objekt unterstützt diese Eigenschaft oder Methode nicht 'Folder.Folders
    Die Property heisst Folder.SubFolders. Sorry. Aber hast ja inzwischen selbst gemerkt.

    Denke es liegt an dem System Volume Information der immer nen Erlaubnis verweigert
    Wenn du nicht für jeden Ordner die Berechtigung prüfen willst, kannst du die Abfragen auch in eine Sub mit Fehlerbehandlung auslagern.

    Visual Basic-Quellcode

    1. dim liste
    2. set fs = createobject("Scripting.FileSystemObject")
    3. sub Listordner(ByVal ordner)
    4. set ordner = fs.getfolder(ordner)
    5. liste = liste & FolderProperties(ordner)
    6. for each unterordner in ordner.subfolders
    7. Listordner unterordner
    8. next
    9. end sub
    10. Function FolderProperties (ByVal FolderObject)
    11. On Error Resume Next
    12. FolderProperties = FolderObject.Path & ";" &FolderObject.DateCreated & ";" & FolderObject.Size & vbCr
    13. End Function
    14. ordner ="s:"
    15. Listordner ordner
    16. msgbox liste
    Ich verstehe zwar nicht, weshalb du deinen Code unbedingt eingedeutscht und in Kleinbuchstaben schreiben willst, aber das ist deine Entscheidung.
    Du kriegst mich allerdings nicht dazu, meine Parts im selben Format zu schreiben.
    Musst du sie halt selber übersetzen.

    Edit:
    Die Erzeugung des Listentexts gehört natürlich nicht zur Rekursion der Unterordner sondern pro Ordner nur einmal!
    Ganz schlecht abgeschrieben!
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „petaod“ ()

    Ich hab's nebenbei mal noch komplett wasserdicht gemacht, da es wohl einige Systemordner gibt, bei denen der Zugriff auf manche Properties Fehler erzeugen.

    Visual Basic-Quellcode

    1. Dim List
    2. Dim FS
    3. Sub ExecuteFolder(ByVal FolderName)
    4. Set Folder = FS.GetFolder(FolderName)
    5. On Error Resume Next
    6. Props = FolderProperties(Folder)
    7. If Not IsEmpty(Props) Then List = List & Props & vbCr
    8. For Each SubFolder In Folder.SubFolders
    9. ExecuteFolder SubFolder.Path
    10. Next
    11. End Sub
    12. Function FolderProperties(ByVal FolderObject)
    13. On Error Resume Next
    14. FolderProperties = FolderObject.Path & ";" & FolderObject.DateCreated & ";" & FolderObject.Size
    15. End Function
    16. Set FS = CreateObject("Scripting.FileSystemObject")
    17. ExecuteFolder "C:"
    18. MsgBox List

    Kannst ja für deinen Chef nochmals übersetzen ;)
    Frag ihn dann mal gleich, was leichter zu lesen ist
    For Each SubFolder In Folder.SubFolders
    oder
    For Each unterordner In ordner.SubFolders
    Ohne Englisch zu verstehen, kannst du einem in VBS geschriebenen Script eh nicht folgen, da die syntaktischen Grundelemente der Sprache sowie alle Objektnamen in Englisch angelegt sind.

    Ich bin heute in der komfortablen Lage, dass ich mir eine Denglische Namenskonvention nicht befehlen lassen würde.
    Oder gegen ordentliches Schmerzensgeld könnte man ja darauf eingehen. ;)

    [OffTopic]
    An alle da draußen, die den Groschen haben noch nicht fallen hören:
    Die Welt ist globaler geworden.
    Die Syntax und Namensgebung in allen Programmiersprachen, Frameworks und Betriebssystemobjekten ist der englischen Sprache angelehnt.
    Zweisprachigkeit in Programmen verwirrt mehr als sie zur Verständlichkeit beiträgt.
    Offizielle "Amtssprache" für alle Programmierer weltweit ist Englisch.

    Falls ihr durch regionalisierte Programmierung eine drohende Übernahme eures Ladens durch Amis, Franzosen, Japaner oder Chinesen erschweren wollt:
    Verhindern könnt ihr es damit eh nicht, es drückt höchstens den Übernahmepreis. :D
    [/OffTopic]
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --