0cool
Goto Top

VBScript Profil Ordner Größe anzeigen

Hallo Leute,

Ein paar Infos zum Anfang:

OS = Vista
Profilart = Lokales Profil
Scriptspache = VBScript

Ich muss mir die größe des Profilordners des angemeldeten Profils anzeigen lassen.

Wie bekomme ich das hin?

Mein Versuch war:

set ObjWshShell = WScript.CreateObject("WScript.Shell")  
strUPath = ObjWshShell.Environment("Process")("Userprofile")  
Set objfs = CreateObject("Scripting.FileSystemObject")  
Set objFolder = objshell.namespace(strUPath)
set objSize = objfs.GetFolder(strUPath)
varSize = objSize.Size
MsgBox (varsize)

Bei diesem Script bekomme ich die Meldung:
Fehler: Erlaubnis verweigert
Code: 800A0046
Quelle: Laufzeitfehler in Microsoft VBScript

Ich finde keinen Fehler. Wenn ich den Pfad zu dem Profilordner mit Profilname Statisch angebe kommt die gleich Meldung. Nehme ich einen anderen Ordner den ich selbst erstellt habe, klappt es wunderbar.

Meine Frage an euch: Wie bekomme ich es hin das ich mir die größe des Profil anzeigen lassen kann?

Danke für eure Hilfe

0cool

Content-Key: 161245

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

Printed on: May 22, 2024 at 14:05 o'clock

Member: Biber
Biber Feb 21, 2011 at 16:42:49 (UTC)
Goto Top
Moin 0cool,

ausgehend von deinem Ansatz würde es so vielleicht weiter kommen:
'GetUserprofileSize.vbs  
set ObjWshShell = WScript.CreateObject("WScript.Shell")  
Set oEnv = ObjWshShell.Environment("Process")  
strUPath = oEnv("Userprofile")  
Set objfs = CreateObject("Scripting.FileSystemObject")  
Set objShell = CreateObject("Shell.Application")  
Set objFolder = objShell.namespace(strUPath)
set objSize = objfs.GetFolder(strUPath)
varSize = objSize.Size
MsgBox (varsize)

...obwohl..... DER Schnipsel würde meine (geringen) Anforderungen bezüglich Les-, Wart- und Nachvollziehbarkeit nicht vollständig erfüllen.

Ich habe keinerlei Vermutung, wie du an diesem sich dröge zu Ziel schleppenden Ge(l)eieres nach 3 oder 4 Wochen mal eine Anpassung vornehmen willst?
Der kostet doch mehr Zeit beim Lesen als bei der Ausführung...

Grüße
Biber
Member: bastla
bastla Feb 21, 2011 at 16:46:37 (UTC)
Goto Top
@Biber
Geht, fürchte ich, aber am Kernproblem vorbei - zumindest erhalte ich (unter W 7) mit
Set WshShell = CreateObject("WScript.Shell")  
strUPath = WshShell.ExpandEnvironmentStrings("%Userprofile%")  
Set fso = CreateObject("Scripting.FileSystemObject")  
varSize = fso.GetFolder(strUPath).Size
WScript.Echo varSize
für Zeile 4 ebenfalls einen "Access denied"-Fehler ...

Grüße
bastla
Member: Biber
Biber Feb 21, 2011 at 18:24:02 (UTC)
Goto Top
Moin bastla,

okay, ich hatte mehr diese fehlenden/doppelten/um Vorrang streitenden Objekte in dem Codegestrunkele in Verdacht, a
ber es könnte natürlich auch ein Problem der Virtualisierung sein.
Unterhalb des Profilpfads können sich ja durchaus auch virtualisierte Ordner befinden, das wiederum könnte man/frau überprüfen unter
HKEY_CURRENT_USER\Software\Classes\VirtualStore

Allerdings glaube ich nicht, dass das FileSystemObject irgendwie entscheiden kann, ob es sich um "physisch vorhandene Ordner" oder Links/Aliase/Verzeichnisse außerhalb der Unterordnerstruktur handelt.

Zur Lokalisierung der Fehlerursache fiele mir nur ein, die %userprofile%-Unterstruktur rekursiv durchzuwackeln und bei jedem Unterodner entweder die Größe oder aber "Ins Mett gehauen" auszugeben.
Oder auf Windows 8/9/10 zu warten.

Grüße
Biber
Member: bastla
bastla Feb 21, 2011 at 18:36:19 (UTC)
Goto Top
Hallo Biber!
Zur Lokalisierung der Fehlerursache fiele mir nur ein, die %userprofile%-Unterstruktur rekursiv durchzuwackeln und bei jedem Unterodner entweder die Größe oder aber "Ins Mett gehauen" auszugeben.
ACK, wobei allerdings, im Gegensatz zu einem "dir", ja mit ".Size" auch alle unterhalb des betrachteten Ordners liegenden Objekte erfasst werden, was eine tatsächliche Berechnung dann etwas mühsamer werden ließe ...

Grüße
bastla
Member: 0cool
0cool Feb 21, 2011 at 18:47:24 (UTC)
Goto Top
Hey Ihr beiden,

danke das Ihr euch so einsetzt.

Es muss nicht auf dem Weg gehen den ich eingeschlagen habe, vielleicht gibt es einen anderen Weg über den WSH oder irgend eine anderen Weg. Wie ich da hinkomme ist mir relativ egal, das einzige was zählt ist das der Weg mit den Boardmitteln von Vista zubeschreiten sein sollte.

Der Hintergrund ist das ich ein Script geschrieben habe das über robocopy das Profil wegsichert. Und da die Profile um die es geht unterschiedlich groß sind und die Kollegen die das Script benützen wissen wollen wie lange der Kopiervorgang noch dauert, soll eine Statusanzeige her.

Jetzt hab ich mir gedacht, okay ich lese die größe des Profilordners aus und vergleiche Sie mit der Größe des Zielordners. Aus den beiden Ergebnissen bastele ich mir dann eine Statusanzeige.

Jetzt lässt sich blöderweise die Profilgröße nicht auslesen, zumindest nicht auf den Weg den ich bisher versucht habe. Aber vielleicht bin ich auch auf dem Holzweg und es gibt eine einfacheren Weg.

Und genau an der Stelle benötige ich eure Hilfe. Was Das Scripten von VBScript angeht bin ich noch ziemlich am Anfang, deshalb bin ich gerade auch ein bisschen ratlos.

Gruß

0cool
Member: Biber
Biber Feb 21, 2011 at 19:51:43 (UTC)
Goto Top
Ja nee, bastla,

ich bin zwar nicht der VBSkript-Fan, aber sooo komplex stell ich es mir nicht vor.
Wenn es darum geht, eben mal den/die schuldigen Ordner oder Pseudoordner zu finden, dann wäre mein Quick'n'Dirty-Schnellschuss

'GetUserprofileError.vbs  
Set WshShell = CreateObject("WScript.Shell")  
strUPath = WshShell.ExpandEnvironmentStrings("%Userprofile%")  
Set fso = CreateObject("Scripting.FileSystemObject")  

FackelFolderAb StrUPath 
' varSize = fso.GetFolder(strUPath).Size  
' WScript.Echo varSize  
wscript.quit


Sub FackelFolderAb(SubFolder)
 Dim  oFldr, SubFldrs 

   Set oFldr = FSO.GetFolder(SubFolder)
     If Len(SubFolder) > 3 Then  ' Rootordner übergehen.  
       On Error Resume Next
       If oFldr.size > 4711 Then ' mal drauffassen und hören, ob er weint....  
           if Err.number then
             Wscript.echo  oFldr.Path & "  In die Grütze gefasst"  
              err.clear
        ' --eigentlich bei Fehlersuche egal--  else  
        '  --eigentlich bei Fehlersuche egal--     WScript.echo oFldr.Path & ": " & CStr(oFldr.Size )  
            End if  
        End if    
  
     End If

    Set SubFldrs = oFldr.SubFolders
    If SubFldrs.count > 0 Then
         For Each SubFldr in SubFldrs
          FackelFolderAb SubFldr.path
        Next
    End If
 Set SubFldrs = Nothing
 Set oFldr = Nothing

End Sub

Zeile 22/23 kann man/frau auch wieder ent-kommentieren, weil ja sonst gar nix flimmert im OK-Fall.

So in etwa würde ich die Problematik versuchen einzugrenzen.
Ich kann es an diesem Rechner aber nicht mit Win7 testen - der PC ist so alt wie guter Whisky auch mindestens sein muss...

Grüße
Biber

[Edit] @bastla ...Und ich kasper hier rum mit diesem neumodischen VBSkript-Geraffel... face-wink [/Edit]
Member: bastla
bastla Feb 21, 2011 at 19:52:33 (UTC)
Goto Top
Hallo 0cool!

Schönheitspreis lässt sich damit zwar keiner gewinnen, aber zur Not sollte es tun:
Set WshShell = CreateObject("WScript.Shell")  
CMD = "%comspec% /c for /f ""tokens=3"" %i in ('dir /s /a /-c ""%userprofile%""') do @echo %i"  
Set oExec = WshShell.Exec(CMD)
Do While Not oExec.StdOut.AtEndOfStream
    Size = Split(oExec.StdOut.ReadAll,vbCrLf)
Loop
valSize = Size(UBound(Size)-2)
WScript.Echo valSize
Es wird ganz einfach per CMD
for /f "tokens=3" %i in ('dir /s /a /-c "%userprofile%"') do @echo %i
ausgeführt und das Ergebnis in VBS ausgewertet - direkt per Batch ginge das natürlich auch (und, wie fast immer im Vergleich mit VBS, etwas kompakter):
@echo off & setlocal
for /f "tokens=3" %%i in ('dir /s /a /-c "%userprofile%"^|findstr "Datei(en)"') do set "Size=%%i"  
echo %Size%
Grüße
bastla
Member: 0cool
0cool Feb 22, 2011 at 09:18:33 (UTC)
Goto Top
@Biber: Danke dein Script bringt mich weiter.

<edit>
@bastla: auch dir vielen dank für deine Mühe.

Ich habe man deine Quellcode genommen und eine Zeile hinzugefügt. Mein Ziel war ein Ergebniss zubekommen, in KB

Set WshShell = CreateObject("WScript.Shell")  
CMD = "%comspec% /c for /f ""tokens=3"" %i in ('dir /s /a /-c ""%userprofile%""') do @echo %i"  
Set oExec = WshShell.Exec(CMD)
Do While Not oExec.StdOut.AtEndOfStream
    Size = Split(oExec.StdOut.ReadAll,vbCrLf)
Loop
valSize = Size(UBound(Size)-2)
WScript.Echo valSize

' ---------------------------------------------  
' Von mir hinzugefügt  
WScript.Echo (valSize/(1024*1024*1024*1024))

Das Ergebniss war etwas kommisch, da die letzten 5 stellen so aussahen: E- 03

Was gibt den dein Script aus, bzw warum bekomme ich bei meiner Berechnung den angegebenen Wert raus?

</edit>


Gruß

0cool
Member: Biber
Biber Feb 22, 2011 at 16:53:38 (UTC)
Goto Top
Moin 0cool,

zwei kleine Tipps von mir...
Erstens bekommt es kein Mitleser mit, wenn du morgens um halbig 11 einen Kommentar schreibst
und dann irgendwann Stunden später eine Folgefrage in diesen Kommentar reineditierst.
Da schreib dann lieber NOCH einen Kommentar .... was soll's.
Den Klimawandel kannst du eh auch mit einem editierten Kommentar ebensowenig aufhalten wie ich mit meinem Beitragsrecycling.

Zweiter Tipp: verwende die "Round()"-Funktion, sonst geht eben bei zu kleinen Werten VBScript davon aus, dass dir die Rechengenauigkeit
mit so vielen Stellen wie möglich ["2,6789013 TeraByte mal 1/1000"] wichtiger ist als eine Anzeige "0,00 Terabyte"

Prüfe es doch vorher trocken mit einer Spiel-Varsize
valsize = 123467789012
WScript.Echo "[In  Byte] " & cStr( valsize)  
WScript.Echo "[In KByte] " & cStr(Round(valsize/1024, 2))  
WScript.Echo "[In MByte] " & cStr(Round(valsize/(1024*1024), 2))  
WScript.Echo "[In GByte] " & cStr(Round(valsize/(1024*1024*1024), 2))  
' usw ....WScript.Echo Round( (valSize/(1024*1024*1024*1024)), 2)  
wscript quit

Ausgabe
>f:schnipselRoundvalsize.vbs
[In  Byte] 123467789012
[In KByte] 120574012,71
[In MByte] 117748,06
[In GByte] 114,99

Wenn du kein "Round()" verwendest, dann wird dir irgendwann das wissenschaftliche Format "E -03".. " E -04",
also "mal 10 hoch minus 3" etc angezeigt.

Grüße
Biber
Member: 0cool
0cool Feb 22, 2011 at 17:20:18 (UTC)
Goto Top
@Biber: vielen Dank für den Tipp. Das runden werde ich gleich morgen ausprbieren.

Gruß

0cool
Member: 0cool
0cool Mar 04, 2011 at 13:32:01 (UTC)
Goto Top
@Biber: Ichabs ausprobier, klappt wunderbar.

Ich bedanke mich bei allen und schliesse hiermit das Thema.