15858
Goto Top

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

Content-Key: 43993

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

Printed on: April 20, 2024 at 03:04 o'clock

Member: Biber
Biber Nov 08, 2006 at 14:17:23 (UTC)
Goto Top
Rückfrage:
Den "belegten Speicherplatz" oder "die Summe der einzelnen Dateigrößen in diesem Ordner"?

Gruß
Biber
Member: bastla
bastla Nov 08, 2006 at 14:22:56 (UTC)
Goto Top
Hallo Oper8or!

Weitere Rückfrage: Obiges bezogen auf den Ordner mit/ohne Unterordner?

Grüße
bastla
Mitglied: 15858
15858 Nov 08, 2006 at 14:47:18 (UTC)
Goto Top
Es soll die Größe in Megabyte oder Gigabyte des kompletten Ordnerinhalts oder Freigabe, inklusive aller Ordner und Dateien angezeigt und in eine txt-Datei geschrieben werden.

mfg 0per8or
Member: bastla
bastla Nov 08, 2006 at 15:51:16 (UTC)
Goto Top
Hallo Oper8or!

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
Member: Biber
Biber Nov 08, 2006 at 16:02:46 (UTC)
Goto Top
...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
Member: bastla
bastla Nov 08, 2006 at 16:17:20 (UTC)
Goto Top
@Biber

Du bist aber streng heute ...

Grüße
bastla
Member: Biber
Biber Nov 08, 2006 at 16:40:58 (UTC)
Goto Top
@bastla
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
Mitglied: 15858
15858 Nov 08, 2006 at 16:51:26 (UTC)
Goto Top
@bastla
Danke für den Code. Funktioniert super... ich versteh zwar noch nicht alles was da drin steht, aber das bekomm ich schon noch raus. =)

@Biber
Kein Problem!

mfg 0per8or
Member: bastla
bastla Nov 08, 2006 at 16:57:26 (UTC)
Goto Top
Hallo Oper8or!

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 kein 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. face-wink

@Biber
Wann hat denn diese furchtbare Woche angefangen - doch wohl hoffentlich nicht am *TrautSichNichtMontagHinschreiben* face-wink

Grüße
bastla

[Edit] Irgendwann mach ich auch die Zahlenformatiererei in VBS beim ersten Mal richtig. face-sad [/Edit]
Mitglied: 15858
15858 Nov 08, 2006 at 17:31:47 (UTC)
Goto Top
Hi bastla!

Das VB Script gefällt mir noch besser. Das ist echt klasse! Vielen Dank!

mfg 0per8or
Member: bastla
bastla Nov 08, 2006 at 17:49:30 (UTC)
Goto Top
Hallo Oper8or!

Zumindest das Vorhandensein der Ordner wird im Script jetzt vorweg überprüft - habe oben zur vorläufig endgültigen Version editiert.

Grüße
bastla
Member: Biber
Biber Nov 08, 2006 at 18:02:27 (UTC)
Goto Top
Hihi...grad hatte ich angefangen mit meinem Kommentar..dass vielleicht noch eine
"If fso.FolderExists(sDirPath)"-Verzweigung reinkönnte oder wenigstens ein "On Error resume next",
aber da warst Du wieder schneller, bastla...

Schönen Abend
Biber
Member: bastla
bastla Nov 08, 2006 at 18:12:08 (UTC)
Goto Top
@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
Mitglied: 15858
15858 Nov 09, 2006 at 13:16:01 (UTC)
Goto Top
Hi,

es funktioniert alles soweit super. Bei manchen Verzeichnissen bekomme ich allerdings die Fehlermeldung "Erlaubnis verweigert" und das Script bricht ab. Ich hab mir jetzt schon alle Berechtigungen angesehen und nach ein paar Einstellungen funktioniert es dann auch.

Gibt es eine Möglichkeit, eine Fehlermeldung mit in die Datei auszugeben ohne das das Script abbricht?

mfg 0per8or
Member: Biber
Biber Nov 09, 2006 at 13:41:00 (UTC)
Goto Top
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:
...
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
Mitglied: 15858
15858 Nov 09, 2006 at 14:45:10 (UTC)
Goto Top
Hab mir das jetzt eingebaut und ein bisschen angepasst.

Jetzt bekomme ich allerdings bei fast allen Verzeichnissen die Antwort "keine Rechte" in der Ergebnisdatei. Da war es vorher besser.

Ich werde weiter ausprobieren.

mfg 0per8or
Member: Biber
Biber Nov 09, 2006 at 15:08:02 (UTC)
Goto Top
Sorry... hatte oben noch einen Fehler drin...Funktionsnamen nicht angepasst.
Sorry.
Probier noch mal bitte.

Biber
Member: bastla
bastla Nov 09, 2006 at 15:21:20 (UTC)
Goto Top
@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:
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
Member: Biber
Biber Nov 09, 2006 at 15:41:45 (UTC)
Goto Top
@bastla
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
Member: bastla
bastla Nov 09, 2006 at 15:54:45 (UTC)
Goto Top
@Biber

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
Member: Biber
Biber Nov 09, 2006 at 16:12:49 (UTC)
Goto Top
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
Mitglied: 15858
15858 Nov 09, 2006 at 17:06:03 (UTC)
Goto Top
Ja. Dieses Thema können wir jetzt als beantwortet sehen. Ihr habt mir auf jeden Fall ein großes Stück weiter geholfen. Danke nochmal.

mfg 0per8or