Beiträge von Concara
-
-
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
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))
Musashi Vor 15 Stunden
#include <Array.au3>
Local $aHexValues[0]
For $i = 1 To 1024
_ArrayAdd($aHexValues, "0xFF" & Hex($i, 6))
Next
_ArrayDisplay($aHexValues)
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)
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.
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)
Concara Vor 15 Stunden
...Wie Mars schon geschrieben hat so wie Musashi und Bitnugger es gemacht haben sind es auch Strings im Array.
Bitnugger Vor 12 Stunden
Ein Ptr ist definitiv kein String... und was wie mit _ArrayDisplay angezeigt wird, ist eine völlig andere Sache.
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)
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.
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.
-
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.
-
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 ...?
-
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?
Hier meine Datenbank Struktur:
-
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 UDFHi 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 -
Bitte nicht Cross-Posten (oder zumindest darauf verweisen).
(Please do not cross-post - at least refer to it)
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.
-
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.
-
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.txt12 Wasser 14 Milch 38 Wein 32 Wein 14 Wasser 5 Bier 41 Wein 6 Bier 9 Milch 33 Milch
AutoIt
Alles anzeigen#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")
-
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
Alles anzeigen#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
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.
-
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:
QPDFDownload QPDF for free. PDF transformation/manipulation program + library. QPDF is a C++ library and set of programs that inspect and manipulate the structure…sourceforge.netSpoiler anzeigen
AutoIt
Alles anzeigen#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
Edit
Für PDFTK
Zeile 54: Local $sAusgabeString = 'C:\Program Files\PDFTK\bin\pdftk.exe '
Zeile 60: $sAusgabeString &= "cat output " & $sAusgabeordner & "\" & $ausgabenamen
-
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.
-
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
Alles anzeigen#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
-
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
Alles anzeigen#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
-
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.
-
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)
-
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
Alles anzeigen#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
-
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?
-
Hallo Water!
Sorry dass ich mich erst jetzt wieder melde! (War auf Urlaub)
Hier mein Code:
Spoiler anzeigen
AutoIt
Alles anzeigen#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)
Da ich nicht verstehe was dein Code macht, habe ich es einfach mal probiert die 2 Scripte zu kombinieren.
-
Hallo Water!
Super danke!
Hast du noch ein Idee wie man die Exchange internen Adressen in "richtige" Mailadressen umwandelt.
/o=DOMAIN/ou=exchange administrative group (fydibohf23spdlt)/cn=recipients/cn=c273d1e9c0a74795a003759535e1fe7b-Mustermann Max
Du hattest da ein Lösung für den Versender einer Email im Englischen Forum
Spoiler anzeigen
AutoIt
Alles anzeigenGlobal $oOutlook = _OL_Open() Global $aOL_Item = _OL_ItemFind($oOutlook, "*\Gesendete Objekte", $olMail, "", "", "", "EntryID,@ItemObject") Local $oOL_Item = $oOutlook.Session.GetItemFromID($aOL_Item[284][0], Default) Local $oOL_Sender = $oOL_Item.Sender If $oOL_Sender.AddressEntryUserType = $olExchangeUserAddressEntry Or $oOL_Sender.AddressEntryUserType = $olExchangeRemoteUserAddressEntry Then Local $oExchangeUser = $oOL_Sender.GetExchangeUser MsgBox(0, "Mail", $oExchangeUser.PrimarySmtpAddress) Else MsgBox(0, "Mail", "Failed") EndIf _OL_Close($oOutlook)