1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. Concara

Beiträge von Concara

  • HEX Zahlen die per Schleife erzeugt wurden in ein Array (Variable) schreiben

    • Concara
    • 14. Oktober 2021 um 12:11

    Hallo AspirinJunkie!

    Dieser Fehler ist dann aber im "Consolewrite" Befehl auch vorhanden.

    Oder sehe ich das falsch?

    AutoIt
    Local $iVal = 0xFFFFFFFF
    ConsoleWrite("$iVal = 0xFFFFFFFF" & @CRLF)
    ConsoleWrite('Dec("FFFFFFFF", 0) ............... = ' & Dec("FFFFFFFF", 0) & @CRLF)
    ConsoleWrite('Dec("FFFFFFFF") ............... = ' & Dec("FFFFFFFF") & @CRLF)
    ConsoleWrite("ConsoleWrite $iVal ............... = " & $iVal & @CRLF)

    Ergibt:

    $iVal = 0xFFFFFFFF

    Dec("FFFFFFFF", 0) ............... = 4294967295

    Dec("FFFFFFFF") ............... = -1

    ConsoleWrite $iVal ............... = -1

  • HEX Zahlen die per Schleife erzeugt wurden in ein Array (Variable) schreiben

    • Concara
    • 14. Oktober 2021 um 11:17

    Ich hätte auch noch eine Frage diesbezüglich.

    Kann mir jemand sagen warum Dec("FFFFFFFF") -1 ergibt?

  • HEX Zahlen die per Schleife erzeugt wurden in ein Array (Variable) schreiben

    • Concara
    • 14. Oktober 2021 um 11:14

    water hat mich darauf aufmerksam gemacht, dass meine Frage für andere Nutzer eventuell interessant sein könnte.

    Deshalb hier der CHAT Auszug:

    Concara Vor 17 Stunden

    Hallo hat jemand einen tipp wie ich HEX Zahlen in ein Array schreibe die ich mit einer Schleife generiere? $aArray[1] = 0xffffffff funktioniert aber wenn man es in einer schleifen mit $aArray[$i] = "0xFF" & Hex($i, 6) erstellt nicht



    468-495cafc1807a11db28735fdb6a7a16cbe98532b2.png

    Mars Vor 15 Stunden

    Je nachdem wofür die die "hexzahlen" verwenden willst musst du eine Typumwandlung durchführen. "0xFF" & Hex($i, 6) ergibt einen String, 0xffffffff ergibt ein Integer. Ich weiß ja nicht was du machen willst. Probier mal Int('0xFF' & Hex($i, 6))



    813-726d56c5f162877ec21ceea557692e793dc23143.png

    Musashi Vor 15 Stunden

    #include <Array.au3>

    Local $aHexValues[0]

    For $i = 1 To 1024

    _ArrayAdd($aHexValues, "0xFF" & Hex($i, 6))

    Next

    _ArrayDisplay($aHexValues)



    632-05648137265b9a3f2343ddd4c0ae863a4a718193.png

    Bitnugger Vor 15 Stunden

    #include <Array.au3>

    Local $aHexValues[1025]

    For $i = 0 To 1024

    $aHexValues[$i] = Ptr($i)

    Next

    ConsoleWrite('$aHexValues[99] = ' & $aHexValues[99] & @CRLF)

    _ArrayDisplay($aHexValues)



    509-d163c19b0e98589151a292013422e68693a0cb23.jpg

    Concara Vor 15 Stunden

    Wie Mars schon geschrieben hat so wie Musashi und Bitnugger es gemacht haben. So eine ähnliche schleifen habe ich auch in Verwendung. Danke Mars für den Hinweis, dass Hexzahlen im Array Integer sind. Damit funktioniert es wunderbar.
    509-d163c19b0e98589151a292013422e68693a0cb23.jpg

    Concara Vor 15 Stunden

    $i = Dec("FFFFFF")

    Local $aArray[4][2]

    $aArray[0][0] = 0xFFFFFFFF

    $aArray[0][1] = "0xFFFFFFFF"

    $aArray[1][0] = Int('0xFF' & Hex($i, 6))

    $aArray[1][1] = '0xFF' & Hex($i, 6)

    $i = Dec("FFAAFF")

    $aArray[2][0] = 0xFFFFAAFF

    $aArray[2][1] = "0xFFFFAAFF"

    $aArray[3][0] = Int('0xFF' & Hex($i, 6))

    $aArray[3][1] = '0xFF' & Hex($i, 6)

    _ArrayDisplay($aArray)
    509-d163c19b0e98589151a292013422e68693a0cb23.jpg

    Concara Vor 15 Stunden

    ...Wie Mars schon geschrieben hat so wie Musashi und Bitnugger es gemacht haben sind es auch Strings im Array.
    632-05648137265b9a3f2343ddd4c0ae863a4a718193.png

    Bitnugger Vor 12 Stunden

    Ein Ptr ist definitiv kein String... und was wie mit _ArrayDisplay angezeigt wird, ist eine völlig andere Sache.



    813-726d56c5f162877ec21ceea557692e793dc23143.png

    Musashi Vor 12 Stunden

    Concara : Prüfe einfach mal

    Local $iVal = 1024

    ConsoleWrite("VarTyp $iVal ............... = " & VarGetType($iVal) & @CRLF)

    ConsoleWrite("VarTyp Ptr($iVal) ........... = " & VarGetType(Ptr($iVal)) & @CRLF)

    ConsoleWrite("VarTyp '0xFF' & Hex($iVal, 6) = " & VarGetType("0xFF" & Hex($iVal, 6)) & @CRLF)



    509-d163c19b0e98589151a292013422e68693a0cb23.jpg

    Concara Vor 2 Stunden

    Danke euch beiden. Sorry Bitnugger das ich das mit dem Pointer übersehen habe. Laut Wiki ist das nur was für Profis und der bin ich definitiv nicht. @Musashi VarGetType kannte ich noch nicht, ich hoffe ich merke es mir für die Zukunft. Wie MARS schon geschrieben hat speichert Autoit HEX Zahlen in Variabel (Arrays) als Integer somit hat der Code den er geschrieben hat Int('0xFF' & Hex($i, 6)) funktioniert.
    815-f77a182c7065f84012b6a44f74f14ca29a405c0a.jpg

    water Vor 24 Minuten

    Concara So von Ösi zu Ösi. Wenn ich mir die SB so ansehe, dann vermute ich, dass dieses Thema besser in einem eigenen Thema aufgehoben wäre. Dann hätten auch andere Benutzer zukünftig was davon. Aus der SB verschwindet die Diskussion und das erarbeitete Ergebnis sehr schnell wieder.

  • sql Einlesen einer Dateistruktur, wie gelöschte Dateien ermitteln?

    • Concara
    • 22. September 2021 um 09:29

    BugFix

    Danke für deinen Hinweis und das Code Beispiel!

    Das kann ich sicher noch in einem anderen Projekt gebrauchen.

    Da ich aber nichts weiter als die Datenstruktur ( Laufwerksbuchstabe, Ordner, Dateiname, Endung) erfasse ist es mir egal ob der gleiche Datensatz wieder "aktiviert" wird.

    Sprich die Routine die ich eben noch nicht habe sollte dann das Löschen Flag (in meinem Fall die Kill Spalte) von 1 auf 0 setzen.

    Bei Dateien würde ich anstatt deiner UniqueID den Hashwert der Datei heranziehen.

    Dadurch könnte man auch wiederhergestellte, gleiche Dateien (z.B: Windows Papierkorb) erkennen.

  • sql Einlesen einer Dateistruktur, wie gelöschte Dateien ermitteln?

    • Concara
    • 21. September 2021 um 18:06

    Hallo Moombas!

    Mir geht es darum es per SQL zu lösen, da dies "nur" ein Versuchsprojekt ist. (Ursprünglicher gedacht als schneller Index für eine statische Webseite)

    Also mehr ums Datenbank Design im Zusammenspiel mit der praktischen Anwendung in AutoIT.

    Mir gefällt die Idee des Flaggens. Dazu habe ich in meiner Tabelle die Spalte Kill.

    Beim Insert fülle ich diese mit einer 0 und wenn eben ein Datei gelöscht wurde sollte diese Spalte auf 1 gesetzt werden.

    Damit alles möglichst platzsparend ist, habe ich in der Datentabelle (IndexDB) einen Unique Index erstellt der verhindert, dass beim erneuten Einlesen die Daten mehrfach in die Tabelle geschrieben wird.

    Also Neue werden in die Tabelle geschrieben.

    Gelöschte Dateien müsste man eben Altstand mit Iststand vergleichen und dann das Flag setzen.

    Ich habe in meinem Programm ein Array mit dem Iststand und würde jetzt die Datenbank in ein Array auslesen und diese beiden Vergleichen.

    Ich hatte mir nur gedacht, ob es eventuell auch eine Möglichkeit gibt, dass sql(ite) das in der Datenbank bewerkstelligen kann.

    Eben keine Ahnung eventuell über einen Trigger, Temptable oder ...?

  • sql Einlesen einer Dateistruktur, wie gelöschte Dateien ermitteln?

    • Concara
    • 21. September 2021 um 09:26

    Hallo!

    Ich möchte einen Dateiindex per Sqlite von verschiedenen Laufwerken erstellen.

    Dazu lese ich die Dateien per DOS Befehl dir in eine Sqlite Datenbank ein.

    Das funktioniert nach einigem experimentieren recht gut und schnell.

    Mein Problem ist jetzt, dass ich gelöschte Dateien flaggen will. ( Ich hoffe das schreibt man so!?)

    Dazu habe ich mir folgende zwei Methoden vorgestellt.

    1.) Ich lese alle Dateien für ein Laufwerk aus in ein Array und und prüfe sie mit "If FileExists". Ich denke das wird aber recht langsam sein.

    2.) Ich importiere die Daten in die "echt" Tabelle und zusätzlich in eine temporäre Tabelle und vergleiche beide dann.

    Bei dieser Variante weiß ich allerdings noch nicht genau wie. Aber ich denke das lässt sich machen. :/

    Hat jemand von euch eine Idee oder einen konkreten Lösungsvorschlag? :Glaskugel:

    Hier meine Datenbank Struktur:

    Der Inhalt kann nicht angezeigt werden, da er nicht mehr verfügbar ist.

  • emulierte Tastatureingabe eines RFID-Scanners in Variable schreiben

    • Concara
    • 16. September 2021 um 15:07

    Der RFID Scanner ist doch "sicher" per COM Port angeschlossen!?

    Also hast du sehr wahrscheinlich schon ein Programm das diese Eingabe in den Editor erst ermöglicht?

    Ich denke es wird ein Testprogramm vom Hersteller des Scanners sein?

    Wie wäre es wenn du den COM Port direkt ausliest.

    Hier ein Link zu einer UDF für COM Port

    Serial port UDF / COM port UDF
    Hi heres another UDF for the serial port. It is very similar to CommAPI using kernel32.dll, but all code is packed into a single file without any dependencies,…
    www.autoitscript.com
  • list folders by Creation date

    • Concara
    • 16. September 2021 um 14:37
    Zitat von Musashi

    Bitte nicht Cross-Posten (oder zumindest darauf verweisen).

    (Please do not cross-post - at least refer to it)

    https://www.autoitscript.com/forum/topic/20…-creation-date/

    Ich wusste nicht, dass das deutsche Forum jetzt auch schon mit dem Englischen "zusammen arbeitet".

    Früher hat es immer geheißen wir sind ein deutsches Forum also schreibt auch die Fragen in deutsch.

    Meine Meinung:

    Mir ist englisch auch recht. Das macht den deutschsprachigen Raum nicht so unsympathisch.

    Damit können auch Leute aus anderen Staaten was anfangen.

    Allerdings könnte man dann gleich alles im englischen Forum behandeln und bräuchte kein deutsches.

    Water hat es im englischen Forum schon beschrieben wie man es in Autoit umsetzen kann.

    Wenn man nicht viel programmieren will, würde es mit dem dir Befehl in DOS auch rasend schnell gehen.

    dir "C:\Windows\temp" /s /b /a:d /o:-d > c:\temp\%date%.txt

    Jeden Tag die Datei erstellen und z.B: mit Notpad++ Compare vergleichen.

    Außerdem könnte man mit Autoit die erstellte Datei einlesen oder direkt die Ausgabe per StdoutRead einlesen.

    _FileListToArrayRec ist bei vielen Dateien recht langsam.

    Wie es ist, wenn man nur die Ordner benötigt, habe ich noch nie getestet.

  • Mit Autoit selbst erstelltes Programm veröffentlichen - Vorgehensweise

    • Concara
    • 14. September 2021 um 16:37

    Hallo!

    Deine Frage bezüglich Lizenz sollte ja geklärt sein.

    Als Tipp sei vielleicht erwähnt, dass du dein Software eventuell digital signieren solltest (sofern du ein offizielles Zertifikat für codesigning hast) und beim kompilieren
    solltest du alle Felder "Resource Update" ausfüllen.

    Eventuell selber noch welche hinzufügen. (Siehe Bild)

    Tidy und Au3Stripper über das Script laufen lassen kann auch Sinnvoll sein.

    Je nach dem wie komplex dein Programm ist, kann das allerdings zu Problemen führen.

    Resource_Update.jpg

  • Wie markiere ich den ersten von mehreren identischen Begriffen in einer Excel- bzw. Textdatei - mit Regex, AutoIT?

    • Concara
    • 26. August 2021 um 10:35

    Hi!

    Hier ein Codebeispiel, wenn du eine Textdatei hast.

    Trennzeichen ist " " (Leerzeichen)

    $iGesuchteSpalte = 1 (Achtung Array startet bei 0 also 1 wäre die 2 Spalte (B) im Vergleich zu Excel)

    $iAnzahlanSpalten = 2 (mit dem Datensatz von oben gibt es ja nur 2 Spalten ich nehme aber an in deinen echt Daten hast du mehr Spalten)

    Code: Datensatz.txt
    12 Wasser
    14 Milch
    38 Wein
    32 Wein
    14 Wasser
    5 Bier
    41 Wein
    6 Bier
    9 Milch
    33 Milch
    AutoIt
    #include <File.au3>
    #include <Debug.au3>
    #include <Array.au3>
    Local $sDatenDatei = "datensatz.txt"
    Local $sTrennzeichen = " "
    Local $iGesuchteSpalte = 1
    Local $iAnzahlanSpalten = 2
    Local $sMarkierungszeichen = "#"
    
    Local $i, $ii, $iii, $iZaehler = 0, $iSpalten
    Local $aDaten, $aTemp, $aUniqe
    Local $aGesuchte[1][$iAnzahlanSpalten]
    Local $aDaten2d[1][$iAnzahlanSpalten]
    
    _FileReadToArray($sDatenDatei, $aDaten)
    ReDim $aDaten2d[UBound($aDaten)][$iAnzahlanSpalten]
    For $i = 1 To UBound($aDaten) - 1
        $aTemp = StringSplit($aDaten[$i], $sTrennzeichen)
        For $ii = 1 To UBound($aTemp) - 1
            $aDaten2d[$i][$ii - 1] = $aTemp[$ii]
        Next
    Next
    _DebugArrayDisplay($aDaten2d, "Daten im 2d Array")
    $aUniqe = _ArrayUnique($aDaten2d, $iGesuchteSpalte, 1)
    _DebugArrayDisplay($aUniqe, "Suchbegriffe")
    $iSpalten = UBound($aTemp) - 1
    For $i = 1 To UBound($aUniqe) - 1
        For $ii = 1 To UBound($aDaten2d) - 1
            If $aDaten2d[$ii][$iGesuchteSpalte] = $aUniqe[$i] Then
                $aDaten2d[$ii][$iGesuchteSpalte] = $sMarkierungszeichen & $aDaten2d[$ii][$iGesuchteSpalte]
                $iZaehler += 1
                ReDim $aGesuchte[$iZaehler + 1][$iSpalten]
                For $iii = 0 To $iSpalten - 1
                    $aGesuchte[$iZaehler][$iii] = $aDaten2d[$ii][$iii]
                Next
                ExitLoop
            EndIf
        Next
    Next
    _DebugArrayDisplay($aDaten2d, "Markiert")
    _DebugArrayDisplay($aGesuchte, "Gesuchte")
    Alles anzeigen
  • Denkanstoß gesucht.

    • Concara
    • 25. August 2021 um 14:43

    Hi!

    Freut mich, dass ich dir helfen konnte.

    Hier noch eine ältere Version wo die _einlesen Funktion noch den Fehler hatte, dass wenn im ersten Ordner keine PDF Datei lag, dass die anderen Ordner ignoriert wurden.

    (Der Fehler war, das wenn das $aOrdnerProjektnummer1 Array eben kein Array ist (keine PDFs im Ordner1 kein Array), dann verbindet die Funktion _ArrayConcatenate die Arrays nicht.

    Warum stell ich diese Version noch rein.

    Ganz einfach, weil ich diese Kommentiert habe.

    Und die sollte dir die Funktionsweise näher bringen.

    Also falls du noch Interesse hast etwas über die Funktionsweise zu erfahren dann schau sie dir an.

    Spoiler anzeigen
    AutoIt
    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <File.au3>
    #include <Array.au3>
    
    ;~ ;ZumTeste werden die Ordner angelegt
    ;~ For $i = 1 To 4
    ;~     DirCreate(@ScriptDir & "\o" & $i)
    ;~ Next
    ;~ DirCreate(@ScriptDir & "\a")
    ;~ ;Zum Testen werden "pdf" Dateien angelegt
    ;~ For $i = 1 To 4
    ;~     $iRand = Int(Random(100000, 999999))
    ;~     FileCopy(@ScriptDir & "\1.pdf", @ScriptDir & "\" & $iRand & "_was auch immer.pdf", "")
    ;~     FileCopy(@ScriptDir & "\2.pdf", @ScriptDir & "\asdf ded" & $iRand & "_was auch immer.pdf", "")
    ;~ Next
    
    ;GUI erstellen
    Local $hGUI = GUICreate("Dokument erstellen", 280, 225, 180, 122)
    ;Label erstellen
    Local $idLabel1 = GUICtrlCreateLabel("Bitte Projektnummer eingeben:", 16, 11, 148, 17)
    Local $idLabel6 = GUICtrlCreateLabel("Bitte Dateinamen eingeben:", 16, 163, 135, 17)
    ;Inputs erstellen
    Global $sOrdner1 = @ScriptDir & "\o1"
    Global $sOrdner2 = @ScriptDir & "\o2"
    Global $sOrdner3 = @ScriptDir & "\o3"
    Global $sOrdner4 = @ScriptDir & "\o4"
    Global $sAusgabeordner = @ScriptDir & "\a"
    Global $idprojnr = GUICtrlCreateCombo("", 168, 8, 97, 21)
    Local $idDateiname = GUICtrlCreateInput("ausgabe.pdf", 168, 160, 97, 21)
    ;Buttons erstellen
    Local $ideinlesen = GUICtrlCreateButton("Neueinlesen", 16, 184, 70, 33)
    Local $idstart = GUICtrlCreateButton("Start", 86, 184, 70, 33)
    Local $idclose2 = GUICtrlCreateButton("Abbrechen", 156, 184, 70, 33)
    ;Gui starten
    _einlesen() ; Alle Vier Ordner werden eingelesen und die Projektnummern aus den Dateinamen ausgelesen
    GUISetState(@SW_SHOW, $hGUI)
    ;Loop bis Abbrechen geklickt wird
    While 1
        Switch GUIGetMsg()
            Case $GUI_EVENT_CLOSE, $idclose2
                ExitLoop
            Case $idstart
                $projektnr = GUICtrlRead($idprojnr) ;Inputfeld mit der Projektnummer wird eingelesen
                $ausgabenamen = GUICtrlRead($idDateiname) ;Inputfeld mit dem Ausgabedateinamen wird eingelesen
                If $projektnr <> "" And $ausgabenamen <> "" Then ;Wenn eines der Oben ausgelesen Felder keinen Wert enthält wird eine Meldung ausgegeben
                    If FileExists($sAusgabeordner & "\" & GUICtrlRead($idDateiname)) = 0 Then ; Falls die Ausgabedatei schon existiert wird eine Meldung ausgegeben
                        $aRun = _Ausgabe($projektnr, $ausgabenamen) ;Ausgelesene Werte werden der Funktion _Ausgabe übergeben, die ein Array zurückgibt mit den PDF Dateien samt Ordnername Array 0 basierend Array[0] entspricht Ordner1
                        Local $sAusgabeString = 'C:\Program Files (x86)\Patches\qpdf-10.3.2\bin\qpdf.exe --empty --pages '; Stringerstellung damit das externe Programm mit allen Parametern gestartet werden kann
                        For $iii = 0 To 3; Array Schleife 0 bis 3
                            If $aRun[$iii] <> "" Then; enthält das Array einen Wert dann
                                ;$sAusgabeString &= '"' & $aRun[$iii] & '" 'ist das gleiche wie $sAusgabeString = $sAusgabeString & '"' & $aRun[$iii] & '" ' fügt also der bestehenen $sAusgabeString ein " + den Inhalt vom $aRun Array + " hinzu
                                ;Also alle Ordner die eine PFD Datei enthalten mit der gesuchten Projektnummer
                                $sAusgabeString &= '"' & $aRun[$iii] & '" '
                            EndIf
                        Next
                        $sAusgabeString &= "-- " & $sAusgabeordner & "\" & GUICtrlRead($idDateiname); Der Ausgabe Ordner wird dem String hinzugefügt
                        RunWait($sAusgabeString); AusgabeString wird gestartet
                        ;z.B: C:\Program Files (x86)\Patches\qpdf-10.3.2\bin\qpdf.exe --empty --pages "C:\PDFverbinden\ordner1\485726_was auch immer.pdf" "C:\PDFverbinden\ordner3\485726_was auch immer.pdf" -- C:\PDFverbinden\ausgabe\ausgabe5.pdf
                        ConsoleWrite($sAusgabeString & @CRLF)
                        ;Löschen
                        If FileExists($sAusgabeordner & "\" & GUICtrlRead($idDateiname)) = 1 Then; wenn die ausgabe erstellt wurde, dann werden die Dateien gelöscht. Hirzu wird das Array durchlaufen und wenn es einen Ordner + Dateinamen enthält dieser gelöscht
                            For $iii = 0 To 3
                                If $aRun[$iii] <> "" Then
                                    FileDelete($aRun[$iii])
                                EndIf
                            Next
                        EndIf
                        _einlesen(); Damit die Projektnummer(n) in der Gui aktualliesiert werden wird die _einlesen() Funktion gestartet
                    Else
                        MsgBox(0, "Info", "Ausgabedatei existiert schon. Geben sie bitte einen anderen Namen ein", 0, $hGUI)
                    EndIf
                Else
                    MsgBox(0, "Info", "Keine Projektnummer ausgewählt oder kein Ausgabenamen angegeben.", 0, $hGUI)
                EndIf
            Case $ideinlesen
                _einlesen()
        EndSwitch
    WEnd
    
    Func _einlesen()
        $aOrdnerProjektnummern1 = _FileListToArray($sOrdner1, "*.pdf") ; Dateien mit der Endung .pdf werden im 1 Ordner eingelesen (nur Dateinamen)
        _ArrayDelete($aOrdnerProjektnummern1, 0) ; Da _FileListToArray Funktion in das Array[0] die Anzahl der gefundenen Dateien schreibt, wird dieser Wert gelöscht da er in der weiteren Verarbeitung stören würde
        $aOrdnerProjektnummern2 = _FileListToArray($sOrdner2, "*.pdf") ; Dateien mit der Endung .pdf werden im 2 Ordner eingelesen
        $aOrdnerProjektnummern3 = _FileListToArray($sOrdner3, "*.pdf") ; Dateien mit der Endung .pdf werden im 3 Ordner eingelesen
        $aOrdnerProjektnummern4 = _FileListToArray($sOrdner4, "*.pdf") ; Dateien mit der Endung .pdf werden im 4 Ordner eingelesen
        _ArrayConcatenate($aOrdnerProjektnummern1, $aOrdnerProjektnummern2, 1) ;Arrays werden zusammengefügt bei der Funktion _ArrayConcatenate gibt es die Möglichkeit anzugeben ab welchem Arrayeintrag verbunden werden soll
        ;array[0] wird nicht benötigt deshalb wird erst ab array[1] zusammengefügt
        _ArrayConcatenate($aOrdnerProjektnummern1, $aOrdnerProjektnummern3, 1)
        _ArrayConcatenate($aOrdnerProjektnummern1, $aOrdnerProjektnummern4, 1) ; $aOrdnerProjektnummern1 enthält jetzt alle Dateinamen von allen 4 Ordnern.
        Local $aOrdnerProjektnummern = _ArrayUnique($aOrdnerProjektnummern1) ; Das könnte man sich sehr wahrscheinlich sparen, da die Dateinamen in den einzelnen Ordnern sicherlich nicht den Gleichen Namen besitzen, falls doch werden hier doppelte Namen aus dem Array entfernt
        _Projektnummer_auslesen($aOrdnerProjektnummern) ; Aus den Ordnernamen werden die Projektnummer herausgesucht Array mit den Ordnernamen wird der Funktion _Projektnummer_auslesen übergeben
    EndFunc   ;==>_einlesen
    
    Func _Projektnummer_auslesen($aProjekt)
        Local $i
        Local $sProjektID
        GUICtrlSetData($idprojnr, "") ; GUICtrlCreateCombo Einträge werden gelöscht
        If IsArray($aProjekt) Then    ;Falls die Variable $aProjekt kein Array ist wird ein Fehler ausgegeben
            For $i = 1 To UBound($aProjekt) - 1 ;Schleife die das Array durchläuft UBound ermittelt die Anzahl der im array enthaltenen Werte ( Achtung 0 basierend deshalb - 1)
                Local $aArray = StringRegExp($aProjekt[$i], "(\d{6})", 3) ; (\d{6}) findet alle 6 stelligen Nummer im angegeben String
                If Not @error Then ; Findet StringRegExp nichts geht es mit dem nächsten Wert weiter
                    If Not StringInStr($sProjektID, $aArray[0]) Then ; Filtert doppelte Projektnummern aus
                        $sProjektID &= $aArray[0] & "|" ; $sProjektID enthält den String mit den Projektnummern damit man ihn im nächsten Schritt an das Combofeld übergeben kann
                    EndIf
                EndIf
            Next
            GUICtrlSetData($idprojnr, $sProjektID, StringLeft($aProjekt[1], 6)) ; Das Combofeld wird befüllt
        Else
            Return SetError(1, 0, "")
        EndIf
    EndFunc   ;==>_Projektnummer_auslesen
    
    Func _Ausgabe($sProjektIDAusgabe, $sAusgbenamen)
        Local $aAusgabe[4]
        $aOrdner1 = _FileListToArray($sOrdner1, "*.pdf", 0, True) ; Dateien mit der Endung .pdf werden im 1 Ordner eingelesen inklusive Dateipfad
        $aAusgabe[0] = _Projektnummer_in_Ordner_finden($aOrdner1, $sProjektIDAusgabe) ;Die übergebene Projektnummer wird im 1 Ordner gesucht und wenn gefunden wird der Dateipfad + Dateiname in das Array geschrieben
        $aOrdner2 = _FileListToArray($sOrdner2, "*.pdf", 0, True) ; Dateien mit der Endung .pdf werden im 2 Ordner eingelesen inklusive Dateipfad
        $aAusgabe[1] = _Projektnummer_in_Ordner_finden($aOrdner2, $sProjektIDAusgabe) ;Die übergebene Projektnummer wird im 2 Ordner gesucht und wenn gefunden wird der Dateipfad + Dateiname in das Array geschrieben
        $aOrdner3 = _FileListToArray($sOrdner3, "*.pdf", 0, True) ; Dateien mit der Endung .pdf werden im 3 Ordner eingelesen inklusive Dateipfad
        $aAusgabe[2] = _Projektnummer_in_Ordner_finden($aOrdner3, $sProjektIDAusgabe) ;Die übergebene Projektnummer wird im 3 Ordner gesucht und wenn gefunden wird der Dateipfad + Dateiname in das Array geschrieben
        $aOrdner4 = _FileListToArray($sOrdner4, "*.pdf", 0, True) ; Dateien mit der Endung .pdf werden im 4 Ordner eingelesen inklusive Dateipfad
        $aAusgabe[3] = _Projektnummer_in_Ordner_finden($aOrdner4, $sProjektIDAusgabe) ;Die übergebene Projektnummer wird im 4 Ordner gesucht und wenn gefunden wird der Dateipfad + Dateiname in das Array geschrieben
        Return $aAusgabe
    EndFunc   ;==>_Ausgabe
    
    Func _Projektnummer_in_Ordner_finden($aOrdner, $sProjektIDAusgabe)
        If IsArray($aOrdner) Then ;Falls die Variable $aOrdner kein Array ist wird ein Fehler ausgegeben
            For $ii = 1 To UBound($aOrdner) - 1 ;Schleife die das Array durchläuft UBound ermittelt die Anzahl der im array enthaltenen Werte ( Achtung 0 basierend deshalb - 1)
                ;If StringInStr($aOrdner[$ii], $sProjektIDAusgabe) <> 0 Then;Das übergebene Array mit den Dateipfad + Dateiname wird nach der Projektnummer durchsucht
                ; ACHTUNG enthaltet der  Pfadnamen auch eine mindestens 6 stellige Nummer und stimmt die mit der Projektnummer überein, wird dieser auch als gültig erachtet
                ; z.b: C:\123456\Ordner1\ProjektNr567890.pdf die übergebene Projektnummer lautet 123456, dann wird C:\123456\Ordner1\ProjektNr567890.pdf dem Array hinzugefügt
                ;besser -->
                ;$aOrdner[$ii] = C:\Programme\pdfverbinden\Ordner1\test654321.pdf
                ;StringTrimLeft($aOrdner[$ii], StringInStr($aOrdner[$ii], "\", Default, -1)) Holt aus dem Pfad + Dateinamen den Dateinamen heraus. Dazu durchsucht StringInStr von rechts ( Parameter -1) den String nach \
                ; der Rückgabewert ist die Position innerhalb des Strings. Diese wird genutzt um den String an dieser "abzuschneiden" --> StringTrimLeft macht das und es bleibt nur mehr der Dateiname übrig.
                ; z.B:  StringInStr("C:\Programme\pdfverbinden\Ordner1\test654321.pdf", "\", Default, -1) findet \ --> Ordner1\test654321.pdf
                ;StringTrimLeft("C:\Programme\pdfverbinden\Ordner1\test654321.pdf", StringInStr("C:\Programme\pdfverbinden\Ordner1\test654321.pdf", "\", Default, -1)) entfernt C:\Programme\pdfverbinden\Ordner1\
                If StringInStr(StringTrimLeft($aOrdner[$ii], StringInStr($aOrdner[$ii], "\", Default, -1)), $sProjektIDAusgabe) <> 0 Then ;StringInStr("C:\Programme\pdfverbinden\Ordner1\test654321.pdf", 654321) --> gefunden 654321 -- Ausgabewert ist größer 0
                    Return ($aOrdner[$ii]) ;C:\Programme\pdfverbinden\Ordner1\test654321.pdf wird zurück gegeben
                EndIf
            Next
        EndIf
        Return SetError(1, 0, "")
    EndFunc   ;==>_Projektnummer_in_Ordner_finden
    Alles anzeigen

    Als Tip kann ich nur sagen, dass es immer sehr viel bringt, einzelne Codezeilen in der Console auszugeben, um die Fuktionsweise zu überblicken bzw. den Rückgabewert zu erhalten.

    z.b: ConsoleWrite( StringInStr(StringTrimLeft($aOrdner[$ii], StringInStr($aOrdner[$ii], "\", Default, -1)), $sProjektIDAusgabe) )

    Was mich auch immer wieder erstaunt, dass das Tool "Tidy AutoIT Source" so wenig benützt wird. Sofern man den offiziellen SciTE Editor als Programmierumgebung verwendet.

    Dieses Tool find ich einfach nur mega und schaft auf Knopfdruck schön struktuierten Code.

  • Denkanstoß gesucht.

    • Concara
    • 24. August 2021 um 16:58

    Hi!

    Es waren noch ein paar kleine Fehler im Script.

    z.B: Wenn im ordner1 keine PDF Datei war, dann wurde bei den Projektnummern nichts eingelesen auch wenn in den Anderen Ordnern PDF Dateien vorhanden waren.

    Ich habe den Teil mit dem Aufruf des externen Programms in die GUI Schleife gegeben.

    Die _Ausgabe() Funktion gibt jetzt "nur" das Array zurück.

    $aRun wurde umbenannt in $aOrdnerMitProjektNR ich hoffe du kannst damit mehr anfangen als Bezeichnung. Es ist das Array mit den PDF Dateien einer Projektnummer zu den Ordnern.

    $aOrdnerMitProjektNR[0] = Ordner1

    $aOrdnerMitProjektNR[1] = Ordner2

    ...

    ...

    qpdf ist bei mir sehr schnell:

    QPDF
    Download QPDF for free. PDF transformation/manipulation program + library. QPDF is a C++ library and set of programs that inspect and manipulate the structure…
    sourceforge.net
    Spoiler anzeigen
    AutoIt
    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <File.au3>
    #include <Array.au3>
    
    ;~ ;ZumTeste werden die Ordner angelegt
    ;~ For $i = 1 To 4
    ;~     DirCreate(@ScriptDir & "\o" & $i)
    ;~ Next
    ;~ DirCreate(@ScriptDir & "\a")
    ;~ ;Zum Testen werden "pdf" Dateien angelegt
    ;~ For $i = 1 To 4
    ;~     $iRand = Int(Random(100000, 999999))
    ;~     FileCopy(@ScriptDir & "\1.pdf", @ScriptDir & "\" & $iRand & "_was auch immer.pdf", "")
    ;~     FileCopy(@ScriptDir & "\2.pdf", @ScriptDir & "\asdf ded" & $iRand & "_was auch immer.pdf", "")
    ;~     ;FileWrite(@ScriptDir & "\" & $iRand & "_was auch immer.pdf", "")
    ;~     ;FileWrite(@ScriptDir & "\asdf ded" & $iRand & "_was auch immer.pdf", "")
    ;~ Next
    
    ;GUI erstellen
    Local $hGUI = GUICreate("Dokument erstellen", 280, 225, 180, 122)
    ;Label erstellen
    Local $idLabel1 = GUICtrlCreateLabel("Bitte Projektnummer eingeben:", 16, 11, 148, 17)
    Local $idLabel6 = GUICtrlCreateLabel("Bitte Dateinamen eingeben:", 16, 163, 135, 17)
    ;Inputs erstellen
    Global $sOrdner1 = @ScriptDir & "\o1"
    Global $sOrdner2 = @ScriptDir & "\o2"
    Global $sOrdner3 = @ScriptDir & "\o3"
    Global $sOrdner4 = @ScriptDir & "\o4"
    Global $sAusgabeordner = @ScriptDir & "\a"
    Global $idprojnr = GUICtrlCreateCombo("", 168, 8, 97, 21)
    Local $idDateiname = GUICtrlCreateInput("ausgabe.pdf", 168, 160, 97, 21)
    ;Buttons erstellen
    Local $ideinlesen = GUICtrlCreateButton("Neueinlesen", 16, 184, 70, 33)
    Local $idstart = GUICtrlCreateButton("Start", 86, 184, 70, 33)
    Local $idclose2 = GUICtrlCreateButton("Abbrechen", 156, 184, 70, 33)
    ;Gui starten
    _einlesen()
    GUISetState(@SW_SHOW, $hGUI)
    ;Loop bis Abbrechen geklickt wird
    While 1
        Switch GUIGetMsg()
            Case $GUI_EVENT_CLOSE, $idclose2
                ExitLoop
            Case $idstart
                $projektnr = GUICtrlRead($idprojnr)
                $ausgabenamen = GUICtrlRead($idDateiname)
                If $projektnr <> "" And $ausgabenamen <> "" Then
                    If FileExists($sAusgabeordner & "\" & $ausgabenamen) = 0 Then
                        $aOrdnerMitProjektNR = _Ausgabe($projektnr, $ausgabenamen)
                        Local $sAusgabeString = 'C:\Program Files (x86)\Patches\qpdf-10.3.2\bin\qpdf.exe --empty --pages '
                        For $iii = 0 To 3
                            If $aOrdnerMitProjektNR[$iii] <> "" Then
                                $sAusgabeString &= '"' & $aOrdnerMitProjektNR[$iii] & '" '
                            EndIf
                        Next
                        $sAusgabeString &= "-- " & $sAusgabeordner & "\" & $ausgabenamen
                        RunWait($sAusgabeString)
                        ConsoleWrite($sAusgabeString & @CRLF)
                        ;Löschen
                        If FileExists($sAusgabeordner & "\" & $ausgabenamen) = 1 Then
                            ShellExecute($sAusgabeordner & "\" & $ausgabenamen)
                            For $iii = 0 To 3
                                If $aOrdnerMitProjektNR[$iii] <> "" Then
                                    FileDelete($aOrdnerMitProjektNR[$iii])
                                EndIf
                            Next
                        EndIf
                        _einlesen()
                    Else
                        MsgBox(0, "Info", "Ausgabedatei existiert schon. Geben sie bitte einen anderen Namen ein", 0, $hGUI)
                    EndIf
                Else
                    MsgBox(0, "Info", "Keine Projektnummer ausgewählt oder kein Ausgabenamen angegeben.", 0, $hGUI)
                EndIf
            Case $ideinlesen
                _einlesen()
        EndSwitch
    WEnd
    
    Func _einlesen()
        Local $aOrdnerProjektnummern[1]
        $aOrdnerProjektnummern1 = _FileListToArray($sOrdner1, "*.pdf")
        $aOrdnerProjektnummern2 = _FileListToArray($sOrdner2, "*.pdf")
        $aOrdnerProjektnummern3 = _FileListToArray($sOrdner3, "*.pdf")
        $aOrdnerProjektnummern4 = _FileListToArray($sOrdner4, "*.pdf")
        _ArrayConcatenate($aOrdnerProjektnummern, $aOrdnerProjektnummern1, 1)
        _ArrayConcatenate($aOrdnerProjektnummern, $aOrdnerProjektnummern2, 1)
        _ArrayConcatenate($aOrdnerProjektnummern, $aOrdnerProjektnummern3, 1)
        _ArrayConcatenate($aOrdnerProjektnummern, $aOrdnerProjektnummern4, 1)
        _ArrayDelete($aOrdnerProjektnummern, 0)
        $aOrdnerProjektnummern = _ArrayUnique($aOrdnerProjektnummern)
        ;_ArrayDisplay($aOrdnerProjektnummern)
        _Projektnummer_auslesen($aOrdnerProjektnummern)
    EndFunc   ;==>_einlesen
    
    Func _Projektnummer_auslesen($aProjekt)
        Local $i
        Local $sProjektID
        GUICtrlSetData($idprojnr, "")
        If IsArray($aProjekt) Then
            For $i = 1 To UBound($aProjekt) - 1
                Local $aArray = StringRegExp($aProjekt[$i], "(\d{6})", 3)
                If Not @error Then
                    If Not StringInStr($sProjektID, $aArray[0]) Then
                        $sProjektID &= $aArray[0] & "|"
                    EndIf
                EndIf
            Next
            GUICtrlSetData($idprojnr, $sProjektID, StringLeft($sProjektID, 6))
        Else
            Return SetError(1, 0, "")
        EndIf
    EndFunc   ;==>_Projektnummer_auslesen
    
    Func _Ausgabe($sProjektIDAusgabe, $sAusgbenamen)
        Local $aAusgabe[4]
        $aOrdner1 = _FileListToArray($sOrdner1, "*.pdf", 0, True)
        $aAusgabe[0] = _Projektnummer_in_Ordner_finden($aOrdner1, $sProjektIDAusgabe)
        $aOrdner2 = _FileListToArray($sOrdner2, "*.pdf", 0, True)
        $aAusgabe[1] = _Projektnummer_in_Ordner_finden($aOrdner2, $sProjektIDAusgabe)
        $aOrdner3 = _FileListToArray($sOrdner3, "*.pdf", 0, True)
        $aAusgabe[2] = _Projektnummer_in_Ordner_finden($aOrdner3, $sProjektIDAusgabe)
        $aOrdner4 = _FileListToArray($sOrdner4, "*.pdf", 0, True)
        $aAusgabe[3] = _Projektnummer_in_Ordner_finden($aOrdner4, $sProjektIDAusgabe)
        Return $aAusgabe
    EndFunc   ;==>_Ausgabe
    
    Func _Projektnummer_in_Ordner_finden($aOrdner, $sProjektIDAusgabe)
        If IsArray($aOrdner) Then
            For $ii = 1 To UBound($aOrdner) - 1
                If StringInStr(StringTrimLeft($aOrdner[$ii], StringInStr($aOrdner[$ii], "\", Default, -1)), $sProjektIDAusgabe) <> 0 Then
                    Return ($aOrdner[$ii])
                EndIf
            Next
        EndIf
        Return SetError(1, 0, "")
    EndFunc   ;==>_Projektnummer_in_Ordner_finden
    Alles anzeigen


    Edit

    Für PDFTK

    Zeile 54: Local $sAusgabeString = 'C:\Program Files\PDFTK\bin\pdftk.exe '

    Zeile 60: $sAusgabeString &= "cat output " & $sAusgabeordner & "\" & $ausgabenamen

  • Denkanstoß gesucht.

    • Concara
    • 24. August 2021 um 12:53

    Hi!

    Wenn ihr Windows 10 verwendet fällt mir nur der "Microsoft Print to PDF" Druckertreiber ein, der schon von "Haus" aus auf dem PC installiert ist.

    Ich denke das wird viel komplizierter, wenn es überhaupt damit funktioniert ?

    Hast du nicht was von Terminalserver geschrieben?

    Dort muss man die Software zum zusammenfügen ja nur einmal installieren.

    Das Beispiel mit PDF24 funktioniert bei mir. Habe ich getestet.

    Was für ein Programm verwendest du zum Zusammenfügen von PDFs?

    Das man nicht auf Anhieb alles versteht ist klar, wenn man gerade anfängt etwas zu lernen.

    Wenn du noch eine konkrete Frage hast, dann nur her damit.

  • Denkanstoß gesucht.

    • Concara
    • 23. August 2021 um 09:45

    Hi!

    Du wolltest ja keine fertige Lösung!?

    Hier nochmal eine Version, die 6 stellige Nummern erkennt, egal wo sie im Dateinamen steht und Dateien in jedem Ordner erkennt.

    Wichtig! im Dateinamen dürfen nicht 2 oder mehr 6 stellige Nummern vorhanden sein.

    Falls doch, nimmt er die erste von Links.

    Spoiler anzeigen
    AutoIt
    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <File.au3>
    #include <Array.au3>
    
    ;~ ;ZumTeste werden die Ordner angelegt
    ;~ For $i = 1 To 4
    ;~     DirCreate(@ScriptDir & "\o" & $i)
    ;~ Next
    ;~     DirCreate(@ScriptDir & "\a")
    ;~ ;Zum Testen werden "pdf" Dateien angelegt
    ;~ For $i = 1 To 10
    ;~     $iRand = Int(Random(100000, 999999))
    ;~     FileWrite(@ScriptDir & "\" & $iRand & "_was auch immer.pdf", "")
    ;~     FileWrite(@ScriptDir & "\asdf ded" & $iRand & "_was auch immer.pdf", "")
    ;~ Next
    
    ;GUI erstellen
    Local $hGUI = GUICreate("Dokument erstellen", 280, 225, 180, 122)
    ;Label erstellen
    Local $idLabel1 = GUICtrlCreateLabel("Bitte Projektnummer eingeben:", 16, 11, 148, 17)
    Local $idLabel6 = GUICtrlCreateLabel("Bitte Dateinamen eingeben:", 16, 163, 135, 17)
    ;Inputs erstellen
    Global $sOrdner1 = @ScriptDir & "\o1"
    Global $sOrdner2 = @ScriptDir & "\o2"
    Global $sOrdner3 = @ScriptDir & "\o3"
    Global $sOrdner4 = @ScriptDir & "\o4"
    Global $sAusgabeordner = @ScriptDir & "\a"
    Global $idprojnr = GUICtrlCreateCombo("", 168, 8, 97, 21)
    Local $idDateiname = GUICtrlCreateInput("ausgabe.pdf", 168, 160, 97, 21)
    ;Buttons erstellen
    Local $ideinlesen = GUICtrlCreateButton("Neueinlesen", 16, 184, 70, 33)
    Local $idstart = GUICtrlCreateButton("Start", 86, 184, 70, 33)
    Local $idclose2 = GUICtrlCreateButton("Abbrechen", 156, 184, 70, 33)
    ;Gui starten
    _einlesen()
    GUISetState(@SW_SHOW, $hGUI)
    ;Loop bis Abbrechen geklickt wird
    While 1
        Switch GUIGetMsg()
            Case $GUI_EVENT_CLOSE, $idclose2
                ExitLoop
            Case $idstart
                $projektnr = GUICtrlRead($idprojnr)
                $ausgabenamen = GUICtrlRead($idDateiname)
                If $projektnr <> "" And $ausgabenamen <> "" Then
                    If FileExists($sAusgabeordner & "\" & GUICtrlRead($idDateiname)) = 0 Then
                        $aRun = _Ausgabe($projektnr, $ausgabenamen)
                        _ArrayDisplay($aRun)
                    Else
                        MsgBox(0, "Info", "Ausgabedatei existiert schon. Geben sie bitte einen anderen Namen ein", 0, $hGUI)
                    EndIf
                Else
                    MsgBox(0, "Info", "Keine Projektnummer ausgewählt oder kein Ausgabenamen angegeben.", 0, $hGUI)
                EndIf
            Case $ideinlesen
                _einlesen()
        EndSwitch
    WEnd
    
    Func _Ausgabe($sProjektIDAusgabe, $sAusgbenamen)
        Local $sAusgabeString
        Local $aAusgabe[4]
        $aOrdner1 = _FileListToArray($sOrdner1, "*.pdf", 0, True) ;, 0,True
        ;$sAusgabeString &= "Ordner1 " & _Projektnummer_in_Ordner_finden($aOrdner1, $sProjektIDAusgabe) & @CRLF
        $aAusgabe[0] = _Projektnummer_in_Ordner_finden($aOrdner1, $sProjektIDAusgabe)
        ;ConsoleWrite(_Projektnummer_in_Ordner_finden($aOrdner1, $sProjektIDAusgabe) & @CRLF)
        $aOrdner2 = _FileListToArray($sOrdner2, "*.pdf", 0, True)
        ;$sAusgabeString &= "Ordner2 " & _Projektnummer_in_Ordner_finden($aOrdner2, $sProjektIDAusgabe) & @CRLF
        $aAusgabe[1] = _Projektnummer_in_Ordner_finden($aOrdner2, $sProjektIDAusgabe)
        ;ConsoleWrite(_Projektnummer_in_Ordner_finden($aOrdner2, $sProjektIDAusgabe) & @CRLF)
        $aOrdner3 = _FileListToArray($sOrdner3, "*.pdf", 0, True)
        ;$sAusgabeString &= "Ordner3 " & _Projektnummer_in_Ordner_finden($aOrdner3, $sProjektIDAusgabe) & @CRLF
        $aAusgabe[2] = _Projektnummer_in_Ordner_finden($aOrdner3, $sProjektIDAusgabe)
        ;ConsoleWrite(_Projektnummer_in_Ordner_finden($aOrdner3, $sProjektIDAusgabe) & @CRLF)
        $aOrdner4 = _FileListToArray($sOrdner4, "*.pdf", 0, True)
        ;$sAusgabeString &= "Ordner4 " & _Projektnummer_in_Ordner_finden($aOrdner4, $sProjektIDAusgabe) & @CRLF
        $aAusgabe[3] = _Projektnummer_in_Ordner_finden($aOrdner4, $sProjektIDAusgabe)
        ;ConsoleWrite(_Projektnummer_in_Ordner_finden($aOrdner4, $sProjektIDAusgabe) & @CRLF)
        ;_ArrayDisplay($aAusgabe)
        ;Return $sAusgabeString
    
        ;HIER mit dem Array weiter arbeiten. Oder du stellst den String direkt her ohne ein Array zu erzeugen(siehe auskommentierten Code oben). Heir ein Beispiel mit PDF24:
        $sAusgabeString &= 'C:\Program Files (x86)\PDF24\pdf24-DocTool.exe -join -profile default/good -outputFile "' & $sAusgabeordner & "\" & GUICtrlRead($idDateiname) & '" '
        For $iii = 0 To 3
            If $aAusgabe[$iii] <> "" Then
                $sAusgabeString &= '"' & $aAusgabe[$iii] & '" '
            EndIf
        Next
        RunWait($sAusgabeString)
        ConsoleWrite($sAusgabeString & @CRLF)
        ;Löschen
        If FileExists($sAusgabeordner & "\" & GUICtrlRead($idDateiname)) = 1 Then
            For $iii = 0 To 3
                If $aAusgabe[$iii] <> "" Then
                    FileDelete($aAusgabe[$iii])
                EndIf
            Next
        EndIf
        _einlesen()
        Return $aAusgabe
    EndFunc   ;==>_Ausgabe
    
    Func _Projektnummer_in_Ordner_finden($aOrdner, $sProjektIDAusgabe)
        If IsArray($aOrdner) Then
            For $ii = 1 To UBound($aOrdner) - 1
                If StringInStr($aOrdner[$ii], $sProjektIDAusgabe) <> 0 Then
                    ConsoleWrite($aOrdner[$ii] & @CRLF)
                    Return ($aOrdner[$ii])
                EndIf
            Next
        EndIf
        Return SetError(1, 0, "")
    EndFunc   ;==>_Projektnummer_in_Ordner_finden
    
    Func _einlesen()
        $aOrdnerProjektnummern1 = _FileListToArray($sOrdner1, "*.pdf")
        _ArrayDelete($aOrdnerProjektnummern1, 0)
        $aOrdnerProjektnummern2 = _FileListToArray($sOrdner2, "*.pdf")
        $aOrdnerProjektnummern3 = _FileListToArray($sOrdner3, "*.pdf")
        $aOrdnerProjektnummern4 = _FileListToArray($sOrdner4, "*.pdf")
        _ArrayConcatenate($aOrdnerProjektnummern1, $aOrdnerProjektnummern2, 1)
        _ArrayConcatenate($aOrdnerProjektnummern1, $aOrdnerProjektnummern3, 1)
        _ArrayConcatenate($aOrdnerProjektnummern1, $aOrdnerProjektnummern4, 1)
        ;_ArrayDisplay($aOrdnerProjektnummern1)
        Local $aOrdnerProjektnummern = _ArrayUnique($aOrdnerProjektnummern1)
        ;_ArrayDisplay($aOrdnerProjektnummern)
        _Projektnummer_auslesen($aOrdnerProjektnummern)
    EndFunc   ;==>_einlesen
    
    Func _Projektnummer_auslesen($aProjekt)
        Local $i
        Local $sProjektID
        GUICtrlSetData($idprojnr, "")
        If IsArray($aProjekt) Then
            For $i = 1 To UBound($aProjekt) - 1
                Local $aArray = StringRegExp($aProjekt[$i], "(\d{6})", 3)
                If Not @error Then
                    If Not StringInStr($sProjektID, $aArray[0]) Then
                        $sProjektID &= $aArray[0] & "|"
                    EndIf
                EndIf
            Next
            GUICtrlSetData($idprojnr, $sProjektID, StringLeft($aProjekt[1], 6))
        Else
            Return SetError(1, 0, "")
        EndIf
    EndFunc   ;==>_Projektnummer_auslesen
    Alles anzeigen
  • Denkanstoß gesucht.

    • Concara
    • 20. August 2021 um 13:23

    Falls die Projektnummer am Anfang der Datei steht, dann sollte dir der Code hier etwas helfen.

    Die Ausgabe müsste allerdings noch programmiert werden.

    AutoIt
    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <File.au3>
    #include <Array.au3>
    ;GUI erstellen
    Local $hGUI = GUICreate("Dokument erstellen", 280, 225, 180, 122)
    
    ;Label erstellen
    Local $idLabel1 = GUICtrlCreateLabel("Bitte Projektnummer eingeben:", 16, 11, 148, 17)
    Local $idLabel6 = GUICtrlCreateLabel("Bitte Dateinamen eingeben:", 16, 163, 135, 17)
    ;Gruppe erstellen
    ;~ Local $idGroup1 = GUICtrlCreateGroup("Was soll zusammengefügt werden?", 16, 32, 249, 121)
    ;Checkboxen erstellen
    ;~ Local $idcheckbox1 = GUICtrlCreateCheckbox("Teil 1", 32, 56, 120, 17)
    ;~ Local $idcheckbox2 = GUICtrlCreateCheckbox("Teil 2", 32, 80, 120, 17)
    ;~ Local $idcheckbox3 = GUICtrlCreateCheckbox("Teil 3", 32, 104, 120, 17)
    ;~ Local $idcheckbox4 = GUICtrlCreateCheckbox("Teil 4", 32, 128, 120, 17)
    ;Inputs erstellen
    Global $aOrdner1, $aOrdner2, $aOrdner3, $aOrdner4
    Global $idprojnr = GUICtrlCreateCombo("", 168, 8, 97, 21)
    ;Local $idprojnr = GUICtrlCreateInput("", 168, 8, 97, 21)
    Local $idDateiname = GUICtrlCreateInput("ausgabe.pdf", 168, 160, 97, 21)
    ;Buttons erstellen
    Local $ideinlesen = GUICtrlCreateButton("Neueinlesen", 16, 184, 70, 33)
    Local $idstart = GUICtrlCreateButton("Start", 86, 184, 70, 33)
    Local $idclose2 = GUICtrlCreateButton("Abbrechen", 156, 184, 70, 33)
    ;Gui starten
    _einlesen()
    GUISetState(@SW_SHOW, $hGUI)
    ;Loop bis Abbrechen geklickt wird
    While 1
        Switch GUIGetMsg()
            Case $GUI_EVENT_CLOSE, $idclose2
                ExitLoop
            Case $idstart
                $projektnr = GUICtrlRead($idprojnr)
                $ausgabenamen = GUICtrlRead($idDateiname)
                If $projektnr <> "" And $ausgabenamen <> "" Then
                    $sRun = _Ausgabe($projektnr, $ausgabenamen)
                    MsgBox(0, "Info", $sRun, 0, $hGUI)
                Else
                    MsgBox(0, "Info", "Keine Projektnummer ausgewählt oder kein Ausgabenamen angegeben.", 0, $hGUI)
                EndIf
            Case $ideinlesen
                _einlesen()
        EndSwitch
    WEnd
    
    Func _Ausgabe($sProjektIDAusgabe, $sAusgbenamen)
        Local $sAusgabeString
        $aOrdner1 = _FileListToArray(@ScriptDir & "\o1", "*.pdf", 0, True)    ;, 0,True
        $sAusgabeString &= _Projektnummer_in_Ordner_finden($aOrdner1, $sProjektIDAusgabe)
        ConsoleWrite(_Projektnummer_in_Ordner_finden($aOrdner1, $sProjektIDAusgabe) & @CRLF)
        $aOrdner2 = _FileListToArray(@ScriptDir & "\o2", "*.pdf", 0, True)
        $sAusgabeString &= _Projektnummer_in_Ordner_finden($aOrdner2, $sProjektIDAusgabe)
        ConsoleWrite(_Projektnummer_in_Ordner_finden($aOrdner2, $sProjektIDAusgabe) & @CRLF)
        $aOrdner3 = _FileListToArray(@ScriptDir & "\o3", "*.pdf", 0, True)
        $sAusgabeString &= _Projektnummer_in_Ordner_finden($aOrdner3, $sProjektIDAusgabe)
        ConsoleWrite(_Projektnummer_in_Ordner_finden($aOrdner3, $sProjektIDAusgabe) & @CRLF)
        $aOrdner4 = _FileListToArray(@ScriptDir & "\o4", "*.pdf", 0, True)
        $sAusgabeString &= _Projektnummer_in_Ordner_finden($aOrdner4, $sProjektIDAusgabe)
        ConsoleWrite(_Projektnummer_in_Ordner_finden($aOrdner4, $sProjektIDAusgabe) & @CRLF)
        ;_ArrayDisplay($aOrdner1)
        Return $sAusgabeString
    EndFunc   ;==>_Ausgabe
    
    Func _Projektnummer_in_Ordner_finden($aOrdner, $sProjektIDAusgabe)
        If IsArray($aOrdner) Then
            For $ii = 1 To UBound($aOrdner) - 1
                If StringInStr($aOrdner[$ii], $sProjektIDAusgabe) <> 0 Then
                    Return ($aOrdner[$ii])
                EndIf
            Next
        EndIf
        Return SetError(1,0,"")
    EndFunc   ;==>_Projektnummer_in_Ordner_finden
    
    Func _einlesen()
        $aOrdnerProjektnummern = _FileListToArray(@ScriptDir & "\o1", "*.pdf")
        _Projektnummer_auslesen($aOrdnerProjektnummern)
    EndFunc   ;==>_einlesen
    
    Func _Projektnummer_auslesen($aProjekt)
        Local $i
        Local $sProjektID
        If IsArray($aProjekt) Then
            GUICtrlSetData($idprojnr, "")
            For $i = 1 To UBound($aProjekt) - 1
                StringLeft($aProjekt[$i], 6)
                $sProjektID &= StringLeft($aProjekt[$i], 6) & "|"
            Next
            GUICtrlSetData($idprojnr, $sProjektID, StringLeft($aProjekt[1], 6))
        Else
            Return SetError(0)
        EndIf
    EndFunc   ;==>_Projektnummer_auslesen
    Alles anzeigen
  • Denkanstoß gesucht.

    • Concara
    • 20. August 2021 um 11:19

    Wenn ich dich @DG richtig verstanden habe, könnte man es so gut wie automatisieren ohne jegliche Benutzer Interaktion.

    Ordner 1 bis 4 sagen wir mal einmal in der Minute alle Dateien einlesen. Nach Projektnummer unterteilen. Und wenn in den anderen Ordnern eine Datei mit der Projektnummer vorhanden ist, verbinden lassen und in einen Ordner ausgeben.

  • Denkanstoß gesucht.

    • Concara
    • 20. August 2021 um 10:18

    Hallo!

    Ich finde dein Projekt interessant!

    Für mich würden sich aber einige Fragen noch ergeben um dieses umsetzen zu können.

    Woher kommen die PDF Dateien in den unterschiedlichen Ordnern?

    Sind in dem jeweiligen Ordner immer nur eine PDF Datei?

    Für wie viele Anwender soll dieses Programm Verwendung finden? (variable Pfade eventuell auslesen aus einer ini Datei --> Setup in der GUI oder einmal Einrichtung per manueller Befüllung der ini Datei )

    Sind die Projektnummern IMMER 6 stellig? (Dateien einlesen per regex = Benutzer freundlich)

  • Emailadressen auslesen aus Outlook Gesendete Objekte

    • Concara
    • 19. August 2021 um 17:40

    Hallo Water!

    Danke das hat mir sehr weiter geholfen!

    Ich musste noch was für die Verteilerlisten basteln aber das habe ich hinbekommen.

    Falls jemand mal auf dieses Thema kommt hier mein Test Code:

    AutoIt
    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_Change2CUI=y
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
    ;#include <Array.au3>
    #include <outlookEX.au3>
    Global $oOutlook = _OL_Open()
    If @error <> 0 Then Exit MsgBox(16, "OutlookEX UDF:", "Error connecting to Outlook. @error = " & @error & ", @extended: " & @extended)
    Global $aOL_Item = _OL_ItemFind($oOutlook, "*\Gesendete Objekte", $olMail, "", "", "", "EntryID,@ItemObject,Subject")
    If $aOL_Item[0][0] = 0 Then Exit MsgBox(16, "OutlookEX UDF", "Error finding item. @error = " & @error & ", @extended = " & @extended)
    ;_ArrayDisplay($aOL_Item)
    
    For $iMail = 1 To UBound($aOL_Item) - 1
        $oSubject = $aOL_Item[$iMail][2]
        ConsoleWrite(StringUpper($oSubject) & @CRLF)
        Local $sInsert1 = _Leerzeichen($oSubject)
        $oRecipient = $aOL_Item[$iMail][1].Recipients
        For $oRecipient In $aOL_Item[$iMail][1].Recipients
            $oOL_Sender = $oRecipient.AddressEntry
            If $oOL_Sender.AddressEntryUserType = $olExchangeUserAddressEntry Or $oOL_Sender.AddressEntryUserType = $olExchangeRemoteUserAddressEntry Then
                Local $oExchangeUser = $oOL_Sender.GetExchangeUser
                ConsoleWrite($sInsert1 & "|_> " & $oExchangeUser.PrimarySmtpAddress & @CRLF)
            ElseIf $oOL_Sender.AddressEntryUserType = $olExchangeDistributionListAddressEntry Then
                Local $oExchangeDistributionList = $oOL_Sender.GetExchangeDistributionList
                $aDistListMemberGet = _OL_DistListMemberGet($oOutlook, $oExchangeDistributionList)
                ;_ArrayDisplay($aDistListMemberGet)
                For $i = 1 To UBound($aDistListMemberGet) - 1
                    If $aDistListMemberGet[$i][0].AddressEntryUserType = $olExchangeUserAddressEntry Or $aDistListMemberGet[$i][0].AddressEntryUserType = $olExchangeRemoteUserAddressEntry Then
                        $oExchangeUser = $aDistListMemberGet[$i][0].GetExchangeUser.PrimarySmtpAddress
                        If $oExchangeUser <> "" Then
                            ConsoleWrite($sInsert1 & "|_> " & $oExchangeUser & @CRLF)
                        Else
                            ConsoleWrite($sInsert1 & "|Keine Email_> " & $aDistListMemberGet[$i][1] & "   " & $aDistListMemberGet[$i][0].AddressEntryUserType & @CRLF)
                        EndIf
                    Else
                        _DistList($oOutlook, $aDistListMemberGet[$i][0], $sInsert1)
                    EndIf
                Next
                ;Exit
            Else
                ConsoleWrite($sInsert1 & "|_> " & $oRecipient.address & @CRLF)
            EndIf
        Next
        ConsoleWrite(@CRLF)
    Next
    _OL_Close($oOutlook)
    
    Func _DistList($oOutlook, $oOL_Sender, $sOffset = "")
        Local $i
        Local $oExchangeUser
        Local $oExchangeDistributionList = $oOL_Sender.GetExchangeDistributionList
        Local $sInsert = $sOffset & _Leerzeichen($oExchangeDistributionList.PrimarySmtpAddress)
        ConsoleWrite($sOffset & "|_> " & $oExchangeDistributionList.PrimarySmtpAddress & @CRLF)
        Local $aDistListMemberGet = _OL_DistListMemberGet($oOutlook, $oExchangeDistributionList)
        ;_ArrayDisplay($aDistListMemberGet)
        For $i = 1 To UBound($aDistListMemberGet) - 1
            If $aDistListMemberGet[$i][0].AddressEntryUserType = $olExchangeUserAddressEntry Or $aDistListMemberGet[$i][0].AddressEntryUserType = $olExchangeRemoteUserAddressEntry Then
                $oExchangeUser = $aDistListMemberGet[$i][0].GetExchangeUser.PrimarySmtpAddress
                If $oExchangeUser <> "" Then
                    ConsoleWrite($sInsert & "|__ " & $oExchangeUser & @CRLF)
                Else
                    ConsoleWrite($sInsert & "|Keine Email__ " & $aDistListMemberGet[$i][1] & "   " & $aDistListMemberGet[$i][0].AddressEntryUserType & @CRLF)
                EndIf
            ElseIf $oOL_Sender.AddressEntryUserType = $olExchangeDistributionListAddressEntry Then
                _DistList($oOutlook, $aDistListMemberGet[$i][0], $sInsert)
            Else
                ConsoleWrite($sInsert & "|_____ " & $aDistListMemberGet[$i][1] & "   " & $aDistListMemberGet[$i][0].AddressEntryUserType & @CRLF)
            EndIf
        Next
    EndFunc   ;==>_DistList
    
    Func _Leerzeichen($sString)
        Local $sLeerzeichen = " "
        Local $i
        Local $sLeerzeichenString = ""
        For $i = 1 To StringLen($sString)
            $sLeerzeichenString &= $sLeerzeichen
        Next
        Return $sLeerzeichenString
    EndFunc   ;==>_Leerzeichen
    Alles anzeigen
  • Emailadressen auslesen aus Outlook Gesendete Objekte

    • Concara
    • 17. August 2021 um 11:47

    Hallo Water!

    Nein es funktioniert leider nicht so wie ich mir das vorgestellt habe.

    Du hast geschrieben ich sollte den Code der die Exchange "Emailadressen (x500)" in "richtige" Emailadressen umwandelt auf das Empfängerobjekte anwenden.

    Da aber das Empfängerobjekte ja mehrere Empfänger haben kann, ist das wahrscheinlich nicht so einfach möglich wie beim Versender.

    Ich müsste allerdings das ExchangeUserObjekt zu dieser /o=DOMAIN/ou=exchange administrative group (fydibohf23spdlt)/cn=recipients/cn=c273d1e9c0a74795a003759535e1fe7b-Mustermann Max Adresse finden um die PrimarySmtpAdresse auslesen zu können, wenn ich deinen Code halbwegs verstanden habe.

    Nur wie mach ich das?

  • Emailadressen auslesen aus Outlook Gesendete Objekte

    • Concara
    • 16. August 2021 um 16:21

    Hallo Water!

    Sorry dass ich mich erst jetzt wieder melde! (War auf Urlaub)

    Hier mein Code:

    Spoiler anzeigen
    AutoIt
    #include <Array.au3>
    #include <outlookEX.au3>
    Global $oOutlook = _OL_Open()
    If @error <> 0 Then Exit MsgBox(16, "OutlookEX UDF:", "Error connecting to Outlook. @error = " & @error & ", @extended: " & @extended)
    Global $aOL_Item = _OL_ItemFind($oOutlook, "*\Gesendete Objekte", $olMail, "", "", "", "EntryID,@ItemObject")
    If $aOL_Item[0][0] = 0 Then Exit MsgBox(16, "OutlookEX UDF", "Error finding item. @error = " & @error & ", @extended = " & @extended)
    ;_ArrayDisplay($aOL_Item)
    $iMail = 284
    $oRecipient = $aOL_Item[$iMail][1].Recipients
    For $oRecipient In $aOL_Item[$iMail][1].Recipients
        ConsoleWrite($oRecipient.address & @CRLF)
        $oOL_Sender = $oRecipient.address
        If $oOL_Sender.AddressEntryUserType = $olExchangeUserAddressEntry Or $oOL_Sender.AddressEntryUserType = $olExchangeRemoteUserAddressEntry Then
        Local $oExchangeUser = $oOL_Sender.GetExchangeUser
        MsgBox(0, "Mail", $oExchangeUser.PrimarySmtpAddress)
        EndIf
    Next
    _OL_Close($oOutlook)
    Alles anzeigen

    Da ich nicht verstehe was dein Code macht, habe ich es einfach mal probiert die 2 Scripte zu kombinieren.

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™