Geheimnis "scripting.dictionary" AutoIt 3.3.14.5

  • Hallo an alle,

    ich habe ein - möglicherweise - unlösbares Problem mit dem scripting.dictionary.:rtfm:, ja hab ich, werde aber nicht wirklich schlau daraus.

    Aufgabenstellung:

    Ich lese einen ganzen Verzeichnisbaum ein, durchwandere diesen (anhand vom scripting.dictionary) top down, drucke verschiedene Dateitypen aus (xls,doc,pdf,jpg - alle andere werden übergangen). Jedesmal wenn das Verzeichnis wechselt wird ein Zwischenblatt (aus einem anderem Druckerschacht mit andersfarbigem Papier) mit dem Verzeichnisnamen (letzter Verzeichnisnamenteil des Pfades) in groß drauf, ausgedruckt.

    Ein Statusfenster sowie eine Logdatei werden mitgeführt. 

    Ich verwende das um sehr große Dokumentationen (> 30.000 Seiten) über Nacht auszudrucken (deshalb auch die Log-Funktion ..).

    Funktioniert auch soweit ... ABER: die Reihenfolge stimmt nicht ganz.

    Ich bekomme:

    C:\1AA\2bb, 

    C:\1AA\2bb\3ab, 

    C:\1AA\2bb\3ab\verweis auf andere stelle in der doku.pdf, 4 kB 

    C:\1AA\2bb\3ab\verweis auf externe doku.pdf, 5 kB 

    C:\1AA\2bb\3bb, 5 kB 

    C:\1AA\2bb\3bb\4bb, 5 kB 

    C:\1AA\2bb\3bb\4bb\5ab, 5 kB 

    C:\1AA\2bb\3bb\4bb\5ab\verweis auf externe doku.pdf, 5 kB 

    C:\1AA\2bb\3bb\4bb\5bb, 5 kB 

    C:\1AA\2bb\3bb\4bb\5bb\verweis auf andere stelle in der doku.pdf, 4 kB

    C:\1AA\2bb\3bb\verweis auf andere stelle in der doku.pdf, 4 kB

    c:\1AA\2bb\3bb\verweis auf externe doku.pdf, 5 kB

    C:\1AA\2bb\verweis auf externe doku.pdf, 5 kB

    möchte aber:

    C:\1AA\2bb,

    C:\1AA\2bb\verweis auf externe doku.pdf, 5 kB

    C:\1AA\2bb\3ab,

    C:\1AA\2bb\3ab\verweis auf andere stelle in der doku.pdf, 4 kB 

    C:\1AA\2bb\3ab\verweis auf externe doku.pdf, 5 kB

    C:\1AA\2bb\3bb, 5 kB

    C:\1AA\2bb\3bb\verweis auf externe doku.pdf, 5 kB

    C:\1AA\2bb\3bb\verweis auf andere stelle in der doku.pdf, 4 kB

    C:\1AA\2bb\3bb\4bb, 5 kB

    C:\1AA\2bb\3bb\4bb\5ab, 5 kB

    C:\1AA\2bb\3bb\4bb\5ab\verweis auf externe doku.pdf, 5 kB

    C:\1AA\2bb\3bb\4bb\5bb, 5 kB

    C:\1AA\2bb\3bb\4bb\5bb\verweis auf andere stelle in der doku.pdf, 4 kB

    hier habe ich den entscheidenden Schnipsel der das Einlesen - scripting.dictionary - erledigt:

    Ist das mit dem Objekt scripting.dictionary überhaupt möglich (ohne Umwege über dictionary -> array und wieder zurück zu nehmen)?

    Mit _filetoarrayrec würde es funktionieren (getestet :thumbup:) aber da verliere ich ein paar Möglichkeiten und müßte vor allem das ganze Programm ändern. Natürlich ist mir die Sortierung erst aufgefallen als alles fertig war:cursing:.

    Ich bin schon für Hinweise - geht/geht nicht - dankbar.

    Grüße

    GML

  • GML 4. November 2020 um 14:30

    Hat den Titel des Themas von „Geheimnis "scripting.dictionary"“ zu „Geheimnis "scripting.dictionary" AutoIt 3.3.14.5“ geändert.
  • Die Sortierung ist korrekt. Das Problem liegt darin, dass der Sort-Algo keine Ahnung hat, dass die zu sortierenden Strings eigentlich eine Struktur darstellen.

    Das selbe Problem hatte ich mit der OU-Struktur in Active Directory, da nicht alle OU-Namen die selbe Länge hatten. Das Problem konnte ich nur lösen indem ich alle Teile der Struktur auf eine die selbe maximale Länge gebracht habe. Dieses Problem könntest Du auch bekommen, wenn die Verzeichnisnamen unterschiedliche Länge haben.

    Dein Problem ist zusätzlich etwas anders gelagert, da Du zwei Datenarten hast: Verzeichnisname und Dateiname.

    Kannst Du bitte den Teil Deines Skripts posten in dem Du den Verzeichnisbaum einliest und das Dictionary belegst? Dann können wir testen.

  • Ups, habe wohl - wie schon öfters - nicht den gesamten Post gelesen.

    Hast Du schon mal _FileListToArrayRec geprüft? Falls dort die Sortierung stimmt, könnte man die restlichen Funktionen vieleicht auf das Ergebnis von _FileListToArrayRec draufpropfen?

  • Mit _filetoarrayrec würde es funktionieren (getestet :thumbup: ) aber da verliere ich ein paar Möglichkeiten und müßte vor allem das ganze Programm ändern.

    Auf welche Möglichkeiten kommt es denn konkret an?

    Vielleicht finden wir ja eine bessere Alternative, anstatt zu versuchen diese umständlich umzubiegen?

  • Genau das mit der Sortierung ist mein Problem. Die (Datei)Reihenfolge innerhalb eines Ordners ist mir (fast) egal (bzw. wäre Bonus) aber es müssen innerhalb eines Ordners zuerst die Dateien, dann die Sub-Ordner kommen. Durch die alphabetische Sortierung wie Kanashius erwähnt hat, kommen die Ordner (die mit Ziffernfolgen beginnen) zuerst, dann der Rest. D.h. irgendwie müßte ich nach der Eigenschaft Datei/Ordner innerhalb eines Ordner sortieren ... oh mein Gott ... dafür reicht mein Wissen leider nicht.

    Das Ziel ist der Ausdruck (auf Drucker bzw. PDF-Drucker) in der richtigen Reihenfolge. So wie jetzt ist es lästig die Seiten durchzuklauben und umzusortieren (die Dokumentation wird digital sowie auf Papier übergeben, kommt nicht gut wenn Papier und digital andere Reihenfolgen haben).

    Eigenartigerweise lese ich den Verzeichnisbaum nur ein, sonst nichts. Wenn ich _filelisttoarryrec verwende stimmt die Reihenfolge seltsamerweise (genau wie scripting.dictionary sortiere ich das Array nach dem Einlesen nicht).

    _filelisttoarrayrec wäre die letzte Möglichkeit, da mit einiger Arbeit verbunden (und die Dateigröße habe ich dann auch nicht ohne weiteres zur Verfügung ..). Natürlich könnte man das Array erweitern, mehrere Durchläufe machen ... es geht hier immer so um 5.000-12.000 Dateien und Verzeichnisse.

    Danke, das mein Problem jemand ansieht!

    GML

    PS: grad kontrolliert, bei _filelisttoarrayrec gebe ich den sort-Parameter an! Wird also - richtig - sortiert. Das gibts meinen Nachforschungen nach beim scripting.dictionary nicht.

    Einmal editiert, zuletzt von GML (5. November 2020 um 13:53)

  • Ich hab das ganze mal auf _FileListToArrayRec umgeschrieben. Du bekommst jetzt ein 2Dimensionales Array mit den sortierten Dateien zurück.

    In dem Code steht auch, wie du den neuen Ordner vorher ausgeben kannst.

    Der zweite Parameter ist zum filtern der Extensions.

    Der dritte Parameter sorgt für das Hinzufügen der Extrainfos (TimeLastModified, TimeCreated, TimeLastAccessed, FileSize, FileSizeFormatted).

  • Hallo

    also ich nutze eine sehr einfache Command-Variante um einen sortierten Index zu erstellen.

    Nach der Ausführung des Skriptes werden zwei unterschiedlich sortierte Dateien erstellt und anschließend zum Betrachten gleich geöffnet.

    Tip:

    Nachdem die Eingabeaufforderung geöffnet wurde, kann man sich über "help dir" die Parameter zur Sortierungsreihenfolge anzeigen lassen.

    Wer möchte kann sich damit das Skript gerne auf eigene Bedürfnisse anpassen.

  • $hProcess = RunWait

    RunWait liefert kein Handle, sondern den Exitcode des gestarteten Programms. Zudem wird $hProcess/$hProcess_1 an keiner Stelle ausgewertet und ist somit völlig überflüssig.

    FileClose($sFile)

    FileClose wird nur dann benötigt, wenn zuvor ein File mit FileOpen geöffnet wurde, was hier aber nicht der Fall ist - ist somit auch völlig überflüssig.

    _FileWriteToLine($sFile, 4, "", True)
    _FileWriteToLine($sFile_1, 6, "", True)

    Hier kann ich nicht ganz folgen... wenn ich nicht irre, überschreibt du damit eine leere Zeile mit einer leeren Zeile!?

    Hier mal eine deutlich kürzere Version: