m0nstar
Goto Top

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

Content-Key: 120796

Url: https://administrator.de/contentid/120796

Ausgedruckt am: 28.03.2024 um 09:03 Uhr

Mitglied: bastla
bastla 19.07.2009 um 21:55:14 Uhr
Goto Top
Hallo m0nstar!
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
Wenn Du das Script von der Kommandozeile durch die Eingabe von
cscript //nologo "Scriptname.vbs"
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 FormatNumber()-Funktion wird auch der Wert 0 ausgegeben [/Edit]
Mitglied: m0nstar
m0nstar 20.07.2009 um 08:33:08 Uhr
Goto Top
dankeschön für deine schnelle Antwort, ich schau mir das heute nochmal an thx...vllt krieg ich es ja jetzt hin. face-smile
Mitglied: m0nstar
m0nstar 20.07.2009 um 09:38:38 Uhr
Goto Top
Option Explicit

Dim Folder, fso

Folder = CreateObject("WScript.Shell").SpecialFolders("J:\") '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

MsgBox SubFolder.DateLastModified, SizeFormatted, SubFolder.Name

Kannste mir nochmal helfen?? Kriegs net ganz hin... kommt der Fehler, reihe 8: unerwarteter prozedur aufruf
Mitglied: bastla
bastla 20.07.2009 um 09:49:56 Uhr
Goto Top
Hallo m0nstar!

Wenn Du den Pfad mit "J:\" vorgeben willst, dann einfach:
Folder = "J:\"
Die Verwendung von 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 .
Mitglied: m0nstar
m0nstar 20.07.2009 um 10:48:09 Uhr
Goto Top
hey danke dir es klappt nun...aber hätteste noch eine idee wie ich die alle aufeinmal liste??? das ich nicht für jeden ordner eine msgbox bekomme sondern eine für alle?

Option Explicit

Dim Folder, fso, SubFolder, SizeFormatted

Folder= "J:\" '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
Mitglied: bastla
bastla 20.07.2009 um 10:52:55 Uhr
Goto Top
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:
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
Grüße
bastla
Mitglied: m0nstar
m0nstar 20.07.2009 um 10:57:50 Uhr
Goto Top
perfekt danke face-smile genauso habe ich mir das vorgestellt. face-smile so reicht mir das schon.

Vielen lieben Dank.

Gruß,

m0nstar
Mitglied: m0nstar
m0nstar 21.07.2009 um 14:53:02 Uhr
Goto Top
habe noch eine frage hier zu:

Wie bekomme ich es hin, 1. das es in MB angezeigt wird die Größe und 2. das die überschriften nur einmal ganz oben sind. Versuch auch die ganze zeit die Reihenfolge zuändern (Ordnername, Größe, Anderungsdatum)

thx schonma
Mitglied: bastla
bastla 21.07.2009 um 21:35:01 Uhr
Goto Top
Hallo m0nstar!

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 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
Mitglied: m0nstar
m0nstar 22.07.2009 um 08:37:11 Uhr
Goto Top
hmmm danke erstmal im endeffekt ist das so wie ich das wollte, nur wie bekomme ich da bissel ordnung rein, das ist ziemlich durcheinander...geht glaub ich mit nem pad oder so aber wie ich das hier anwende, kannste mir nochmal helfen??? Und wie kann ich oben den Titel des Fensters ändern??

Screenshot: http://s1.picsafe.de/files/b843f8e9/Snap1.jpg

Gruß,
m0nstar
Mitglied: bastla
bastla 22.07.2009 um 08:51:14 Uhr
Goto Top
Hallo m0nstar!
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"
Grüße
bastla
Mitglied: m0nstar
m0nstar 22.07.2009 um 09:15:06 Uhr
Goto Top
Hallo bastla,

vielen dank dir....kannst das echt gut muss man dir lassen face-smile

Das mit der Ordnung habe ich jetzt nach deiner alten Reihenfolge wieder umgestellt und reicht mir erstmal, vllt bau ich mir das noch so wie du schon sagtest, dass es mir in Excel auch nochmal reingespeichert wird. Das denke ich kriege ich aber hin.

Und das mit dem Titel hat sich dank deines Tips auch nun geklärt, also bleibt mir nur noch zusagen: VIELEN DANK, du hast mir sehr weitergeholfen!

Gruß,
m0nstar
Mitglied: m0nstar
m0nstar 23.07.2009 um 10:48:00 Uhr
Goto Top
Eine kleine Frage hierzu noch, kann man auch nach der Größe sortieren? Also von Groß (oben) nach klein (unten)

Gruß,
m0nstar
Mitglied: bastla
bastla 24.07.2009 um 21:54:47 Uhr
Goto Top
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:
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
Grüße
bastla
Mitglied: m0nstar
m0nstar 27.07.2009 um 08:18:14 Uhr
Goto Top
Hallo bastla,

erstmal dickes dankeschön, im großen und ganzen genauso wie ich das wollte. Frage ist nur, ist das eine ziemlich Ressourcen fressende Variante? Wie gesagt keine Frage, das läuft wie es soll face-smile

Gruß,
m0nstar
Mitglied: bastla
bastla 27.07.2009 um 10:03:19 Uhr
Goto Top
Hallo m0nstar!
ist das eine ziemlich Ressourcen fressende Variante?
Wie viele Tausend Unterordner (die dann alle in einer MsgBox angezeigt werden face-wink) hast Du denn?

Grüße
bastla
Mitglied: m0nstar
m0nstar 27.07.2009 um 10:46:30 Uhr
Goto Top
Hallo bastla,

ich habe da so 15-20 Ordner face-smile bedeutet schon bei mir das er so 20-30 sekunden brauch, ich habe da einfach jetzt ne Message vor gemacht die sich automatisch nach 15 sekunden schließt, damit der Anwender weiß, damit das Programm noch läuft.

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?

Gruß,
m0nstar
Mitglied: bastla
bastla 27.07.2009, aktualisiert am 18.10.2012 um 18:38:53 Uhr
Goto Top
Hallo m0nstar!
ich habe da so 15-20 Ordner face-smile 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
Mitglied: m0nstar
m0nstar 27.07.2009 um 11:09:35 Uhr
Goto Top
Hallo bastla,

"Warum dann nicht gleich direkt in Excel erledigen - wie zB hier in ähnlicher Form ..."

Meinte eigentlich das beides gemacht wird, also das es ausgegeben wird so wie es jetzt ist nach deinem Code, es aber nebenbei noch eine Excel Tabelle erstellt wird, die sobalt das Programm beendet wird geleert wird.

Gruß,
m0nstar
Mitglied: bastla
bastla 27.07.2009 um 11:13:23 Uhr
Goto Top
Hallo m0nstar!

Dann schreib einfach die Infos in eine .csv-Datei (auf dem Desktop), und wer sie tatsächlich in Excel benötigt, ist so nur einen Doppelklick davon entfernt ...

Grüße
bastla
Mitglied: m0nstar
m0nstar 27.07.2009 um 11:18:21 Uhr
Goto Top
Hallo bastla,

danke für die idee. Das ist keine schlechte Idee face-smile werds mal probieren, thx!

Gruß,
m0nstar
Mitglied: m0nstar
m0nstar 29.07.2009 um 08:40:45 Uhr
Goto Top
Hallo,

eine Frage noch, wenn ich noch einen 2. und 3. Ordner auslesen will aber alles in einer Box ausgeben lassen will was muss ich da ändern?

Folder= "J:\"  

So und nun sollen noch zwei SpezialFolder ausgelesen werden, einmal soll die größe des Ordners Desktop angezeigt werden und einmal vom temp Ordner, hier aber nicht mehr die Unterordner sondern nur die Ordner selber.

Gruß,
m0nstar
Mitglied: bastla
bastla 29.07.2009 um 11:17:35 Uhr
Goto Top
Hallo m0nstar!

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
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):
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
Grüße
bastla
Mitglied: m0nstar
m0nstar 29.07.2009 um 11:41:19 Uhr
Goto Top
Hallo bastla,

danke erstmal aber bei deinem 2. Skript kommt ein Fehler: http://s1.picsafe.de/files/7b6fab90/Snap7.jpg

Gruß,
m0nstar
Mitglied: bastla
bastla 29.07.2009 um 11:50:50 Uhr
Goto Top
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:
If Not DataList.EOF Then DataList.MoveFirst

Grüße
bastla
Mitglied: m0nstar
m0nstar 29.07.2009 um 11:59:14 Uhr
Goto Top
Hallo bastla,

in der Zeile steht das "DataList.MoveFirst"

Gruß,
m0nstar
Mitglied: bastla
bastla 29.07.2009 um 12:08:10 Uhr
Goto Top
Hallo m0nstar!

Hatte zwischenzeitlich doch etwas getestet und schon oben ergänzt ...

Grüße
bastla
Mitglied: m0nstar
m0nstar 29.07.2009 um 12:17:31 Uhr
Goto Top
Hallo bastla,

soweit klappt das jetzt nur irgendwie noch net ganz richtig.

Der obere Teil ist komplett richtig, den ließt er richtig aus, danach will ich aber nur noch wissen wie groß der Ordner Desktop und Temp ist, nicht welche Ordner noch dadrin sind.

Siehe: http://s1.picsafe.de/files/5c62bcf9/Snap9.jpg

Gruß,
m0nstar
Mitglied: bastla
bastla 29.07.2009 um 12:32:38 Uhr
Goto Top
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:
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
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 "Fld.Name" in den Zeilen 9 und 13 entfernt [/Edit]
Mitglied: m0nstar
m0nstar 29.07.2009 um 13:13:11 Uhr
Goto Top
Hallo bastla,

Zitat von @bastla:
Es genügt in diesem Fall ja das ursprüngliche Script

Welches Script meinst du jetzt?

Meinst du dieses:

	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

	ueberschrift1="Letzte Änderung:     "  
	ueberschrift2="Größe in KByte:   "  
	ueberschrift3="Ordner:   "  
	Result = ueberschrift1 & vbTab & ueberschrift2 & vbTab & ueberschrift3 & 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(15) & FormatNumber(DataList.Fields.Item("Siz") / 1000, 0, True, False, True), 15)  
	    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  
	MsgBox Result

Also irgendwie stell ich mich grad blöd an... face-sad vllt zuviel auf einmal um das zu lernen...oder ich bin grad durcheinander gekommen face-sad

Gruß,
m0nstar
Mitglied: bastla
bastla 29.07.2009 um 16:37:33 Uhr
Goto Top
Hallo m0nstar!

Ja, dieses Script war gemeint - jetzt musst Du eigentlich nur noch zwischen Zeile 52 und 53 die 13 zusätzlichen Zeilen einfügen (und zur Sicherheit noch die Zeile 38 auf
If Not DataList.EOF Then DataList.MoveFirst
anpassen ...

Grüße
bastla
Mitglied: m0nstar
m0nstar 30.07.2009 um 09:10:18 Uhr
Goto Top
Hallo bastla,

genauso wie du das geschrieben hast, habe ich es gestern getestet, es kommt immer nur Anwendungsende erwartet.

	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

	ueberschrift1="Letzte Änderung:     "  
	ueberschrift2="Größe in KByte:   "  
	ueberschrift3="Ordner:   "  
	Result = ueberschrift1 & vbTab & ueberschrift2 & vbTab & ueberschrift3 & vbCrLF

	'Datenbank passend sortieren ...  
	DataList.Sort = "Siz DESC"  

	'... und beim ersten Satz beginnend ...  
	If Not DataList.EOF Then DataList.MoveFirst

	'... bis zum Ende durchackern  
	Do Until DataList.EOF

	    'Daten auslesen und formatiert in Ausgabezeile packen  
	    SizeFormatted = Right(Space(15) & FormatNumber(DataList.Fields.Item("Siz") / 1000, 0, True, False, True), 15)  
	    Result = Result & FormatDateTime(DataList.Fields.Item("Dat")) & vbTab & SizeFormatted & vbTab & DataList.Fields.Item("Fld") & vbCrLF  

	    'weiter zum nächsten Datensatz  
	    DataList.MoveNext

	Loop

	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(15) & FormatNumber(Fld.Size / 1000, 0, True, False, True), 15)
	Result = Result & FormatDateTime(Fld.DateLastModified) & vbTab & SizeFormatted & vbTab & Fld.Name) & vbCrLF

	Set Fld = fso.GetFolder(strTemp)
	SizeFormatted = Right(Space(15) & FormatNumber(Fld.Size / 1000, 0, True, False, True), 15)
	Result = Result & FormatDateTime(Fld.DateLastModified) & vbTab & SizeFormatted & vbTab & Fld.Name) & vbCrLF

		'alle Datensätze erledigt - Ergebnis anzeigen  
		MsgBox Result

Gruß,
m0nstar
Mitglied: bastla
bastla 30.07.2009 um 10:19:56 Uhr
Goto Top
Hallo m0nstar!

Mein Fehler - liegt an der überzähligen schließenden Klammer nach "Fld.Name" in Zeile 60 bzw 64 ...

BTW: Wenn Du Fehlermeldungen postest, bitte auch jeweils mit Angabe der Zeile / Position!

Grüße
bastla
Mitglied: m0nstar
m0nstar 30.07.2009 um 10:27:12 Uhr
Goto Top
Hallo bastla,

wegen der Fehlermeldung, ich habe ja nen kleines Programm gemacht da wäre das Zeile 232 oder so davon hätteste wahrscheinlich net viel, aber danke es klappt nun.

Wenn ich das Desktop und Temp Verzeichnis auf einer anderen HDD nehmen will weil ich zum Beispiel auf meiner 2. HDD auch nen anderes Win installed habe, kann ich da einfach nen Pfad reinmachen anstatt dem Desktop und dem %temp%

Danach lass ich dich in ruhe und nerv dich nimmer face-big-smile

Danke dir für die große Hilfe

Gruß,
m0nstar
Mitglied: m0nstar
m0nstar 30.07.2009 um 11:00:46 Uhr
Goto Top
Hallo bastla,

ich habe es hinbekommen, DANKE DIR!!!

Gruß,
m0nstar
Mitglied: bastla
bastla 30.07.2009 um 11:04:50 Uhr
Goto Top
Hallo m0nstar!

Wenn Du den exakten Pfad kennst, kannst Du diesen natürlich direkt angeben, also etwa:
Set Fld = fso.GetFolder("K:\Test")
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:
Set WshShell = WScript.CreateObject("WScript.Shell")  
strDesktop = WshShell.SpecialFolders("Desktop")  
strTemp = WshShell.ExpandEnvironmentStrings("%temp%")  

SingleFolders = Array(strDesktop, strTemp, "K:\Test")  
am Anfang des Codes festlegen und später dann:
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
Grüße
bastla

P.S.: Ich lass mich ohnehin nicht nerven ... face-wink