snake 10 Geschrieben 3. August 2005 Melden Teilen Geschrieben 3. August 2005 Hallo zusammen, Ich suche jemand mit Kix Erfahrung Zu meinem Problem: Ich lese über WMI die Werte der Festplatte aus $objWMIService = GetObject("winmgmts:\\"+ $strComputer + "\root\cimv2") $colItems = $objWMIService.ExecQuery("Select * from Win32_DiskDrive") ?"Size: " +$objDiskDrive.Size Ausgegeben wird dann: Size: 40007761920 Ich will aber nicht das es in Byte (sind glaub ich Bytes) angegeben wird sondern in GB dazu müsste ich den Wert 3mal durch 1024 teilen. Der Wert “40007761920“ ist allerdings zu groß um mit ihm zu rechnen Es können nur Werte in Variablen gespeichert werden die maximal 9 stellen haben Jetzt zu meiner Frage: Wie kann ich mit der Zahl rechnen bzw. wie kann ich die letzten 3 Stellen der Variablen “abschneiden“ um mit dem Wert weiter rechnen zu können? Ich hoffe dass mir jemand weiterhelfen kann Gruss Snake Zitieren Link zu diesem Kommentar
Das Urmel 10 Geschrieben 3. August 2005 Melden Teilen Geschrieben 3. August 2005 Wenn du jetzt noch dein KIX-Problem erläuterst? Bisher ist es WMI, VBS :) Zitieren Link zu diesem Kommentar
snake 10 Geschrieben 3. August 2005 Autor Melden Teilen Geschrieben 3. August 2005 also geschrieben ist es in kix .... mein problem ist das ich nicht weiß wie ich mit der zahl 40007761920 rechnen kann bzw mit der variablen $objDiskDrive.Size beim arbeitsspeicher hatte ich das selbe problem hier hat es sich allerdings so lösen lassen : ? "Arbeitsspeicher: " + Abs($objItem.TotalPhysicalMemory)/1024/1024 das geht aber bei der festplattengröße nicht... frag mich aber nicht warum Zitieren Link zu diesem Kommentar
Das Urmel 10 Geschrieben 3. August 2005 Melden Teilen Geschrieben 3. August 2005 Nuja, dann halt basteln - in etwa so ; ---- Check space on C -------------- $UsrDrive = GETDISKSPACE("C:\") $szDrive = "" + $UsrDrive $flen = Len($szDrive)-1 $dSize = "" select CASE $flen = 8 ; 100Gb $dSize = SUBSTR($szDrive,1,3)+"," + SUBSTR($szDrive,1,2) $Unit= "GByte" CASE $flen = 7 ; 10GB $dSize = SUBSTR($szDrive,1,2)+"," + SUBSTR($szDrive,1,2) $Unit= "GByte" CASE $flen = 6 ; 1GB $dSize = SUBSTR($szDrive,1,1)+"," + SUBSTR($szDrive,1,2) $Unit= "GByte" CASE $flen = 5 ; 100MB $dSize = SUBSTR($szDrive,1,3)+"," + SUBSTR($szDrive,1,2) $Unit= "MByte" CASE $flen = 4 ; 10MB $dSize = SUBSTR($szDrive,1,2)+"," + SUBSTR($szDrive,1,2) $Unit= "MByte" CASE $flen = 3 $dSize = SUBSTR($szDrive,1,$flen) $Unit = "KByte" endselect $X = "Platz auf C:" $Y="$dSize $Unit" GOSUB DISP Muste halt probieren :) Zitieren Link zu diesem Kommentar
snake 10 Geschrieben 3. August 2005 Autor Melden Teilen Geschrieben 3. August 2005 hm ok ich stell meine frage mal anderst wie kann ich bei einem wert (nehmen wir mal zufällig 40007761920) von hinten einzelne zahlen abschneiden ? in c/c++ geht das ... aber geht das auch mit kix ? und wenn ja wie ? ich geh mal davon aus das es ein string ist und leider kein INT Zitieren Link zu diesem Kommentar
Das Urmel 10 Geschrieben 3. August 2005 Melden Teilen Geschrieben 3. August 2005 Hab ich dir extra Strings und Substrings mit auf den Weg gegeben, nunja. Das ist übrigends ein KIX-Script obiges, aber wenn du damit nicht zufrieden bist, dann machen wir das halt mit VBS. ------ Los gehts ------- strComputer = "." Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") Set objWMIInstance = objWMIService.ExecQuery("Select * from Win32_DiskDrive") For Each item In objWMIInstance WScript.Echo "Size Bytes :", item.Size WScript.Echo "Size Dezimal :", fFormatNum(item.Size, False) WScript.Echo "Size gerundet :", fFormatNum(item.Size, True) Next Wscript.quit ' die Funktion dazu Private Function fFormatNum(num, DropDecimal) Dim bytes Dim lngSize If IsNumeric(num) Then If Len(num) < 5 Then lngSize = FormatNumber((num /1024), 2, vbTrue, vbTrue, vbUseDefault) bytes = " Gb" Elseif Len(num) < 7 Then lngSize = FormatNumber((num / 1024), 2, vbTrue, vbTrue, vbUseDefault) bytes = " Kb" Elseif Len(num) < 10 Then lngSize = FormatNumber((num / 1024 ^ 2), 2, vbTrue, vbTrue, vbUseDefault) bytes = " Mb" Elseif Len(num) < 13 Then lngSize = FormatNumber((num / 1024 ^ 3), 2, vbTrue, vbTrue, vbUseDefault) bytes = " Gb" Elseif Len(num) < 16 Then lngSize = FormatNumber((num / 1024 ^ 4), 2, vbTrue, vbTrue, vbUseDefault) bytes = " Tb" Elseif Len(num) >= 16 Then lngSize = FormatNumber((num / 1024 ^ 5), 2, vbTrue, vbTrue, vbUseDefault) bytes = " Pb" End If If DropDecimal Or Right(lngSize, 2) = "00" Then fFormatNum = CStr(Round(lngSize, 0)) & bytes Else fFormatNum = CStr(lngSize) & bytes End If Else fFormatNum = num End If End Function ------ ende Scripting ---- Nun must du aber völlig zufrieden sein :D Zitieren Link zu diesem Kommentar
snake 10 Geschrieben 4. August 2005 Autor Melden Teilen Geschrieben 4. August 2005 hmm ich bin eigentlich zufrieden :-) ABER :-) das vbs teil ist echt nicht schlecht ist ja auch ausführbar aber mit vb kann ich leider nix anfangen :-( das kix teil ist wars***einlich genau das selbe aber ich steig nicht ganz duch dir funktion :-) bin kein script guru LOL eher ein noob :-) du hast in dem kix script keinerlei ausgabe drin ... das peil ich nicht ganz .. welchen wert soll ich den Zitieren Link zu diesem Kommentar
Das Urmel 10 Geschrieben 4. August 2005 Melden Teilen Geschrieben 4. August 2005 Och nö, soviel Mühe und nun das :nene: ?$x <-- im Kix, das Gosub Disp wäre der Sprung in die Ausgabe. Zitieren Link zu diesem Kommentar
snake 10 Geschrieben 4. August 2005 Autor Melden Teilen Geschrieben 4. August 2005 also ich habs jetzt einigermassen hinbekommen .. nur gibt das script den freien speicherplatz aus jetzt muss ich es nur noch umbiegen das es den gesamten platz ausgiebt so wie dein vbs script mal sehen ob ich das noch hinbekomm Zitieren Link zu diesem Kommentar
snake 10 Geschrieben 4. August 2005 Autor Melden Teilen Geschrieben 4. August 2005 soweit ich das jetzt verstaden hab liest du damit den freien speicher aus .. ist aber leider uninteresnt .. um den kompletten spreicher der platte zu bekommen lesen ich diesen über wmi ein --------------------------- $strComputer = "." $objWMIService = GetObject("winmgmts:\\"+ $strComputer + "\root\cimv2") $colhds = $objWMIService.ExecQuery("Select * from Win32_DiskDrive") For Each $objhd In $colhds ?"Size: " + $objhd.Size Next ------------------------- wenn ich jetzt nicht ganz falsch liege müsse ich dein sript also mit dem wert "$objhd.Size" füttern um den gesamten spreicher ausgeben zu wollen ich hoff bis hier ist es richtig und wenn ich es ganz verstanden habe müsse das dann so aussehen ? ------------------------- $strComputer = "." $objWMIService = GetObject("winmgmts:\\"+ $strComputer + "\root\cimv2") $colhds = $objWMIService.ExecQuery("Select * from Win32_DiskDrive") For Each $objhd In $colhds ?"Size: " + $objhd.Size ; wird nur zum den wert überprüfen ausgegeben Next ;$UsrDrive = GetDiskSpace("C:\") ;-> wird ersetzt dur dich nächste line $UsrDrive = $objhd.Size $szDrive = "" + $UsrDrive $flen = Len($szDrive)-1 $dSize = "" Select Case $flen = 8 ; 100Gb $dSize = SubStr($szDrive,1,3)+"," + SubStr($szDrive,1,2) $Unit= "GByte" Case $flen = 7 ; 10GB $dSize = SubStr($szDrive,1,2)+"," + SubStr($szDrive,1,2) $Unit= "GByte" Case $flen = 6 ; 1GB $dSize = SubStr($szDrive,1,1)+"," + SubStr($szDrive,1,2) $Unit= "GByte" Case $flen = 5 ; 100MB $dSize = SubStr($szDrive,1,3)+"," + SubStr($szDrive,1,2) $Unit= "MByte" Case $flen = 4 ; 10MB $dSize = SubStr($szDrive,1,2)+"," + SubStr($szDrive,1,2) $Unit= "MByte" Case $flen = 3 $dSize = SubStr($szDrive,1,$flen) $Unit = "KByte" EndSelect $X = "Platz auf C:" $Y="$dSize $Unit" ;Gosub DISP ?"$X $Y" ------------------------- ders wird aber kein wert ausgegeben .. scheint so als könne er damit auch nicht rechnen .. Zitieren Link zu diesem Kommentar
Das Urmel 10 Geschrieben 4. August 2005 Melden Teilen Geschrieben 4. August 2005 bei $X erhältst du die Textausgabe, bei $Y gibts nicht, richtig? Dann schau dir mal die CASE Schleife an, die must du erweitern auf die von dir zu verarbeitende Stellenzahl, ist nämlich im Beispiel auf 8 gesetzt. :) Dein zweiter Fehler, in deiner For - Next im WMI, da hast du eh nur den letzten Wert drin, oder NULL wenn du im System CF- oder sonsige Cards hast, auch das sind Datenträger die durch WMI abgefragt werden. also in die FOR / Next Schleife den KIX-Code reinbasteln. Dein Dritter Fehler, KIX hat einen Debugger, hättest du den angeworfen wäre dir sehr fix aufgefallen dass die CASE Schleife schlicht nix macht - du fütterst nämlich mit mehr als 8 Stellen. Kannst du die Scripte nicht anpassen, dann kann ich dir wohl nicht weiterhelfen, denn ich weiss nicht was du letztlich haben möchtest. Möglich ist es aber - das VBS-Beispiel funktioniert läßt sich fix erweitern und du kannst die Compies im Netz damit abfragen, geht mit KIX IMHO wohl auch. Zitieren Link zu diesem Kommentar
snake 10 Geschrieben 4. August 2005 Autor Melden Teilen Geschrieben 4. August 2005 das ist richtg die ausgabe ist : "Platz auf C: $Unit" in den systemen gibt es immer nur eine platte .. das ganze script ist um einiges länger aber das wär jetzt zu lang zum anhängen das war nur das testscript .. bei der ausgabe von ?"Size: " + $objhd.Size kommt der richtige wert raus (40007761920) nach der übergabe von $objhd.Size zu $UsrDrive ($UsrDrive = $objhd.Size) steht aber nichts mehr in der $UsrDrive das bedeutet das ich nicht mal zur schleife komme kann dir gen meine kix32.exe schicken wenn du se nicht eh schon hast und es mal versuchen .... das ist ja das hauptproblem ich bekomm den wert 40007761920 einfach nicht in ne normale variable rein wenn das gehen würde könne ich einfach mit /1024/1024/1024 mit die GB zahl errechnen ... zu dem wie es aussehen soll: ich habe die variable $objhd.Size mit dem ihnalt (40007761920) daraus will ich eine ausgabe von 40 GB (bzw 37,5) je nach art der rechnung dewegen erscheint mir die art mit der division doch die einfachste .. wenn ich es schaffen kann mit dem wert $objhd.Size(40007761920) zu rechnen trozdem schon mal danke Zitieren Link zu diesem Kommentar
Das Urmel 10 Geschrieben 4. August 2005 Melden Teilen Geschrieben 4. August 2005 Hab mit das neue Kix besorgt, Version 2010 :) Auch hier ist Essig, damit Rechnen geht nicht. Zuweisen zu einer schon definierten Variable geht, Echo auch, nur direkt rechnen halt nicht - zu groß :D Also nur über Länge parsen wie im KIX-Script schon gezeigt. Oder du holst dir aus WMI die Geometrie-Werte der Platten, Head, Sektoren, Tracks und fängst an zu basteln; geht auch aber nu mag ich nicht mehr. Da bleibe ich doch lieber bei VBS - damit gehts wenigstens gleich wie im Beispiel. HtH Zitieren Link zu diesem Kommentar
snake 10 Geschrieben 4. August 2005 Autor Melden Teilen Geschrieben 4. August 2005 jep hast recht da geht das scheinbar schneller .. ich habs jetzt über substring gemacht .. $temp = SubStr ($objhd.Size,1,2) liest die ersten beiden zahlen aus .. = 40 auso 40 gb ich werd aber noch wenn es möglich ist ne schleife drum bauen das ich auch <100gb auslesen kann also dann $temp = SubStr ($objhd.Size,1,3) naja danke für deine hilfe ich werd mir das mit vbs aber noch genauer anschauen .... gruss snake Zitieren Link zu diesem Kommentar
Das Urmel 10 Geschrieben 4. August 2005 Melden Teilen Geschrieben 4. August 2005 ich werd aber noch wenn es möglich ist ne schleife drum bauen das ich auch <100gb auslesen kann Das machst du über die Länge der Zeichenkette wie schon gezeigt CASE 8 etc. Viel Erfolg. :) Zitieren Link zu diesem Kommentar
Empfohlene Beiträge
Schreibe einen Kommentar
Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.