Ordnergröße und Änderungsdatum auslesen mit WSH
Hallo,
nachdem ich jetzt Blut geleckt habe an WSH, würde ich mir gerne ein kleines .vbs Programm coden was mir es ermöglicht, die Subfolders in einem bestimmten Ordner auszugeben und die dazugehörige Ordernergröße und das letzte Änderungsdatum. Würde gerne damit meine Eigenen Dateien auslesen, es sollen keine Dateien angezeigt werden nur die Ordner.
Weiß aber leider nicht wie ich das grade umsetzten soll, vllt kann mir ja einer von euch einen Tip geben wie ich das machen könnte. Ich weiß auch nicht wie man es ausgeben könnte, ob per txt oder als eine msgbox.
Würde mich sehr über eine hilfe freuen, hab auch schon gegoogelt aber wirklich fündig wurde ich leider nicht.
Gruß,
m0nstar
nachdem ich jetzt Blut geleckt habe an WSH, würde ich mir gerne ein kleines .vbs Programm coden was mir es ermöglicht, die Subfolders in einem bestimmten Ordner auszugeben und die dazugehörige Ordernergröße und das letzte Änderungsdatum. Würde gerne damit meine Eigenen Dateien auslesen, es sollen keine Dateien angezeigt werden nur die Ordner.
Weiß aber leider nicht wie ich das grade umsetzten soll, vllt kann mir ja einer von euch einen Tip geben wie ich das machen könnte. Ich weiß auch nicht wie man es ausgeben könnte, ob per txt oder als eine msgbox.
Würde mich sehr über eine hilfe freuen, hab auch schon gegoogelt aber wirklich fündig wurde ich leider nicht.
Gruß,
m0nstar
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 120796
Url: https://administrator.de/forum/ordnergroesse-und-aenderungsdatum-auslesen-mit-wsh-120796.html
Ausgedruckt am: 23.12.2024 um 08:12 Uhr
36 Kommentare
Neuester Kommentar
Hallo m0nstar!
Das Auslesen und Ausgeben könnte etwa so aussehen:
Wenn Du das Script von der Kommandozeile durch die Eingabe von
startest, erfolgt die Ausgabe im CMD-Fenster; bei einem Start per Doppelklick wird für jeden Unterordner eine eigene MsgBox erzeugt (die Du jeweils wieder wegklicken musst - daher nicht empfehlenswert).
Grüße
bastla
[Edit] Mit "True" als 3. Parameter in der
Ich weiß auch nicht wie man es ausgeben könnte, ob per txt oder als eine msgbox.
Was Du mit den Daten anfangen willst, solltest Du schon selbst wissen - davon hängt dann auch die Form der Ausgabe ab ...Das Auslesen und Ausgeben könnte etwa so aussehen:
Folder = CreateObject("WScript.Shell").SpecialFolders("MyDocuments") 'Pfad für "Eigene Dateien"
Set fso = CreateObject("Scripting.FileSystemObject")
For Each SubFolder In fso.GetFolder(Folder).SubFolders
'Ordnergröße in Byte mit Tausendertrennzeichen schreiben und
' durch vorangestellte Leerzeichen auf eine Länge von 15 bringen ...
SizeFormatted = Right(Space(15) & FormatNumber(SubFolder.Size, 0, True, False, True), 15)
'... und zusammen mit Änderungsdatum und Ordnernamen ausgeben
WScript.Echo SubFolder.DateLastModified, SizeFormatted, SubFolder.Name
Next
cscript //nologo "Scriptname.vbs"
Grüße
bastla
[Edit] Mit "True" als 3. Parameter in der
FormatNumber()
-Funktion wird auch der Wert 0 ausgegeben [/Edit]
Hallo m0nstar!
Wenn Du den Pfad mit "J:\" vorgeben willst, dann einfach:
Die Verwendung von
Die "MsgBox"-Zeile ist übrigens an dieser Stelle (außerhalb der Schleife) sinnlos; ansonsten erzeugt das "WScript.Echo" (wenn das Script nicht über "cscript" gestartet wird) ohnehin MsgBox-Ausgaben.
Noch zum eigentlichen Fehler: Wenn Du "Option Explicit" verwendest, musst Du alle Variablen deklarieren, also auch "SubFolder" und "SizeFormatted".
Grüße
bastla
P.S.: Wenn Du Code postest, dann bitte mit entsprechender .
Wenn Du den Pfad mit "J:\" vorgeben willst, dann einfach:
Folder = "J:\"
SpecialFolders()
ist nur erforderlich, wenn Du bestimmte "spezielle" Ordner (neben den "Eigenen Dateien" etwa "Desktop", "Programme", "Startmenü" oder "Favoriten") verwenden willst ...Die "MsgBox"-Zeile ist übrigens an dieser Stelle (außerhalb der Schleife) sinnlos; ansonsten erzeugt das "WScript.Echo" (wenn das Script nicht über "cscript" gestartet wird) ohnehin MsgBox-Ausgaben.
Noch zum eigentlichen Fehler: Wenn Du "Option Explicit" verwendest, musst Du alle Variablen deklarieren, also auch "SubFolder" und "SizeFormatted".
Grüße
bastla
P.S.: Wenn Du Code postest, dann bitte mit entsprechender .
Hallo m0nstar!
Um alles in einer MsgBox auszugeben (so richtig schön sieht das aber auch mit der geänderten Reihenfolge der Ausgabefelder nicht aus) etwa so:
Grüße
bastla
Um alles in einer MsgBox auszugeben (so richtig schön sieht das aber auch mit der geänderten Reihenfolge der Ausgabefelder nicht aus) etwa so:
Option Explicit
Dim Folder, fso, SubFolder, SizeFormatted, Result
Folder= "J:\"
Set fso = CreateObject("Scripting.FileSystemObject")
For Each SubFolder In fso.GetFolder(Folder).SubFolders
'Ordnergröße in Byte mit Tausendertrennzeichen schreiben und
' durch vorangestellte Leerzeichen auf eine Länge von 15 bringen ...
SizeFormatted = Right(Space(15) & FormatNumber(SubFolder.Size, 0, True, False, True), 15)
'... und zusammen mit Änderungsdatum und Ordnernamen als neue Zeile in eine Variable schreiben
Result = Result & SubFolder.DateLastModified & vbTab & SizeFormatted & vbTab & SubFolder.Name & vbCrLF
Next
WScript.Echo Result
bastla
Hallo m0nstar!
Etwa so:
Die geänderte Reihenfolge findest Du in den auskommentierten Zeilen.
Die Größe wird übrigens (entsprechend der Angabe in der Überschrift) als "KByte" ermittelt (Faktor 1000) - falls Du KiB oder tatsächlich MB / MiB verwenden willst, den Wert entsprechend anpassen ...
Grüße
bastla
Etwa so:
Folder= "J:\"
h1="Letzte Änderung: "
h2="Größe in KByte: "
h3="Ordner: "
Result = h1 & vbTab & h2 & vTab & h3 & vbCrLF
'Result = h3 & vbTab & h2 & vTab & h1 & vbCrLF
Set fso = CreateObject("Scripting.FileSystemObject")
For Each SubFolder In fso.GetFolder(Folder).SubFolders
SizeFormatted = Right(Space(11) & FormatNumber(SubFolder.Size/1000, 0, True, False, True), 11)
Result = Result & SubFolder.DateLastModified & vbTab & SizeFormatted & vbTab & SubFolder.Name & vbCrLF
'Result = Result & SubFolder.Name & vbTab & SubFolder.DateLastModified & vbTab & SizeFormatted & vbCrLF
Next
WScript.Echo Result
Die Größe wird übrigens (entsprechend der Angabe in der Überschrift) als "KByte" ermittelt (Faktor 1000) - falls Du KiB oder tatsächlich MB / MiB verwenden willst, den Wert entsprechend anpassen ...
Grüße
bastla
Hallo m0nstar!
Da VBScript keine eigene Oberfläche zu bieten hat, könntest Du nur entweder Richtung "HTA" gehen oder das Ergebnis zwischenspeichern und dann in einem Editor (auch "notepad" sollte genügen) anzeigen lassen oder zB in Excel / Calc importieren.
Da Du offensichtlich eine MsgBox (und nicht eine Ausgabe in der Konsole) verwenden möchtest, tu dies einfach:
Grüße
bastla
wie bekomme ich da bissel ordnung rein, das ist ziemlich durcheinander...
Was meinst Du wohl, weswegen in meinem Vorschlag die Reihenfolge Datum - Größe - Name war ...Da VBScript keine eigene Oberfläche zu bieten hat, könntest Du nur entweder Richtung "HTA" gehen oder das Ergebnis zwischenspeichern und dann in einem Editor (auch "notepad" sollte genügen) anzeigen lassen oder zB in Excel / Calc importieren.
Und wie kann ich oben den Titel des Fensters ändern??
[OT] Auch mit einem Fragezeichen am Ende ist der Sinn dieses Satzes zu erkennen. [/OT]Da Du offensichtlich eine MsgBox (und nicht eine Ausgabe in der Konsole) verwenden möchtest, tu dies einfach:
MsgBox Result, vbOKOnly, "Dein Titel"
bastla
Hallo m0nstar!
Für die Sortierung gibt es mehrere Möglichkeiten (Algorithmen), die allerdings alle voraussetzen, dass Du zunächst alle Daten sammelst und in passender Form (Array oder als Text mit fester Breite jeder Spalte formatiert) zur Verfügung stellst.
Die Alternative, zu der ich in letzter Zeit gerne greife, ist das "Disconnected Recordset", eine Datenbank, die temporär (und nur im Speicher) erstellt wird - etwa so:
Grüße
bastla
Für die Sortierung gibt es mehrere Möglichkeiten (Algorithmen), die allerdings alle voraussetzen, dass Du zunächst alle Daten sammelst und in passender Form (Array oder als Text mit fester Breite jeder Spalte formatiert) zur Verfügung stellst.
Die Alternative, zu der ich in letzter Zeit gerne greife, ist das "Disconnected Recordset", eine Datenbank, die temporär (und nur im Speicher) erstellt wird - etwa so:
Folder= "J:\"
Const adVarChar = 200
Const adDBTimeStamp = 135
Const MaxCharacters = 255
Const adDouble = 5
'Datenbank erzeugen
Set DataList = CreateObject("ADOR.Recordset")
'Felder festlegen
DataList.Fields.Append "Dat", adDBTimeStamp
DataList.Fields.Append "Fld", adVarChar, MaxCharacters
DataList.Fields.Append "Siz", adDouble
DataList.Open
Set fso = CreateObject("Scripting.FileSystemObject")
For Each SubFolder In fso.GetFolder(Folder).SubFolders
'Datensatz erstellen, ...
DataList.AddNew
'... befüllen und ...
DataList("Dat") = SubFolder.DateLastModified
DataList("Fld") = SubFolder.Name
DataList("Siz") = SubFolder.Size
'... in die Datenbank übernehmen
DataList.Update
Next
h1="Letzte Änderung: "
h2="Größe in KByte: "
h3="Ordner: "
Result = h1 & vbTab & h2 & vTab & h3 & vbCrLF
'Datenbank passend sortieren ...
DataList.Sort = "Siz DESC"
'... und beim ersten Satz beginnend ...
DataList.MoveFirst
'... bis zum Ende durchackern
Do Until DataList.EOF
'Daten auslesen und formatiert in Ausgabezeile packen
SizeFormatted = Right(Space(11) & FormatNumber(DataList.Fields.Item("Siz") / 1000, 0, True, False, True), 11)
Result = Result & FormatDateTime(DataList.Fields.Item("Dat")) & vbTab & SizeFormatted & vbTab & DataList.Fields.Item("Fld") & vbCrLF
'weiter zum nächsten Datensatz
DataList.MoveNext
Loop
'alle Datensätze erledigt - Ergebnis anzeigen
WScript.Echo Result
bastla
Hallo m0nstar!
Alternativ dazu kannst Du ja das Ganze (wie oben schon erwähnt) einfach in eine Textdatei schreiben und dann standardmäßig mit dem Editor anzeigen lassen - ob die MsgBox weggeklickt oder das Editor-Fenster geschlossen werden muss, macht wohl nicht viel Unterschied ...
Grüße
bastla
ich habe da so 15-20 Ordner bedeutet schon bei mir das er so 20-30 sekunden brauch
... was aber nicht an der Sortierung liegen dürfte ...Frage wäre noch ob es schlau wäre, dazu noch eine Excel Tabelle anzulegen, damit der Anwender auch nachher nochmal gucken kann. Hätteste da auch ne Idee?
Warum dann nicht gleich direkt in Excel erledigen - wie zB hier in ähnlicher Form ...Alternativ dazu kannst Du ja das Ganze (wie oben schon erwähnt) einfach in eine Textdatei schreiben und dann standardmäßig mit dem Editor anzeigen lassen - ob die MsgBox weggeklickt oder das Editor-Fenster geschlossen werden muss, macht wohl nicht viel Unterschied ...
Grüße
bastla
Hallo m0nstar!
Wenn Du alles in einen Topf werfen wolltest, (ungetestet) etwa so:
Da Du das vermutlich nicht willst, mach aus dem ursprünglichen Script ein "Sub", rufe es jeweils mit Übergabe des zu bearbeitenden Ordners auf, und gib erst am Ende das Gesamtergebnis aus - zB (genauso ungetestet):
Grüße
bastla
Wenn Du alles in einen Topf werfen wolltest, (ungetestet) etwa so:
Set WshShell = WScript.CreateObject("WScript.Shell")
strDesktop = WshShell.SpecialFolders("Desktop")
strTemp = WshShell.ExpandEnvironmentStrings("%temp%")
Folders = Array("J:\", strDesktop, strTemp)
Const adVarChar = 200
Const adDBTimeStamp = 135
Const MaxCharacters = 255
Const adDouble = 5
'Datenbank erzeugen
Set DataList = CreateObject("ADOR.Recordset")
'Felder festlegen
DataList.Fields.Append "Dat", adDBTimeStamp
DataList.Fields.Append "Fld", adVarChar, MaxCharacters
DataList.Fields.Append "Siz", adDouble
DataList.Open
Set fso = CreateObject("Scripting.FileSystemObject")
'Alle vorgegebenen Ordner durchgehen
For Each Folder In Folders
For Each SubFolder In fso.GetFolder(Folder).SubFolders
'Datensatz erstellen, ...
DataList.AddNew
'... befüllen und ...
DataList("Dat") = SubFolder.DateLastModified
DataList("Fld") = SubFolder.Name 'oder, vermutlich besser: SubFolder.Path
DataList("Siz") = SubFolder.Size
'... in die Datenbank übernehmen
DataList.Update
Next
Next
h1="Letzte Änderung: "
h2="Größe in KByte: "
h3="Ordner: "
Result = h1 & vbTab & h2 & vTab & h3 & vbCrLF
'Datenbank passend sortieren ...
DataList.Sort = "Siz DESC"
'... und beim ersten Satz beginnend ...
DataList.MoveFirst
'... bis zum Ende durchackern
Do Until DataList.EOF
'Daten auslesen und formatiert in Ausgabezeile packen
SizeFormatted = Right(Space(11) & FormatNumber(DataList.Fields.Item("Siz") / 1000, 0, True, False, True), 11)
Result = Result & FormatDateTime(DataList.Fields.Item("Dat")) & vbTab & SizeFormatted & vbTab & DataList.Fields.Item("Fld") & vbCrLF
'weiter zum nächsten Datensatz
DataList.MoveNext
Loop
'alle Datensätze erledigt - Ergebnis anzeigen
WScript.Echo Result
Set WshShell = WScript.CreateObject("WScript.Shell")
strDesktop = WshShell.SpecialFolders("Desktop")
strTemp = WshShell.ExpandEnvironmentStrings("%temp%")
Folders = Array("J:\", strDesktop, strTemp)
Set fso = CreateObject("Scripting.FileSystemObject")
Const adVarChar = 200
Const adDBTimeStamp = 135
Const MaxCharacters = 255
Const adDouble = 5
'Kopfzeile erstellen
h1="Letzte Änderung: "
h2="Größe in KByte: "
h3="Ordner: "
Result = h1 & vbTab & h2 & vTab & h3 & vbCrLF
For Each F In Folders 'alle Ordner durchgehen
GetFolderInfo F
Result = Result & "===============" & vbCrLF & vbCrLF
Next
WScript.Echo Result
'Ende Hauptprogramm
Sub GetFolderInfo(Folder)
'Datenbank erzeugen
Set DataList = CreateObject("ADOR.Recordset")
'Felder festlegen
DataList.Fields.Append "Dat", adDBTimeStamp
DataList.Fields.Append "Fld", adVarChar, MaxCharacters
DataList.Fields.Append "Siz", adDouble
DataList.Open
For Each SubFolder In fso.GetFolder(Folder).SubFolders
'Datensatz erstellen, ...
DataList.AddNew
'... befüllen und ...
DataList("Dat") = SubFolder.DateLastModified
DataList("Fld") = SubFolder.Name
DataList("Siz") = SubFolder.Size
'... in die Datenbank übernehmen
DataList.Update
Next
'Datenbank passend sortieren ...
DataList.Sort = "Siz DESC"
'... und beim ersten Satz beginnend ...
DataList.MoveFirst
'... bis zum Ende durchackern
Do Until DataList.EOF
'Daten auslesen und formatiert in Ausgabezeile packen
SizeFormatted = Right(Space(11) & FormatNumber(DataList.Fields.Item("Siz") / 1000, 0, True, False, True), 11)
Result = Result & FormatDateTime(DataList.Fields.Item("Dat")) & vbTab & SizeFormatted & vbTab & DataList.Fields.Item("Fld") & vbCrLF
'weiter zum nächsten Datensatz
DataList.MoveNext
Loop
'Datenbank löschen
Set DataList = Nothing
End Sub
bastla
Hallo m0nstar!
Da es in meinem Script keine Zeile 218 gibt, solltest Du die betreffende Zeilennummer angeben ...
... dürfte aber Zeile 51 sein - wenn es keine Unterordner gibt, kann auch nicht der erste Datensatz aufgerufen werden, daher besser so:
Grüße
bastla
Da es in meinem Script keine Zeile 218 gibt, solltest Du die betreffende Zeilennummer angeben ...
... dürfte aber Zeile 51 sein - wenn es keine Unterordner gibt, kann auch nicht der erste Datensatz aufgerufen werden, daher besser so:
If Not DataList.EOF Then DataList.MoveFirst
Grüße
bastla
Hallo m0nstar!
Eigentlich solltest Du das schon selbst kombinieren können, aber gut ...
Es genügt in diesem Fall ja das ursprüngliche Script mit dem zusätzlichen Auslesen der beiden Ordnergrößen - Letzteres etwa so:
Schöner wäre es natürlich, das Auslesen in eine Function() auszulagern, aber funktionieren sollte es auch so ...
Grüße
bastla
[Edit] Überzählige schließende Klammer nach "
Eigentlich solltest Du das schon selbst kombinieren können, aber gut ...
Es genügt in diesem Fall ja das ursprüngliche Script mit dem zusätzlichen Auslesen der beiden Ordnergrößen - Letzteres etwa so:
Set WshShell = WScript.CreateObject("WScript.Shell")
strDesktop = WshShell.SpecialFolders("Desktop")
strTemp = WshShell.ExpandEnvironmentStrings("%temp%")
Result = Result & "==========" & vbCrLF
Set Fld = fso.GetFolder(strDesktop)
SizeFormatted = Right(Space(11) & FormatNumber(Fld.Size / 1000, 0, True, False, True), 11)
Result = Result & FormatDateTime(Fld.DateLastModified) & vbTab & SizeFormatted & vbTab & Fld.Name & vbCrLF
Set Fld = fso.GetFolder(strTemp)
SizeFormatted = Right(Space(11) & FormatNumber(Fld.Size / 1000, 0, True, False, True), 11)
Result = Result & FormatDateTime(Fld.DateLastModified) & vbTab & SizeFormatted & vbTab & Fld.Name & vbCrLF
Grüße
bastla
[Edit] Überzählige schließende Klammer nach "
Fld.Name
" in den Zeilen 9 und 13 entfernt [/Edit]
Hallo m0nstar!
Wenn Du den exakten Pfad kennst, kannst Du diesen natürlich direkt angeben, also etwa:
Allerdings würde ich zur Verwendung von Variablen bzw eines Arrays raten bzw die gewünschten Pfade sogar als ".ini"-Datei ablegen - jede dieser Alternativen ist leichter zu warten, als wenn irgendwo (zB in Zeile 228) ein Pfad angegeben ist.
Daher als Alternative zu meinem Vorschlag für die beiden zusätzlichen Ordner:
am Anfang des Codes festlegen und später dann:
Grüße
bastla
P.S.: Ich lass mich ohnehin nicht nerven ...
Wenn Du den exakten Pfad kennst, kannst Du diesen natürlich direkt angeben, also etwa:
Set Fld = fso.GetFolder("K:\Test")
Daher als Alternative zu meinem Vorschlag für die beiden zusätzlichen Ordner:
Set WshShell = WScript.CreateObject("WScript.Shell")
strDesktop = WshShell.SpecialFolders("Desktop")
strTemp = WshShell.ExpandEnvironmentStrings("%temp%")
SingleFolders = Array(strDesktop, strTemp, "K:\Test")
Result = Result & "==========" & vbCrLF
For Each F In SingleFolders
Set Fld = fso.GetFolder(F)
SizeFormatted = Right(Space(15) & FormatNumber(Fld.Size / 1000, 0, True, False, True), 15)
Result = Result & FormatDateTime(Fld.DateLastModified) & vbTab & SizeFormatted & vbTab & Fld.Name & vbCrLF
Next
bastla
P.S.: Ich lass mich ohnehin nicht nerven ...