Speicher berechnen

  • Hallo,

    ich versuche über eine kombination von Batch und Autoit herauszufinden wie viel speicherplatz auf den Physikalischen Festplatten belegt ist. Für Batch habe ich mit hilfe von WMI bereits eine Methode die mir nur die Physikalischen Festplatten liefert keine USB, gemappte etc. Als ergebnis habe ich in etwa folgendes:

    Spoiler anzeigen

    Caption FreeSpace Size VolumeName

    C: 46044831744 137426010112

    E: 24855883776 62612733952 New Volume

    oder ich kann mir auch folgende Ergebnisse liefern lassen.

    Spoiler anzeigen

    46044831744

    24855883776

    Spoiler anzeigen

    137426010112

    62612733952

    jeweils in eine Textdatei.

    Das Problem ist, es ist nicht klar wie viele Partitionen/Festplatten vorhanden sind. Autoit soll also anhand dieser Informationen den belegten Speicherplatz berechnen bzw selbst ermitteln anhand der Laufweks-Buchstaben(CMD kann das leider nicht weil die Zahlenkette zu lang ist) und das Erbegnis in eine Textdatei schreiben. Sollte in diesem Fall z.B.

    129138028544 sein. Also belegter Speicherplatz C+E

    Wie macht man das am besten?

    Einmal editiert, zuletzt von mamcc (2. April 2008 um 09:16)

  • den rest solltest du eigendlich selber können :P

    [autoit]

    $drives = DriveGetDrive("FIXED")
    for $i = 1 to $drives[0]

    [/autoit][autoit][/autoit][autoit]

    $free = DriveSpaceFree($drives[$i])
    $total = DriveSpaceTotal($drives[$i])
    $free = StringSplit($free,".")
    $total = stringsplit($total,".")
    msgbox(0,"drives","space free: "&$free[1]&" mb"&@crlf&"space total: "&$total[1]&" mb")
    Next

    [/autoit]
  • Hallo danke für die hilfe ich habe von deinem Script eine lösung abgeleitet die mich fast zufrieden stellt.


    [autoit]

    #include <File.au3>
    $file = FileOpen("test.txt", 1)
    dim $drives
    _FileReadToArray("Diskinfo6.txt",$drives)

    [/autoit][autoit][/autoit][autoit]

    For $i = 1 to $drives[0]

    [/autoit][autoit][/autoit][autoit]

    $free = DriveSpaceFree($drives[$i])
    $total = DriveSpaceTotal($drives[$i])
    $belegt = ($total-$free)
    $free = StringSplit($free,".")
    $total = stringsplit($total,".")
    $belegt = stringsplit($belegt,".")

    [/autoit][autoit][/autoit][autoit]

    msgbox(0,"drives","belegt: "&$belegt[1]&" mb")

    [/autoit][autoit][/autoit][autoit]

    $file = FileOpen("test.txt", 1)
    ; Check if file opened for writing OK
    If $file = -1 Then
    MsgBox(0, "Error", "Unable to open file.")
    Exit
    EndIf

    [/autoit][autoit][/autoit][autoit]

    FileWrite($file, $belegt[1] & @CRLF)

    [/autoit][autoit][/autoit][autoit]

    Next

    [/autoit]


    Inhalt der Diskinfo6.txt ist:

    C:
    E:

    Aber wieso stehen in der test.txt 3 Angaben? Das dürfen doch nur zwei sein.

    • Offizieller Beitrag

    Du hast da ein paar Fehler in Deinem Script:

    - Zeile 2 kann weg

    - Zeilen 17 bis 22 vor die For-Schleife verschieben (ansonsten wird bei jedem Schleifendurchlauf FileOpen ausgeführt)

    - Hinter das Next ein FileClose setzen

    - Ich würde lieber Round statt StringSplit einsetzen

    Nun zu Deiner Frage: Sieh mal nach, ob in der "Diskinfo6.txt" eine Leerzeile hinter dem letzen Eintrag steht. Wenn ja, entferne diese!

  • Hey Super das funktioniert jetzt richtig gut

    [autoit]

    #include <File.au3>

    [/autoit][autoit][/autoit][autoit]

    dim $file
    dim $drives
    _FileReadToArray("Diskinfo6.txt",$drives)

    [/autoit][autoit][/autoit][autoit]

    ; Check if file opened for writing OK
    If $file = -1 Then
    MsgBox(0, "Error", "Unable to open file.")
    Exit
    EndIf
    $file = FileOpen("test.txt", 1)
    For $i = 1 to $drives[0]

    $free = DriveSpaceFree($drives[$i])
    $total = DriveSpaceTotal($drives[$i])
    $belegt = ($total-$free)
    $free = StringSplit($free,".")
    $total = stringsplit($total,".")
    $belegt = stringsplit($belegt,".")
    ;$belegt = Round($belegt,-0)
    FileWrite($file, $belegt[1] & @CRLF)
    Next
    FileClose($file)

    [/autoit]

    Leider habe ich gesehen das CMD in jede Textdatei noch eine Leerzeile einfügt wenn die Ausgabe in eine Textdatei umgeleitet wird. Gibt es mit Autoit eine Möglichkeit diese leeren Zeilen nicht auszuwerten? Oder einen Trick im Batch? Leider kann das nicht per Hand gemacht werden.

    • Offizieller Beitrag

    Ich habe das mal etwas geändert:

    [autoit]


    #include <File.au3>

    [/autoit][autoit][/autoit][autoit]

    dim $drives, $file

    [/autoit][autoit][/autoit][autoit]

    _FileReadToArray("Diskinfo6.txt",$drives)

    [/autoit][autoit][/autoit][autoit]

    If IsArray($drives) Then ; Test, ob $drives = Array
    $file = FileOpen("test.txt", 1)
    If $file = -1 Then ; Check if file opened for writing OK
    MsgBox(0, "Error", "Unable to open file.")
    Exit
    EndIf

    [/autoit][autoit][/autoit][autoit]

    For $i = 1 to $drives[0] - 1 ; das -1 wenn die Leerzeile am Ende eingefügt wird
    $free = DriveSpaceFree($drives[$i])
    $total = DriveSpaceTotal($drives[$i])
    $belegt = Round($total-$free)
    FileWrite($file, $belegt & @CRLF)
    Next

    [/autoit][autoit][/autoit][autoit]

    FileClose($file)
    EndIf

    [/autoit]
    • Offizieller Beitrag

    Hallo,

    so werden die Leerzeilen übergangen egal wo sie in der Datei sind!

    [autoit]

    #include <File.au3>

    [/autoit][autoit][/autoit][autoit]

    dim $drives, $file

    [/autoit][autoit][/autoit][autoit]

    _FileReadToArray("Diskinfo6.txt",$drives)

    [/autoit][autoit][/autoit][autoit]

    If IsArray($drives) Then ; Test, ob $drives = Array
    $file = FileOpen("test.txt", 1)
    If $file = -1 Then ; Check if file opened for writing OK
    MsgBox(0, "Error", "Unable to open file.")
    Exit
    EndIf

    [/autoit][autoit][/autoit][autoit]

    For $i = 1 to $drives[0]
    If (StringStripWS($drives[$i],8) = "") Then ContinueLoop ; Leerzeilen übergehen
    $free = DriveSpaceFree($drives[$i])
    $total = DriveSpaceTotal($drives[$i])
    $belegt = Round($total-$free)
    FileWrite($file, $belegt & @CRLF)
    Next

    [/autoit][autoit][/autoit][autoit]

    FileClose($file)
    EndIf

    [/autoit]
  • wird ja immer besser :). Jetzt ist nur noch eine Sache die mir noch Probleme macht. Wie rechne ich am besten die unbekannte Anzahl an Megabyte angaben zusammen? Macht es sinn das auf die selbe Weise wieder in ein Array zu lesen oder geht das auch einfacher?

    • Offizieller Beitrag

    Das geht einfacher:

    [autoit]


    #include <File.au3>

    [/autoit][autoit][/autoit][autoit]

    dim $drives, $file

    [/autoit][autoit][/autoit][autoit]

    _FileReadToArray("Diskinfo6.txt",$drives)

    [/autoit][autoit][/autoit][autoit]

    If IsArray($drives) Then ; Test, ob $drives = Array
    $file = FileOpen("test.txt", 1)
    If $file = -1 Then ; Check if file opened for writing OK
    MsgBox(0, "Error", "Unable to open file.")
    Exit
    EndIf
    $summe = 0
    For $i = 1 to $drives[0]
    If (StringStripWS($drives[$i],8) = "") Then ContinueLoop ; Leerzeilen übergehen
    $free = DriveSpaceFree($drives[$i])
    $total = DriveSpaceTotal($drives[$i])
    $belegt = Round($total-$free)
    $summe += $belegt
    FileWrite($file, $belegt & @CRLF)
    Next
    FileClose($file)
    MsgBox(0, '', $summe)
    EndIf

    [/autoit]