
15858
08.11.2006, aktualisiert am 09.11.2006
VB Script - belegten Speicherplatz eines Ordners anzeigen
Hi,
ich möchte per VB Script oder in irgend einer anderen Scriptsprache mir den belegten Speicherplatz von einen Ordner anzeigen lassen. Das ganze soll in einer Schleife ablaufen, und die Variablen dafür (UNC-Pfade) soll er sich aus einer extra Text-Datei holen. Ist so etwas möglich? Ich suche jetzt schon den ganze Tag im Internet danach und werde einfach nicht fündig.
mfg 0per8or
ich möchte per VB Script oder in irgend einer anderen Scriptsprache mir den belegten Speicherplatz von einen Ordner anzeigen lassen. Das ganze soll in einer Schleife ablaufen, und die Variablen dafür (UNC-Pfade) soll er sich aus einer extra Text-Datei holen. Ist so etwas möglich? Ich suche jetzt schon den ganze Tag im Internet danach und werde einfach nicht fündig.
mfg 0per8or
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 43993
Url: https://administrator.de/forum/vb-script-belegten-speicherplatz-eines-ordners-anzeigen-43993.html
Ausgedruckt am: 01.05.2025 um 11:05 Uhr
22 Kommentare
Neuester Kommentar
Hallo Oper8or!
Hatte nur für folgendes Zeit:
Noch zu verbessern: Formatierung des Ergebnisses (derzeit Anzeige in Bytes), Übergabe von Listen- und Ergebnisdatei beim Batchaufruf
HTH
bastla
Hatte nur für folgendes Zeit:
@echo off & Setlocal
Set Erg="D:\Ergebnis.txt"
If Exist %Erg% del %Erg%
for /f %%f in (D:\liste.txt) do call :GetDirSize "%%f"
goto :eof
:GetDirSize
for /f "tokens=2,3*" %%i in ('dir %1 /a /s /-c ^| findstr "Datei(en)"') do set Size=%%j
echo %1; %Size% >> %Erg%
goto :eof
Noch zu verbessern: Formatierung des Ergebnisses (derzeit Anzeige in Bytes), Übergabe von Listen- und Ergebnisdatei beim Batchaufruf
HTH
bastla
...und eine Forumssuche nach "DirSize" liefert immerhin 8 Fundstellen für Batch/Skript-Lösungen.
Aber es müssten auch Ansätze mit VB-Skript (über das FileSystemObject) hier vorliegen.
Und der Vollständigkeit halber auch noch mal der Hinweis auf vorhandene DirUse/DiskUsage-Utilities sowohl von M$ wie auch von Könnern (Unix-du-Derivate).
Grüße
Biber
Aber es müssten auch Ansätze mit VB-Skript (über das FileSystemObject) hier vorliegen.
Und der Vollständigkeit halber auch noch mal der Hinweis auf vorhandene DirUse/DiskUsage-Utilities sowohl von M$ wie auch von Könnern (Unix-du-Derivate).
Grüße
Biber
@bastla
Ja, hast Recht... ist auch mein dritter gefühlter Montag in dieser Woche... *grrrmmmbl*
@15858
Sorry für den rüden Ton - Du konntest wirklich nichts dafür.
Grüße
Biber
Du bist aber streng heute ...
Ja, hast Recht... ist auch mein dritter gefühlter Montag in dieser Woche... *grrrmmmbl*
@15858
Sorry für den rüden Ton - Du konntest wirklich nichts dafür.
Grüße
Biber
Hallo Oper8or!
Als Entschädigung noch die VBS-Variante:
Hat leider derzeitkein eingeschränktes Errorhandling und bricht daher zB bei falschen Ordnernamen in der Liste ab - vielleicht komm ich noch dazu, das nachzureichen. Dafür gibt's aber die Ausgabe in MiB. 
@Biber
Wann hat denn diese furchtbare Woche angefangen - doch wohl hoffentlich nicht am *TrautSichNichtMontagHinschreiben*
Grüße
bastla
[Edit] Irgendwann mach ich auch die Zahlenformatiererei in VBS beim ersten Mal richtig.
[/Edit]
Als Entschädigung noch die VBS-Variante:
If WScript.Arguments.Count = 2 Then
sFolderList = WScript.Arguments(0)
sResults = WScript.Arguments(1)
Else
WScript.Echo "Usage: " & WScript.ScriptFullName & " Listendatei Ergebnisdatei"
WScript.Quit(1)
End If
Set fso = CreateObject("Scripting.FileSystemObject")
Set oResultsFile = fso.OpenTextFile(sResults, 2, True)
Set oListFile = fso.OpenTextFile(sFolderList, 1)
Do While Not oListFile.AtEndOfStream
sDirPath = oListFile.ReadLine
If fso.FolderExists(sDirPath) Then
Set oFolder = fso.GetFolder(sDirPath)
oResultsFile.WriteLine Chr(34) & sDirPath & Chr(34) & ";" & FormatNumber(oFolder.Size /1024 / 1024, 3,,,False)
Else
oResultsFile.WriteLine Chr(34) & sDirPath & Chr(34) & ";" & Chr(34) & "nicht gefunden" & Chr(34)
End If
Loop
oResultsFile.Close
oListFile.Close
Hat leider derzeit
@Biber
Wann hat denn diese furchtbare Woche angefangen - doch wohl hoffentlich nicht am *TrautSichNichtMontagHinschreiben*
Grüße
bastla
[Edit] Irgendwann mach ich auch die Zahlenformatiererei in VBS beim ersten Mal richtig.
@Biber
"On Error Resume Next" mag ich nicht so besonders, weil ich trotzdem Fehler (zumindest an neuralgischen Stellen) abfangen müsste, aber ein "If Not Err.Number" nicht so tut, wie ich das gerne hätte.
Grüße
bastla
"On Error Resume Next" mag ich nicht so besonders, weil ich trotzdem Fehler (zumindest an neuralgischen Stellen) abfangen müsste, aber ein "If Not Err.Number" nicht so tut, wie ich das gerne hätte.
Grüße
bastla
Moin 0per8or,
nun hast Du grad wieder eine Stelle angesprochen, wo wir die Diskussion von gestern weiterführen können - die so-oder-so schrottige Fehlerbehandlung von VBSkript.
Mit "On Error Resume Next" isses Quark -seh ich auch so- und die Fehlernummern (Err.Number) nutzen nur dann, wenn man/frau denn weiß, was für konkrete Fehler denn in der jeweiligen Situation auftreten/kommen können.
Und das führt - ja besonders bei M$ selbst- dazu, dass Du dann irgendeinen Fehler "0008AXB9867" oder so ähnlich in einer Messagebox auf dem Bildschirm Deiner Tante Frieda hast.
Die wahrscheinlich davon sehr beeindruckt sein wird, aber es genauwenig versteht wie ich.
Von daher kannst Du eigentlich so wie gestern beim "if not oFS.FolderExists(folder)" vorher abprüfen, ob denn alles da ist, was die nachfolgenden Code-Zeilen brauchen.
Bei Lese/List-Rechten wäre eine Annäherung über folgende Skizze denkbar:
Diese Mini-Function müsstest Du noch in bastla's Schnipsel einbauen als Function
und VOR der Zeile "Set oFolder = fso.GetFolder(sDirPath)" aufrufen.
[ungetestete Skizze / unausgelebte Phantasien]
Gruß
Biber
nun hast Du grad wieder eine Stelle angesprochen, wo wir die Diskussion von gestern weiterführen können - die so-oder-so schrottige Fehlerbehandlung von VBSkript.
Mit "On Error Resume Next" isses Quark -seh ich auch so- und die Fehlernummern (Err.Number) nutzen nur dann, wenn man/frau denn weiß, was für konkrete Fehler denn in der jeweiligen Situation auftreten/kommen können.
Und das führt - ja besonders bei M$ selbst- dazu, dass Du dann irgendeinen Fehler "0008AXB9867" oder so ähnlich in einer Messagebox auf dem Bildschirm Deiner Tante Frieda hast.
Die wahrscheinlich davon sehr beeindruckt sein wird, aber es genauwenig versteht wie ich.
Von daher kannst Du eigentlich so wie gestern beim "if not oFS.FolderExists(folder)" vorher abprüfen, ob denn alles da ist, was die nachfolgenden Code-Zeilen brauchen.
Bei Lese/List-Rechten wäre eine Annäherung über folgende Skizze denkbar:
...
Function HabIchLeseRechte( strOrdner)
' Return: TRUE,/WAHR, wenn wenigstens Lese-Rechte auf alle Dateien da sind
' Pflichtparameter strOrdner: Pfad, auch Netzwerk oder UNC Pfad
On Error Resume Next
Dim fso, f, fc, f1
HabIchLeseRechte = False
Set fso = CreateObject("Scripting.FileSystemObject")
Set f = fso.GetFolder(strOrdner)
Set fc = f.Files
For Each f1 In fc
If Err.Number <> 0 Then Exit For
HabIchLeseRechte = True
Exit Function
Next
Err.Clear
On Error GoTo 0
End Function
Diese Mini-Function müsstest Du noch in bastla's Schnipsel einbauen als Function
und VOR der Zeile "Set oFolder = fso.GetFolder(sDirPath)" aufrufen.
..
If HabIchLeseRechte(sDirPath) then
Set oFolder = fso.GetFolder(sDirPath)
'... wie oben
Else
oResultsFile.WriteLine Chr(34) & sDirPath & Chr(34) & ";" & Chr(34) & " keine Rechte" & Chr(34)
End if
....
[ungetestete Skizze / unausgelebte Phantasien]
Gruß
Biber
@Biber
Nach einigen Tests scheint ziemlich sicher, dass Rechte auf die einzelnen Dateien eines Ordners überhaupt nicht nötig sind, um sogar deren Größe auszulesen (hab es sogar mit Verweigerung des Vollzugriffs auf eine einzelne Datei geschafft, deren Größe anzuzeigen - und nein, es hat nicht der Besitzer der Datei das Script ausgeführt).
Voraussetzung, um die Größe eines Ordners lesen zu können, ist das Recht "Ordnerinhalt auflisten" - allerdings muss dieser Zugriff für alle Unterordner gewährleistet sein, sodass die Function wohl rekursiv anzulegen wäre.
Im Übrigen ist mir Dein Ansatz nicht ganz klar, da ja eigentlich nur die erste betrachtete Datei entscheiden würde - Verlassen der Schleife (mit gesetztem False) bei Fehler bzw Verlassen der Function (mit gesetztem True), wenn kein Fehler?
Mein Ansatz dazu (aber anscheinen ohnehin bereits irrelevant, wenn es nicht auf die Dateien ankommt) wäre etwa so:
Grüße
bastla
Nach einigen Tests scheint ziemlich sicher, dass Rechte auf die einzelnen Dateien eines Ordners überhaupt nicht nötig sind, um sogar deren Größe auszulesen (hab es sogar mit Verweigerung des Vollzugriffs auf eine einzelne Datei geschafft, deren Größe anzuzeigen - und nein, es hat nicht der Besitzer der Datei das Script ausgeführt).
Voraussetzung, um die Größe eines Ordners lesen zu können, ist das Recht "Ordnerinhalt auflisten" - allerdings muss dieser Zugriff für alle Unterordner gewährleistet sein, sodass die Function wohl rekursiv anzulegen wäre.
Im Übrigen ist mir Dein Ansatz nicht ganz klar, da ja eigentlich nur die erste betrachtete Datei entscheiden würde - Verlassen der Schleife (mit gesetztem False) bei Fehler bzw Verlassen der Function (mit gesetztem True), wenn kein Fehler?
Mein Ansatz dazu (aber anscheinen ohnehin bereits irrelevant, wenn es nicht auf die Dateien ankommt) wäre etwa so:
Function HabIchLeseRechte(strOrdner)
' Return: TRUE,/WAHR, wenn wenigstens Lese-Rechte auf alle Dateien da sind
' Pfad, auch Netzwerk oder UNC Pfad
On Error Resume Next
Dim fso, f, fc, f1
HasRights = True
Set fso = CreateObject("Scripting.FileSystemObject")
Set f = fso.GetFolder(strOrdner)
Set fc = f.Files
'Falls keine Rechte auf den Ordner, bereits hier ein Error
If Err.Number = 0 Then
For Each f1 In fc
Dummy = f1.Size
If Err.Number <> 0 Then
HasRights=False
Exit For
End If
Next
Else
HasRights=False
End If
HabIchLeseRechte = HasRights
End Function
Grüße
bastla
@bastla
Und wenn sich das ganze Prüfen reduzieren lässt auf "Recht zum Ordnerinhalt auflisten", dann umso besser.
Wiederum andererseits... im Prinzip kann ich es doch dann auch beschränken auf
"wenn Folder existiert [oFS.FolderExist( sDirname)], ABER ein oFS.GetFolder(sDirname) in die Grütze geht..".
>jeder Fehler ist dann ein Rechteproblem.
Für mich ein weiterer Beleg für mein "M$-Errorhandling taugt nich' für 5 Cent" von oben.
Grüße
Biber
nicht ganz klar, da ja eigentlich nur die erste betrachtete Datei entscheiden würde
Da hast Du Recht... war auch nur schnell dahingeschlampert...Und wenn sich das ganze Prüfen reduzieren lässt auf "Recht zum Ordnerinhalt auflisten", dann umso besser.
Wiederum andererseits... im Prinzip kann ich es doch dann auch beschränken auf
"wenn Folder existiert [oFS.FolderExist( sDirname)], ABER ein oFS.GetFolder(sDirname) in die Grütze geht..".
>jeder Fehler ist dann ein Rechteproblem.
Für mich ein weiterer Beleg für mein "M$-Errorhandling taugt nich' für 5 Cent" von oben.
Grüße
Biber
@Biber
Grüße
bastla
Wiederum andererseits... im Prinzip kann ich es doch dann auch beschränken auf "wenn Folder existiert [oFS.FolderExist( sDirname)], ABER ein oFS.GetFolder(sDirname) in die Grütze geht.."
Leider nein hinsichtlich der Unterordner: Wenn die Rechte auf den enthaltenden Ordner reichen, klappt das "GetFolder"; den Fehler erhält man erst beim Versuch, die Größe auszulesen (da jetzt die Unterordner einbezogen werden).Für mich ein weiterer Beleg für mein "M$-Errorhandling taugt nich' für 5 Cent" von oben.
Kein Einspruch.Grüße
bastla
Na, bastla,
nicht, dass wir noch von M$'s Anwälten einen an den Hals kriegen jetzt...*ggg
Aber, @15858, konnten wir Dich denn auf den richtigen Weg bringen jetzt?
Weil... verfeinern lässt es sich auch endlos weiter.
Wir könnten noch die Fehler abfangen, dass gerade die Netzwerkverbindung abreißt oder ein Lesefehler wegen maroden Sektoren dazwischenkommt oder beim Anfassen einer bestimmten Datei der Virenwächter hochpoppt und sagt. "die sperr ich mal besser"...
Aber so als Skizzen sind die Ansätze doch schon klar, denke ich, und eigentlich die Frage beantwortet, oder?
Gruß
Biber
nicht, dass wir noch von M$'s Anwälten einen an den Hals kriegen jetzt...*ggg
Aber, @15858, konnten wir Dich denn auf den richtigen Weg bringen jetzt?
Weil... verfeinern lässt es sich auch endlos weiter.
Wir könnten noch die Fehler abfangen, dass gerade die Netzwerkverbindung abreißt oder ein Lesefehler wegen maroden Sektoren dazwischenkommt oder beim Anfassen einer bestimmten Datei der Virenwächter hochpoppt und sagt. "die sperr ich mal besser"...
Aber so als Skizzen sind die Ansätze doch schon klar, denke ich, und eigentlich die Frage beantwortet, oder?
Gruß
Biber