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

VBScript Profil Ordner Größe anzeigen

Frage Entwicklung VB for Applications

Mitglied: 0cool

0cool (Level 2) - Jetzt verbinden

21.02.2011, aktualisiert 22.02.2011, 10618 Aufrufe, 11 Kommentare

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:

01.
set ObjWshShell = WScript.CreateObject("WScript.Shell") 
02.
strUPath = ObjWshShell.Environment("Process")("Userprofile") 
03.
Set objfs = CreateObject("Scripting.FileSystemObject") 
04.
Set objFolder = objshell.namespace(strUPath) 
05.
set objSize = objfs.GetFolder(strUPath) 
06.
varSize = objSize.Size 
07.
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
Mitglied: Biber
21.02.2011 um 17:42 Uhr
Moin 0cool,

ausgehend von deinem Ansatz würde es so vielleicht weiter kommen:
01.
'GetUserprofileSize.vbs 
02.
set ObjWshShell = WScript.CreateObject("WScript.Shell") 
03.
Set oEnv = ObjWshShell.Environment("Process") 
04.
strUPath = oEnv("Userprofile") 
05.
Set objfs = CreateObject("Scripting.FileSystemObject") 
06.
Set objShell = CreateObject("Shell.Application") 
07.
Set objFolder = objShell.namespace(strUPath) 
08.
set objSize = objfs.GetFolder(strUPath) 
09.
varSize = objSize.Size 
10.
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
Bitte warten ..
Mitglied: bastla
21.02.2011 um 17:46 Uhr
@Biber
Geht, fürchte ich, aber am Kernproblem vorbei - zumindest erhalte ich (unter W 7) mit
01.
Set WshShell = CreateObject("WScript.Shell") 
02.
strUPath = WshShell.ExpandEnvironmentStrings("%Userprofile%") 
03.
Set fso = CreateObject("Scripting.FileSystemObject") 
04.
varSize = fso.GetFolder(strUPath).Size 
05.
WScript.Echo varSize
für Zeile 4 ebenfalls einen "Access denied"-Fehler ...

Grüße
bastla
Bitte warten ..
Mitglied: Biber
21.02.2011 um 19:24 Uhr
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
Bitte warten ..
Mitglied: bastla
21.02.2011 um 19:36 Uhr
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
Bitte warten ..
Mitglied: 0cool
21.02.2011 um 19:47 Uhr
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
Bitte warten ..
Mitglied: Biber
21.02.2011 um 20:51 Uhr
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

01.
'GetUserprofileError.vbs 
02.
Set WshShell = CreateObject("WScript.Shell") 
03.
strUPath = WshShell.ExpandEnvironmentStrings("%Userprofile%") 
04.
Set fso = CreateObject("Scripting.FileSystemObject") 
05.
 
06.
FackelFolderAb StrUPath  
07.
' varSize = fso.GetFolder(strUPath).Size 
08.
' WScript.Echo varSize 
09.
wscript.quit 
10.
 
11.
 
12.
Sub FackelFolderAb(SubFolder) 
13.
 Dim  oFldr, SubFldrs  
14.
 
15.
   Set oFldr = FSO.GetFolder(SubFolder) 
16.
     If Len(SubFolder) > 3 Then  ' Rootordner übergehen. 
17.
       On Error Resume Next 
18.
       If oFldr.size > 4711 Then ' mal drauffassen und hören, ob er weint.... 
19.
           if Err.number then 
20.
             Wscript.echo  oFldr.Path & "  In die Grütze gefasst" 
21.
              err.clear 
22.
        ' --eigentlich bei Fehlersuche egal--  else 
23.
        '  --eigentlich bei Fehlersuche egal--     WScript.echo oFldr.Path & ": " & CStr(oFldr.Size ) 
24.
            End if   
25.
        End if     
26.
   
27.
     End If 
28.
 
29.
    Set SubFldrs = oFldr.SubFolders 
30.
    If SubFldrs.count > 0 Then 
31.
         For Each SubFldr in SubFldrs 
32.
          FackelFolderAb SubFldr.path 
33.
        Next 
34.
    End If 
35.
 Set SubFldrs = Nothing 
36.
 Set oFldr = Nothing 
37.
 
38.
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... [/Edit]
Bitte warten ..
Mitglied: bastla
21.02.2011 um 20:52 Uhr
Hallo 0cool!

Schönheitspreis lässt sich damit zwar keiner gewinnen, aber zur Not sollte es tun:
01.
Set WshShell = CreateObject("WScript.Shell") 
02.
CMD = "%comspec% /c for /f ""tokens=3"" %i in ('dir /s /a /-c ""%userprofile%""') do @echo %i" 
03.
Set oExec = WshShell.Exec(CMD) 
04.
Do While Not oExec.StdOut.AtEndOfStream 
05.
    Size = Split(oExec.StdOut.ReadAll,vbCrLf) 
06.
Loop 
07.
valSize = Size(UBound(Size)-2) 
08.
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):
01.
@echo off & setlocal 
02.
for /f "tokens=3" %%i in ('dir /s /a /-c "%userprofile%"^|findstr "Datei(en)"') do set "Size=%%i" 
03.
echo %Size%
Grüße
bastla
Bitte warten ..
Mitglied: 0cool
22.02.2011 um 10:18 Uhr
@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

01.
Set WshShell = CreateObject("WScript.Shell") 
02.
CMD = "%comspec% /c for /f ""tokens=3"" %i in ('dir /s /a /-c ""%userprofile%""') do @echo %i" 
03.
Set oExec = WshShell.Exec(CMD) 
04.
Do While Not oExec.StdOut.AtEndOfStream 
05.
    Size = Split(oExec.StdOut.ReadAll,vbCrLf) 
06.
Loop 
07.
valSize = Size(UBound(Size)-2) 
08.
WScript.Echo valSize 
09.
 
10.
' --------------------------------------------- 
11.
' Von mir hinzugefügt 
12.
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
Bitte warten ..
Mitglied: Biber
22.02.2011 um 17:53 Uhr
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
01.
valsize = 123467789012 
02.
WScript.Echo "[In  Byte] " & cStr( valsize) 
03.
WScript.Echo "[In KByte] " & cStr(Round(valsize/1024, 2)) 
04.
WScript.Echo "[In MByte] " & cStr(Round(valsize/(1024*1024), 2)) 
05.
WScript.Echo "[In GByte] " & cStr(Round(valsize/(1024*1024*1024), 2)) 
06.
' usw ....WScript.Echo Round( (valSize/(1024*1024*1024*1024)), 2) 
07.
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
Bitte warten ..
Mitglied: 0cool
22.02.2011 um 18:20 Uhr
@Biber: vielen Dank für den Tipp. Das runden werde ich gleich morgen ausprbieren.

Gruß

0cool
Bitte warten ..
Mitglied: 0cool
04.03.2011 um 14:32 Uhr
@Biber: Ichabs ausprobier, klappt wunderbar.

Ich bedanke mich bei allen und schliesse hiermit das Thema.
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(1)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Heiß diskutierte Inhalte
LAN, WAN, Wireless
gelöst Server erkennt Client nicht wenn er ausserhalb des DHCP Pools liegt (28)

Frage von Mar-west zum Thema LAN, WAN, Wireless ...

Outlook & Mail
Outlook 2010 findet ost datei nicht (18)

Frage von Floh21 zum Thema Outlook & Mail ...

Windows Server
Server 2008R2 startet nicht mehr (Bad Patch 0xa) (18)

Frage von Haures zum Thema Windows Server ...