Laufwerksbuchstabe ermitteln und Anzahl dateien zählen

  • Hallo zusammen,

    ich bin neu in dieser Community und auch noch unerfahren im Umgang mit AutoIT.

    Trotzdem stehe ich vor eine recht (für mich) größen Aufgabe, die warscheinlich leicht zu lösen ist.

    Hier mein Szenario:

    Ich habe ein USB Token welcher 2 Laufwerke beinhaltet.
    1x eine gesicherte Partition, wo vom User weder Dateien geändert, gelöscht und hinzugefügt werden können.
    1x eine Read/Write Partition welche REMOVABLE heißt.

    Ich möchte nun auf der gesicherten Partition ein Script liegen haben, welches mir im aller ersten Step sagt welche Laufwerksbuchstabe das REMOVABLE von Windows zugewiesen bekommen hat.

    Im zweiten Step geht es mir darum, dass das Script alle Dateien und (auch aus Unterordnern) zählt und von jeder einzelnen Datei die größe angibt und diese zusammenrechnet.

    Im Dritten Step soll nun der errechnete Wert der Dateigröße mit einem Wert einer Testdatei verglichen werden. Die Textdatei liegt ebenfalls auf der gesicherten Partition.

    Wenn nun die Summe der Dateigröße unterschiedlich zu dem Wert in der Textdatei ist, soll ein Prozess mit namen xyz gekillt werden und eine MsgBox erscheinen, der eine Info ausgibt, dass die Größe der Dateien unterschiedlich ist und dann soll ein Command ausgeführt werden.

    Ich bitte euch um eure hilfe das Programm zu entwerfen.

    Vielen Dank für eure hilfreichen Tipps und Ratschläge.

    Gruß
    Frederik

  • so etwas in abgewandelter Form bastel ich um unsrere Setups zu prüfen....

    Zu dem Stick

    $var = DriveGetDrive( "REMOVABLE" )
    If NOT @error Then
    MsgBox(4096,"", "Found " & $var[0] & " drives")
    For $i = 1 to $var[0]
    MsgBox(4096,"Drive " & $i, $var[$i])
    Next
    EndIf

    listet dir alle "REMOVABLE" Devices

    vergleichen von Dateien anhand Version bzw. Größe

    [autoit]

    RunWait(@ComSpec & " /c dir c:\msi-setup /A:D /B /s >> c:\test.file","",@SW_HIDE)
    _FileReadToArray("c:\test.file", $file_dir)
    _ArraySort($file_dir)

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

    For $j=1 to UBound($file_dir,1)-1
    $dir=_StringSplit($file_dir[$j], '\', 1)
    If $dir[2]="common" then $search_dir=StringReplace($file_dir[$j],$msi_dir & "common",@CommonFilesDir)
    If $dir[2]="program files" then $search_dir=StringReplace($file_dir[$j],$msi_dir & "program files",@ProgramFilesDir)
    If $dir[2]="system" then $search_dir=StringReplace($file_dir[$j],$msi_dir & "system",@WindowsDir & "\system")
    If $dir[2]="system32" then $search_dir=StringReplace($file_dir[$j],$msi_dir & "system32",@WindowsDir & "\system32")
    If $dir[2]="windows" then $search_dir=StringReplace($file_dir[$j],$msi_dir & "windows",@WindowsDir)

    FileWriteLine($log,"##### " & $search_dir)

    $FileList=_FileListToArray($file_dir[$j],"*",1)
    If Not @Error=1 Or @error=4 Then ProgressOn (StringTrimLeft($file_dir[$j],12), "Bitte haben Sie etwas Geduld.....", "")
    ; MsgBox (0,"","No Files\Folders Found.")
    ; Exit
    ; EndIf

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

    _ArraySort($FileList)

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

    For $i=1 to UBound($FileList,1)-1

    If StringLeft($file_dir[$j],28) <> "c:\msi-setup\System32\Redist" Then

    If FileExists($search_dir & "\" & $FileList[$i]) Then
    $a=FileGetVersion($file_dir[$j] & "\" & $FileList[$i])
    If $a="0.0.0.0" Then $a=FileGetSize($file_dir[$j] & "\" & $FileList[$i])
    $b=FileGetVersion($search_dir & "\" & $FileList[$i])
    if $b="0.0.0.0" Then $b=FileGetSize($search_dir & "\" & $FileList[$i])
    If $a=$b Then
    FileWriteLine($log,$FileList[$i] & ": Version - " & $a & " ist identisch")
    ;MsgBox(0,"OK",$FileList[$i] & ": Version - " & $a & " ist identisch")
    Else
    FileWriteLine($log,"! Fehler: " & $FileList[$i] & " -Versionskonflikt- " & $a & " wird erwartet,Version " & $b & " vorgefunden.")
    ;MsgBox(0,"Fehler:",$FileList[$i] & " -Versionskonflikt- " & $a & " wird erwartet,Version " & $b & " vorgefunden.")
    EndIf
    Else
    FileWriteLine($log,"! Fehler: " & $FileList[$i] & "-" & FileGetVersion($file_dir[$j] & "\" & $FileList[$i]) & " nicht vorgefunden.")
    EndIf
    $percent=UBound($fileList,1)/100
    ProgressSet( $i/$percent , $i & " von " & UBound($FileList,1)-1 & " Dateien gefunden")
    Else
    EndIf

    Next
    ProgressOff()
    Next
    FileWriteLine($log,"########################################################################")

    [/autoit]

    So habe ich es bei mir gelöst, alle Ordnernamen ermitteln, dann je Ordner alle Dateien mit den installierten vergleichen, klau Dir das was Du gebrauchen kannst. :)

    Achtung Hitchhiker
    Bei mir habe ich nun das Problem das gleicher Version die Datei trotzdem unterschiedlich sein kann :(
    Wäre es schneller von beiden Dateien (entpackt und installiert) Version,Größe, Datum in je ein Array zu schreiben und die dann zu vergleichen ???

    Achtung Anfänger! :whistling:

    Betrachten des Quellcodes auf eigene Gefahr, bei Übelkeit,Erbrechen,Kopfschmerzen übernehme ich keine Haftung. 8o

  • Moin,

    Vielen Dank für deinen Code... Hat mir auf jedenfall für den Einstieg geholfen.
    Dies ist der Code den ich bislang für das Suchen der richtigen Laufwerke erstellt habe:

    [autoit]


    $varrem = DriveGetDrive( "REMOVABLE" )

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

    dim $REMOVABLE
    dim $CDROM
    dim $SPACE
    dim $DATEI

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

    ;Suche nach dem Laufwerk mit Namen REMOVABLE
    If NOT @error Then
    Do
    For $i = 1 to $varrem[0]
    $labr = DriveGetLabel($varrem[$i])
    $REMOVABLE = $varrem[$i]
    Next
    until $labr = ("REMOVABLE")
    EndIf
    ;Suche ende

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

    ;Suche nach CDROM von GIRITECH
    $CDROM = StringLeft (@ScriptDir, 2)
    ;Suche ende

    [/autoit]

    Nun habe ich jedoch noch das Problem, dass ich nicht weiß wie ich dem Programm sage, dass es alle Dateien aus dem ermittelten Laufwerk zählt und von jeder Datei die Größe ausgibt.

    Ich habe auch noch nicht so den Durchblick was den Code // Befehle von AutoIT angeht und daher weiß ich nicht, ob ich wa mit deinem Code anfangen kann.

    Hast du da noch eine kleine Erklärung zu?

    Danke und Gruß
    Frederik

  • [autoit]

    #include <array.au3>
    #include <File.au3>

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

    Dim $dir = "c:\intel"
    Dim $files
    Dim $byte=0

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

    RunWait(@ComSpec & " /c dir " & $dir & " /A:-D /B /s >> c:\test.file", "", @SW_HIDE)

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

    _FileReadToArray("c:\test.file", $files)
    _ArraySort($files)
    _ArrayDisplay($files)

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

    For $i = 1 To UBound($files, 1) - 1
    If FileExists($files[$i]) Then
    $byte = $byte + FileGetSize($files[$i])
    EndIf
    Next

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

    MsgBox(0,"Info:", "Anzahl: " & $files[0] & " Dateien" & @CRLF & "Gesamtgröße: " & $byte & " Bytes")

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

    Exit

    [/autoit]

    Funktioniert
    aber wie bekomme ich die Größe der Dateien in eine 2.Spalte, also Werte in der horizontalen einfügen.

    Achtung Anfänger! :whistling:

    Betrachten des Quellcodes auf eigene Gefahr, bei Übelkeit,Erbrechen,Kopfschmerzen übernehme ich keine Haftung. 8o

  • Sieht logisch aus ...tuts aber irgendwie nicht, er findet die Dateien nicht (array leer?)
    Die Anzahl hat er sich noch gemerkt. :)

    PS:

    [autoit]

    $files[$i][1] = FileGetSize($files[$i][0])

    [/autoit]

    Die Klammer am Ende fehlt

    Achtung Anfänger! :whistling:

    Betrachten des Quellcodes auf eigene Gefahr, bei Übelkeit,Erbrechen,Kopfschmerzen übernehme ich keine Haftung. 8o

  • Hi zusammen,

    ich danke euch für eure Hilfe!

    Habe grade das script fertiggestellt und es läuft...

    Hier nun noch der Code zum reinschauen und weiter verwenden ;)

    [autoit]


    #include <array.au3>
    #include <File.au3>

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

    $varrem = DriveGetDrive( "REMOVABLE" )
    $varcdr = DriveGetDrive( "CDROM" )

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

    dim $REMOVABLE
    dim $CDROM
    dim $SPACE
    dim $DATEI
    dim $byte=0
    Dim $MAINTAIN
    dim $MAINDATEI

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


    ;Suche nach dem Laufwerk mit Namen REMOVABLE
    If NOT @error Then
    Do
    For $i = 1 to $varrem[0]
    $labr = DriveGetLabel($varrem[$i])
    $REMOVABLE = $varrem[$i]
    Next
    until $labr = ("REMOVABLE")
    EndIf
    ;Suche ende

    ;Suche nach CDROM von GIRITECH
    $CDROM = StringLeft (@ScriptDir, 2)
    ;Suche ende

    RunWait(@ComSpec & " /c dir " & $REMOVABLE & " /A:-D /B /s >> c:\file.file", "", @SW_HIDE)

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

    _FileReadToArray("c:\file.file", $DATEI)
    _ArraySort($DATEI)

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

    For $j = 1 To UBound($DATEI, 1) - 1
    If FileExists($DATEI[$j]) Then
    $byte = $byte + FileGetSize($DATEI[$j])
    EndIf
    Next

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

    ;MsgBox(0,"Info:", "Anzahl: " & $DATEI[0] & " Dateien" & @CRLF & "Gesamtgröße: " & $byte & " Bytes")
    $MAINTAIN = FileOpen($CDROM &"file.file",0)
    if $MAINTAIN = -1 Then
    MsgBox(0,"Fehler"," Datei nicht gefunden")
    Exit
    EndIf

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

    While 1
    $char = FileRead($MAINTAIN)
    If @error = -1 Then ExitLoop
    ;MsgBox(0, "Gelesen:", $char)
    $MAINDATEI = $char
    Wend
    if $MAINDATEI <> $byte Then
    MsgBox(0,"Ungleich", "Wert Server: " & $MAINDATEI & " Wert Removable: " & $byte)
    Else
    msgbox(0,"OK","Die Werte sind gleich")
    EndIf
    FileClose($MAINTAIN)
    FileDelete("C:\File.file")

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

    Exit

    [/autoit]

    Viele Grüße und bis zum nächsten mal.
    Gruß
    Frederik