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:
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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 161245
Url: https://administrator.de/contentid/161245
Ausgedruckt am: 22.11.2024 um 08:11 Uhr
11 Kommentare
Neuester Kommentar
Moin 0cool,
ausgehend von deinem Ansatz würde es so vielleicht weiter kommen:
...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
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
@Biber
Geht, fürchte ich, aber am Kernproblem vorbei - zumindest erhalte ich (unter W 7) mit
für Zeile 4 ebenfalls einen "Access denied"-Fehler ...
Grüße
bastla
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
Grüße
bastla
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
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
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
Hallo Biber!
Grüße
bastla
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
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
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]
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... [/Edit]
Hallo 0cool!
Schönheitspreis lässt sich damit zwar keiner gewinnen, aber zur Not sollte es tun:
Es wird ganz einfach per CMD
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):
Grüße
bastla
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
for /f "tokens=3" %i in ('dir /s /a /-c "%userprofile%"') do @echo %i
@echo off & setlocal
for /f "tokens=3" %%i in ('dir /s /a /-c "%userprofile%"^|findstr "Datei(en)"') do set "Size=%%i"
echo %Size%
bastla
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
Ausgabe
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
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