Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

VB Script - belegten Speicherplatz eines Ordners anzeigen

Frage Entwicklung Batch & Shell

Mitglied: 15858

15858 (Level 1)

08.11.2006, aktualisiert 09.11.2006, 7107 Aufrufe, 22 Kommentare

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.

Mit freundlichen Grüßen 0per8or
Mitglied: Biber
08.11.2006 um 15:17 Uhr
Rückfrage:
Den "belegten Speicherplatz" oder "die Summe der einzelnen Dateigrößen in diesem Ordner"?

Gruß
Biber
Bitte warten ..
Mitglied: bastla
08.11.2006 um 15:22 Uhr
Hallo Oper8or!

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

Grüße
bastla
Bitte warten ..
Mitglied: 15858
08.11.2006 um 15:47 Uhr
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.

Mit freundlichen Grüßen 0per8or
Bitte warten ..
Mitglied: bastla
08.11.2006 um 16:51 Uhr
Hallo Oper8or!

Hatte nur für folgendes Zeit:

01.
@echo off & Setlocal 
02.
Set Erg="D:\Ergebnis.txt" 
03.
If Exist %Erg% del %Erg% 
04.
for /f %%f in (D:\liste.txt) do call :GetDirSize "%%f" 
05.
goto :eof 
06.
:GetDirSize 
07.
for /f "tokens=2,3*" %%i in ('dir %1 /a /s /-c ^| findstr "Datei(en)"') do set Size=%%j 
08.
echo %1; %Size% >> %Erg% 
09.
goto :eof
Noch zu verbessern: Formatierung des Ergebnisses (derzeit Anzeige in Bytes), Übergabe von Listen- und Ergebnisdatei beim Batchaufruf

HTH
bastla
Bitte warten ..
Mitglied: Biber
08.11.2006 um 17:02 Uhr
...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
Bitte warten ..
Mitglied: bastla
08.11.2006 um 17:17 Uhr
@Biber

Du bist aber streng heute ...

Grüße
bastla
Bitte warten ..
Mitglied: Biber
08.11.2006 um 17:40 Uhr
@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
Bitte warten ..
Mitglied: 15858
08.11.2006 um 17:51 Uhr
@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!

Mit freundlichen Grüßen 0per8or
Bitte warten ..
Mitglied: bastla
08.11.2006 um 17:57 Uhr
Hallo Oper8or!

Als Entschädigung noch die VBS-Variante:
01.
If WScript.Arguments.Count = 2 Then 
02.
	sFolderList = WScript.Arguments(0) 
03.
	sResults = WScript.Arguments(1) 
04.
Else 
05.
	WScript.Echo "Usage: " & WScript.ScriptFullName & " Listendatei Ergebnisdatei" 
06.
	WScript.Quit(1) 
07.
End If 
08.
 
09.
Set fso = CreateObject("Scripting.FileSystemObject") 
10.
Set oResultsFile = fso.OpenTextFile(sResults, 2, True) 
11.
Set oListFile = fso.OpenTextFile(sFolderList, 1) 
12.
 
13.
Do While Not oListFile.AtEndOfStream 
14.
	sDirPath = oListFile.ReadLine 
15.
	If fso.FolderExists(sDirPath) Then 
16.
		Set oFolder = fso.GetFolder(sDirPath) 
17.
		oResultsFile.WriteLine Chr(34) & sDirPath & Chr(34) & ";" & FormatNumber(oFolder.Size /1024 / 1024, 3,,,False) 
18.
	Else 
19.
		oResultsFile.WriteLine Chr(34) & sDirPath & Chr(34) & ";" & Chr(34) & "nicht gefunden" & Chr(34) 
20.
	End If 
21.
Loop 
22.
 
23.
oResultsFile.Close 
24.
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.

@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]
Bitte warten ..
Mitglied: 15858
08.11.2006 um 18:31 Uhr
Hi bastla!

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

Mit freundlichen Grüßen 0per8or
Bitte warten ..
Mitglied: bastla
08.11.2006 um 18:49 Uhr
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
Bitte warten ..
Mitglied: Biber
08.11.2006 um 19:02 Uhr
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
Bitte warten ..
Mitglied: bastla
08.11.2006 um 19:12 Uhr
@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
Bitte warten ..
Mitglied: 15858
09.11.2006 um 14:16 Uhr
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?

Mit freundlichen Grüßen 0per8or
Bitte warten ..
Mitglied: Biber
09.11.2006 um 14:41 Uhr
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:
01.
... 
02.
Function HabIchLeseRechte( strOrdner) 
03.
 ' Return: TRUE,/WAHR, wenn wenigstens Lese-Rechte auf alle Dateien da sind 
04.
 ' Pflichtparameter strOrdner: Pfad, auch Netzwerk oder UNC Pfad 
05.
 On Error Resume Next 
06.
 Dim fso, f, fc, f1 
07.
 HabIchLeseRechte = False 
08.
 Set fso = CreateObject("Scripting.FileSystemObject") 
09.
 Set f = fso.GetFolder(strOrdner) 
10.
 Set fc = f.Files 
11.
 For Each f1 In fc 
12.
  If Err.Number <> 0 Then Exit For 
13.
  HabIchLeseRechte = True 
14.
  Exit Function 
15.
 Next 
16.
 Err.Clear 
17.
 On Error GoTo 0 
18.
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.

01.
.. 
02.
If HabIchLeseRechte(sDirPath) then 
03.
     Set oFolder = fso.GetFolder(sDirPath) 
04.
      '... wie oben 
05.
Else 
06.
     oResultsFile.WriteLine Chr(34) & sDirPath & Chr(34) & ";" & Chr(34) & " keine Rechte" & Chr(34) 
07.
 
08.
End if 
09.
....
[ungetestete Skizze / unausgelebte Phantasien]

Gruß
Biber
Bitte warten ..
Mitglied: 15858
09.11.2006 um 15:45 Uhr
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.

Mit freundlichen Grüßen 0per8or
Bitte warten ..
Mitglied: Biber
09.11.2006 um 16:08 Uhr
Sorry... hatte oben noch einen Fehler drin...Funktionsnamen nicht angepasst.
Sorry.
Probier noch mal bitte.

Biber
Bitte warten ..
Mitglied: bastla
09.11.2006 um 16:21 Uhr
@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:
01.
Function HabIchLeseRechte(strOrdner) 
02.
 ' Return: TRUE,/WAHR, wenn wenigstens Lese-Rechte auf alle Dateien da sind 
03.
 ' Pfad, auch Netzwerk oder UNC Pfad 
04.
 On Error Resume Next 
05.
 Dim fso, f, fc, f1 
06.
 HasRights = True 
07.
 Set fso = CreateObject("Scripting.FileSystemObject") 
08.
 Set f = fso.GetFolder(strOrdner) 
09.
 Set fc = f.Files 
10.
 'Falls keine Rechte auf den Ordner, bereits hier ein Error 
11.
 If Err.Number = 0 Then 
12.
  For Each f1 In fc 
13.
  Dummy = f1.Size 
14.
  If Err.Number <> 0 Then  
15.
    HasRights=False 
16.
	Exit For 
17.
  End If 
18.
  Next 
19.
 Else 
20.
  HasRights=False 
21.
 End If 
22.
 HabIchLeseRechte = HasRights 
23.
End Function
Grüße
bastla
Bitte warten ..
Mitglied: Biber
09.11.2006 um 16:41 Uhr
@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
Bitte warten ..
Mitglied: bastla
09.11.2006 um 16:54 Uhr
@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
Bitte warten ..
Mitglied: Biber
09.11.2006 um 17:12 Uhr
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
Bitte warten ..
Mitglied: 15858
09.11.2006 um 18:06 Uhr
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.

Mit freundlichen Grüßen 0per8or
Bitte warten ..
Neuester Wissensbeitrag
Humor (lol)

Linkliste für Adventskalender

(3)

Information von nikoatit zum Thema Humor (lol) ...

Ähnliche Inhalte
Outlook & Mail
gelöst Email Anhänge speichern VB Script aber nur bestimmte Dateitypen (Outlook) (4)

Frage von LindeUnimog zum Thema Outlook & Mail ...

VB for Applications
gelöst VB Script rekursiv statt nur ein Ordner (4)

Frage von Saschaaaaa zum Thema VB for Applications ...

VB for Applications
gelöst VB Script nach gefundenem Wort die nächsten 4 Zeichen ersetzten (2)

Frage von deutsch73 zum Thema VB for Applications ...

Heiß diskutierte Inhalte
Exchange Server
gelöst Exchange 2010 Berechtigungen wiederherstellen (20)

Frage von semperf1delis zum Thema Exchange Server ...

Windows Server
DHCP Server switchen (20)

Frage von M.Marz zum Thema Windows Server ...

Hardware
gelöst Negative Erfahrungen LAN-Karten (19)

Frage von MegaGiga zum Thema Hardware ...

Exchange Server
DNS Einstellung - zwei feste IPs für Mailserver (15)

Frage von ivan0s zum Thema Exchange Server ...