Per Checkbox addieren / subtrahieren

  • Hallo zusammen,

    ich bräuchte mal euere Hilfe. Für die weitere Verarbeitung der Daten, benötige ich den Pfad wo sich die PST-Dateien befinden, der Name ist unwichtig.

    Die Pfade sollen der Reihe nach, zu einer bestehenden ini (ab Zeile 21) hinzugefügt werden.

    Mit dem Script lese ich die Pfade aus der Registry heraus. Es werden jedoch nur die zum Zeitpunkt registrierten PST-Dateien aufgelistet.

    Outlook_suche

    #include <Array.au3>

    #include <Date.au3>

    #include <File.au3>

    Local $s[15], $r[15], $ss[15], $rr[15]

    For $i = 1 To 15

    $s[$i] = RegEnumVal("HKEY_CURRENT_USER\Software\Microsoft\Office\16.0\Outlook\Search\", $i)

    ;$x[$i][0] = $s[$i]

    If @error <> 0 Then ExitLoop

    If $s = "" Then

    ContinueLoop

    EndIf

    Next

    For $i = 1 To 15

    $r[$i] = RegEnumVal("HKEY_CURRENT_USER\Software\Microsoft\Office\15.0\Outlook\Search\", $i)

    ;$x[$i][1] = $r[$i]

    If @error <> 0 Then ExitLoop

    If $r = "" Then

    ContinueLoop

    EndIf

    Next

    For $i = 1 To 15

    $ss[$i] = RegEnumVal("HKEY_CURRENT_USER\Software\Microsoft\Office\12.0\Outlook\Search\", $i)

    ;$x[$i][0] = $ss[$i]

    If @error <> 0 Then ExitLoop

    If $ss = "" Then

    ContinueLoop

    EndIf

    Next

    For $i = 1 To 15

    $rr[$i] = RegEnumVal("HKEY_CURRENT_USER\Software\Microsoft\Office\14.0\Outlook\Search\", $i)

    ;$x[$i][1] = $rr[$i]

    If @error <> 0 Then ExitLoop

    If $rr = "" Then

    ContinueLoop

    EndIf

    Next

    _ArrayAdd($s, $r + $ss + $rr)

    Local $aArrayUnique = _ArrayUnique($s) ; Use default parameters to create a unique array.

    ;_ArrayDisplay($aArrayUnique, "$aArray Unique") ; Display the unique array.

    $zz = UBound($aArrayUnique) - 1

    For $j = $zz To 1 Step -1

    If $aArrayUnique[$j] = "" or not FileExists($aArrayUnique[$j]) Then

    _ArrayDelete($aArrayUnique, $j)

    ElseIf FileExists($aArrayUnique[$j]) Then

    $aArrayUnique[$j] = $aArrayUnique[$j]

    Else

    ContinueLoop

    EndIf

    Next

    $ee = UBound($aArrayUnique) - 1

    $aArrayUnique[0] = $ee

    $sShortMonthName = _DateToMonth(@MON, $DMW_SHORTNAME)

    $yr = @YEAR

    $dy = @MDAY

    $Snow = _NowTime(5)

    $DT = $sShortMonthName & "_" & $dy & "_" & $yr & "," & $Snow

    FileWrite(@DesktopDir & "\PstOst.txt", $DT & @CRLF & "File PST/OST file locations." & @CRLF & @CRLF)

    For $t = 1 To UBound($aArrayUnique) - 1

    FileWrite(@DesktopDir & "\PstOst.txt", $aArrayUnique[$t] & @CRLF)

    Next

    _ArrayDisplay($aArrayUnique, "Outlook Current PST/OST", "0:" & $ee, 80)

    FileWrite(@DesktopDir & "\PstOst.txt", @CRLF & @CRLF)

    Exit

    Der Text ist wie folgt aufgebaut:

    C:\Users\MeineID\AppData\Local\Microsoft\Outlook\meine.mail@gmail.com.ost

    D:\Documents\Outlook-Dateien\iCloud Archive.pst

    D:\Ordner\Orner1\Ordner2\Outlook-Dateien\iCloud Archive1.pst

    F:\Ordner\iCloud Archive2.pst

    G:\Ordner\Ordner1\Ordner2\Ordner3\Outlook-Dateien\iCloud Archive3.pst

    C:\Users\MeineID\AppData\Local\Microsoft\Outlook\meine.mail1@gmail.com.ost

    Die ini sieht so aus.

    [Quellen]

    1=d:\Documents\Desktop

    2=d:\Documents

    21=

    22=

    usw.


    Mit folgendem Skript kann ich mir das Ergebnis anzeigen lassen, danach weis ich jedoch nicht weiter.

    Spoiler anzeigen

    #include<File.au3>

    #include <Array.au3>

    $pString = FileRead(@ScriptDir & "\PstOst.txt")

    $pPST = StringRegExp($pString, ".*pst", 3)

    ;~ MsgBox(64, "Ergebnis", $sString)

    _ArrayDisplay($pPST)

    Um auch die nicht registrierten PST-Dateien außerhalb Outlooks zu erkennen, verwende ich folgendes Skript.

    Spoiler anzeigen

    DirCreate(@ScriptDir & '\Outlook')

    RunWait(@ComSpec & " /c " & 'dir D:\*.pst /b /s >' & @ScriptDir & '\Outlook\Outlook.txt', "", @SW_HIDE)

    $file1txt = FileRead(@ScriptDir & '\Outlook\Outlook.txt', FileGetSize(@ScriptDir & '\Outlook\Outlook.txt'))

    $file1txtARRAY = StringSplit($file1txt, @CRLF, 1)

    For $i = 1 To $file1txtARRAY[0]

    Next

    Zusätzlich wäre hier noch die Frage, wie man verhindern kann das der gleiche Pfad mehrfach in die Ini geschrieben wird.

    Das Ganze sieht so aus:

    D:\Documents\Desktop\Ordner\Kontakte\Kontakte.pst

    D:\Documents\Outlook\Kopie von meinOrdner.pst

    D:\Documents\Outlook\Outlook1 - Kopie.pst

    D:\Documents\Outlook\Outlook1.pst

    D:\Documents\Outlook\Outlsend.to.com-00000006.pst

    D:\Documents\Outlook\Meine.pst

    D:\Documents\Outlook-Dateien\gmail.com.pst

    D:\Documents\Outlook-Dateien\iCloud Archive.pst

    Für euch wird das alles kein Problem sein, für mich „Newbie“, stellt das alles eine riesen Hürde dar.

    Fertiger Code ist herzlich willkommen.

    Grüße, Mitac

  • Hallo mitac100,

    Nur für den Fall. Wenn die nicht registrierten pst-Dateien im gleichen Ordner liegen, wie die registrierten pst-Dateien, dann brauchst du die Registry gar nicht auslesen und liest nur den Ordner aus. Dann hast du keine Dubletten.

    Andernfalls kannst du Dubletten z.B. verhindern, indem du mit IniReadSection alle Pfade aus der Ini holst und mit deinen neuen Pfaden abgleichst.

    RunWait(@ComSpec & " /c " & 'dir D:\*.pst /b /s >' & @ScriptDir & '\Outlook\Outlook.txt', "", @SW_HIDE)

    Das kannst du auch mit_FileListToArray erledigen und hast dann direkt dein Array.

    Grüße autoiter

  • Hallo,

    wie muss das Script erweitert werden damit alle Pfade gesplittet werden.

    Im Moment wird nur der letzte Pfad gesplittet.

    C:\Users\MeineID\AppData\Local\Microsoft\Outlook\meine.mail@gmail.com.ost

    D:\Documents\Outlook-Dateien\iCloud Archive.pst

    D:\Ordner\Orner1\Ordner2\Outlook-Dateien\iCloud Archive1.pst

    F:\Ordner\iCloud Archive2.pst

    G:\Ordner\Ordner1\Ordner2\Ordner3\Outlook-Dateien\iCloud Archive3.pst

    C:\Users\MeineID\AppData\Local\Microsoft\Outlook\meine.mail1@gmail.com.ost

  • Hallo autoiter,

    das bringt mich auch nicht weiter. Vielmehr stellt sich mir die Frage, wie muss die FOR/NEXT Schleife aussehen, damit alle Pfade gesplittet sind.

    Im Moment funktioniert das nur mit dem letzten Pfad.

    Nur zur Info. Ich bin ein Newbie was Coden angeht. Falls Du, oder jemand anders mir den Code bereitstellen würde, wäre ich sehr dankbar.

    Ist:

    C:\Users\MeineID\AppData\Local\Microsoft\Outlook\meine.mail@gmail.com.ost

    D:\Documents\Outlook-Dateien\iCloud Archive.pst

    D:\Ordner\Orner1\Ordner2\Outlook-Dateien\iCloud Archive1.pst

    F:\Ordner\iCloud Archive2.pst

    G:\Ordner\Ordner1\Ordner2\Ordner3\Outlook-Dateien\iCloud Archive3.pst

    C:\Users\MeineID\AppData\Local\Microsoft\Outlook\meine.mail1@gmail.com.ost

    Soll:

    C:\Users\MeineID\AppData\Local\Microsoft\Outlook

    D:\Documents\Outlook-Dateien

    D:\Ordner\Orner1\Ordner2\Outlook-Dateien

    F:\Ordner

    G:\Ordner\Ordner1\Ordner2\Ordner3\Outlook-Dateien

    C:\Users\MeineID\AppData\Local\Microsoft\Outlook

    Grüße mitac

    • Offizieller Beitrag

    Vielleicht so:

  • 1. Problem - Beim klicken des Radio Buttons erfolgt keine Aktivität. Über den Schalter "Ausgewählte..." klappt alles wunderbar. Was mache ich falsch?

    2. Wenn ich zwei Sticks angeschlossen habe und diese abwechselnd in die ini schreiben lasse, erhalte ich folgende FM: (312) : ==> Can not redeclare a constant

  • Hallo mitac100

    1. Problem - Beim klicken des Radio Buttons erfolgt keine Aktivität. Über den Schalter "Ausgewählte..." klappt alles wunderbar. Was mache ich falsch?

    Du wertest in der Schleife nur den Button $hStart aus. Also wird auch nur auf diesen reagiert..

    Du könntest etwa Case Else einfügen und hier mit _ArraySearch($chkboxes, $nMsg) prüfen, welches Radio-Control aktiviert wurde.

    2. Wenn ich zwei Sticks angeschlossen habe und diese abwechselnd in die ini schreiben lasse, erhalte ich folgende FM: (312) : ==> Can not redeclare a constant

    Dein Code hier ist offensichtlich nicht der Code, den du ausführst. Daher ist das schwer zu beantworten. SciTE zeigt dir aber die Fehlerzeile in deinem Skript an (312). Schau dort mal nach.

    Prinzipiell: Wenn du wie untenstehend eine Konstante deklarierst, kannst du das nicht später wiederholen oder die genutzte Variable (hier $sFilePath) im gleichen Gültigkeitsbereich erneut deklarieren (etwa Local $sFilePath).

    Local Const $sFilePath = (@ScriptDir & "\myBackup.ini")

    Grüße autoiter

  • Hallo autoiter,

    bei Punkt eins komme ich leider immer noch nicht weiter.

    Wenn ich _ArraySearch in den Code einbaue, erfolgt eine Dauer Meldung das „Kein Volume ausgewählt“ ist.

    Punkt zwei funktioniert.

    Aufgrund der Zeichen Beschränkung hatte ich den Code gekürzt, leider hat sich da ein Fehler eingeschlichen.

    myBackup_Restore_1.0.3.1.zip

  • Hallo mitac100,

    das liegt daran, dass du immer reagierst, wenn eine Checkbox nicht markiert ist..

    Code
    If _ArraySearch($chkboxes, $nMsg)  = -1 Then
        MsgBox(64, 'Info', 'Keine Volumes ausgewählt', 60, $hGUI)
    Else
    Local $sFilePath = (@ScriptDir & "\myBackup.ini")
        IniWriteSection($sFilePath, "Ziel", "1=" & $sCheckedDrives & "\myBackup_" & @UserName & "\")
        Local $aArray = IniReadSection($sFilePath, "Ziel")
        If Not @error Then
        ShellExecute("myBackup.ini")
        EndIf
    EndIf

    Das musst du umkehren. Probiere es mal so:

    Aus &= $sCheckDrives habe ich = $sCheckDrives gemacht. Es beinhaltet doch eh immer nur ein Radio, weil du $sCheckedDrives = '' ja immer leerst.

    Grüße autoiter