[gelöst] Probleme bei der Pfadauswahl und Funktionen

  • Hallo,

    ich benötige immer wieder eine Verzeichnis- und Dateiindexizierung, in Form von einer Textdatei (txt) zum Vergleich mit der Vorgängerdatei und einer html Datei wegen des einfachen Verzeichnisbrowsings.

    Nun habe ich versucht (so schwer habe ich mir es nicht vorgestellt) meine funktionierende Indexizierung ohne GUI, in ein kleines Programm mit GUI zu ändern. 8o

    Hier meine funktionierende Indexerstellung als Code ohne GUI (zum klicken): Zu beachten gilt, dass die Indexerstellung im Script directory durchgeführt wird.

    So .... und jetzt beginnen die Probleme mit der GUI.

    Ich schaffe es nicht, mit meinen bescheidenen Hirnwindungen den richtigen Code in die richtige Reihenfolge zu bekommen oder ich habe ein paar Zeilen vergessen oder falsch geschrieben?

    Was geht ist:
    1.) Die Gui Startet :D , leider ....die Index.txt wird unabhängig von dem was oben im Auswahlfeld enthalten ist, immer nur im Script-Directory erstellt wenn der Button dazu angeklickt wird <X . Es tut also nicht so wie es soll.

    Was nicht geht ist:
    1.) Ich möchte, dass die Indexdatei von dem im Auswahl-Feld angegebenen Pfad erstellt wird und nicht nur im Script-Dir.
    2.) Dass auch in dem angegebenen Pfad die html Datei erstellt werden kann.
    3.) Dass die Animation von UEZ bei der Erstellung der Dateien ausgegeben wird.

    Hier der Code von der GUI-Version:


    Ich würde mich sehr darüber freuen, wenn Ihr mir die falschen oder fehlenden Codeschnipsel korregieren könntet so dass die GUI-Version läuft. Natürlich bin ich auch sehr über Verbesserungen erfreut. Kritik darf sehr gerne geübt werden, nur ihr müsst einfach wissen, dass ich selbst, so vieles nicht richtig blicke. Ich weiß was ich will, kanns aber leider nur bedingt umsetzen.

    Einmal editiert, zuletzt von bazii (9. August 2015 um 23:26)

  • Hab mal alles so geändert, dass es funktioniert (außer die Animation).
    Du solltest aber die Funktionen von Autoit besser nutzen. Die ganzen Comspec sachen brauchst du eigentlich nicht, geht alles mit Autoit. Allgemein ist ziemlich viel unsinniger kram in deinem Script. (Hab grad nur nicht so viel Zeit). Guck dir mal _Filelisttoarray() an ;) Die Autoithilfe solltest du allgemein mal durchblättern.

  • Hallo Kanashius,

    vielen Dank für die Korrektur als gleich auch für die Tips. Glaub mir, ich habe die ganze Woche am Feierabend an dem Skript gesessen und versuche auch seit Jahren die Hilfe zu studieren. Jedoch blicke ich oft schon ganz einfach elementare Grundlagen nicht. Wenn es mal in der VHS in Stuttgart einen Kurs zu Autoit geben sollte, wäre ich ganz sicher einer der ersten Kursteilnehmer.

    Zum Skript:
    Da habe ich mich bestimmt falsch ausgedrückt und das Script-Dir falsch im Script angegeben. Also wenn ich z. B. G:\ISO auswähle, soll mir das Programm von G:\ISO den Index erstellen und dort auch ablegen. Jetzt erstellt mir das Programm im von mir im Script gewählten, mit dem wohl falschen Befehl das Verzeichnis (dem Script-Dir) die Indexdateien. Das möchte ich aber gar nicht. Ich möchte, dass der Index (txt oder html) im gewählten Verzeichnis erstellt und gespeichert wird.

    Wie lautet denn da der Befehl oder die richtige Pfadbezeichnung? Ich kenne noch working Dir aber dann hört es schon auf und das ist sicher auch nicht das richtige....

    Zu Deinem Hinweis:

    Zitat von Kanashius

    Du solltest aber die Funktionen von Autoit besser nutzen. Die ganzen Comspec sachen brauchst du eigentlich nicht, geht alles mit Autoit.


    Ich nutze Comspec weil ich denke, dass der Befehl "dir >" in der Kommandozeile abgesetzt werden muss. Wie macht das Autoit und mit welchem Befehl kann ich das verwirklichen und vor allem, wo liegen die Vorteile? Geht die Indexerstellung dann schneller?


    Zitat von Kanashius

    Allgemein ist ziemlich viel unsinniger kram in deinem Script. (Hab grad nur nicht so viel Zeit).


    Es ist für mich sehr wichtig zu wisssen, was unsinnig ist und wie ich es verbessern kann.

    Vielen Dank nochmal ...

  • du musst bei dem Befehl das workingdir ändern. momentan übergibst du dort @Script_DIr. CMD geht immer von dem Verzeichnis aus, in dem es Arbeitet.
    Für Autoit hilft guck mal in die Kategorie:
    Function Reference->File, Directory and Disk Management
    User Defined Functions Reference->File Management
    Da sind alle wichtigen Befehle. Ansonsten noch die ExProperty UDF suchen (internet), damit kann man die Dateiinfos auslesen.
    Ich werd später am Abend mal zusammensuchen.
    was für Infos brauchst du eigentlich, bzw. sollen rausgeschrieben werden bei der txt (bei der html konnt ichs sehen, bei der anderen wars auch ziemlich viel unsinniges, vermute ich mal)

  • Zitat von kanashius

    du musst bei dem Befehl das workingdir ändern.

    Das ist ja mein Problem (wahrscheinlich kein großes). Ich finde nicht den richtigen Befehl für die Indexerstellung im ausgewählten Verzeichnis.

    Ich schaue mich halbtot in der Hilfe, aber alles was ich immer wieder lese blicke ich nicht. Ich habe eben die Macroreferenz durchgeschaut und finde gefühlte 100 @Dir Operationen.
    Aber ich finde niergens den Befehl für das oben ausgewählte Verzeichnis.

    Wenn ich mit diesem Befehl arbeite,

    AutoIt
    RunWait(@ComSpec & ' /c ' & 'dir /n /os /4 /s > index_.txt' & '"', "", @sPath, @SW_HIDE)

    oder mit:


    AutoIt
    RunWait(@ComSpec & ' /c ' & 'dir /n /os /4 /s > index_.txt' & '"', "", @Input1, @SW_HIDE)


    erstellt mir das Programm den Index trotzdem im Ausführungspfad und nicht dort wo ich es erstellt haben möchte.


    Zu Deiner Frage: Doch, doch .... ich möchte die Index.txt genauso wie ich mir die Parameter mit Comspec in der Kommandozeile zusammengestellt habe.

    Dann habe ich mir aus Deinem Tip heraus _Filelisttoarray() angeschaut. Dazu das Beispiel. Das Resultat: Ich blicke nicht was ich dort eingeben soll.

    Wie soll ich das befüllen?
    _FileListToArray ( $sFilePath [, $sFilter = "*" [,$iFlag = $FLTA_FILESFOLDERS [, $bReturnPath = False]]] )


    Welche Zeilen folgen dann danach?



    Was soll ich bei Local $aFileList = _FileListToArray(@DesktopDir, [b]Default, Default, True[/b]) eintragen?

    Ich weiß nicht mal, was bei Deinem Code die Nummern bedeuten:

    AutoIt
    FileMove(@ScriptDir & "\" & "index.txt", $sPath & "\" & "index.txt", 1 + 8)

    Für was steht 1+8?

    So etwas alles finde ich der Hilfe nicht.

    • Offizieller Beitrag

    Wenn es mal in der VHS in Stuttgart einen Kurs zu Autoit geben sollte, wäre ich ganz sicher einer der ersten Kursteilnehmer.

    Wenn da echt Bedarf besteht, würde ich mich bereit erklären eine "Online-School" zu realisieren. Kann man mit mehreren Teilnehmern (für einen allein wär das ineffizient) gleichzeitig über Teamviewer abhalten oder für größere Anzahl mit einer Webinar-Software. Müßte aber erst schauen, ob es da eine Freeware gibt. Cisco ist glaub ich lizenzpflichtig.
    Also mal umschauen wer echten Bedarf hat und Themenschwerpunkte zusammenstellen. Ich würde daraus ein Schulungsprogramm erstellen, hatte mir mal für eine Schulung eine Darstellungssoftware geschrieben. Also Handwerkszeug ist da.
    Aber nur, wenn es wirklich ernst gemeint ist. Und eines vorneweg: Wer ernsthaft Koda zum Designen benutzt sollte danach keine Fragen stellen. Ich bin der Meinung, dass Koda zum Nicht-Denken verleitet und das ist kontraproduktiv. Nur wer in der Lage ist, das Modell seiner GUI im Kopf zu erstellen, kann auch ordentlich strukturiert programmieren.

  • Zitat

    BugFix schrieb:Wer ernsthaft Koda zum Designen benutzt sollte danach keine Fragen stellen.

    [offtopic]
    Ich bin jetzt nicht so zimperlich weil im Grunde meines Gärtnerherzens gebe ich Dir recht. Denn ich sage auch immer: Beim umgraben des Ackers erkennt man den Charakter des Gärtners. :D

    Andererseits könnten Anfänger mit Deinem obigen Satz die Flinte ins Korn werfen, weil sie sicher als Beginner anders denken werden als Du es als Profi tust.

    Koda ist bestimmt für viele Benutzer zum einen eine schnelle Möglichkeit, eine Gui zu erstellen und zum anderen sicher die Basis, für viele Fragen im Forum weil Benutzer nicht wissen, wie man Buttons und vieles mehr was Koda so bietet, in das gewollte Script einbinden und mit Funktionen verknüpfen kann. All das wäre bei einem Grundlagenkurs mit mir zu berücksichtigen. Ich würde mich auf jeden Fall freuen Dich kennenzulernen. Muss Dich aber vorwarnen. Ich bin Dickköpfig und kein junger Mann mehr. Aber ich habe Humor :/ [/offtopic]

    Zunächst aber brauch ich Hilfe bei meinem Script, weil ich nicht richtig mit AutoIt arbeiten kann. Also bitte back to Topic.

  • Diese Macros (bezogen auf Pfad bezogene Macros) sind keine Allheilmittel. Sie dienen ausschließlich zur Unterstützung. Einfach ein Macro wie zB: @DesktopDir
    wird in den meissten Fällen nicht ausreichen. Es hilft aber dabei die Pfadangabe zu vereinfachen.

    Amgenommen, du willst etwas auf den Desktop deines Programmbenutzers platzieren, mit Unter- und Unterordner. Vermutlich wirst du aber diesen Pfad nicht kennen, weil dir höchst
    Wahrscheinlich der Benutzername nicht bekannt ist.

    @DesktopDir erspart dir dann "die Mühe", den korrekten Pfad zu ermitteln.
    Aber dann ist man ja noch immer nicht im gewünschten Zielordner angelangt. Also verbindet man das Macro mit dem Rest des Pfades. Beispiel:


    Du siehst also, dass Macros alleine hier nicht weiter geholfen hätten.


    Für was steht 1+8?

    Das sind die FLAGs, die angeben, wie genau sich der Befehl oder besser: die Funktion verhalten soll. Sind für ziemlich jede Funktion verschieden. bei FileMove() geben sie an dass:
    1 --> eine bereits existierende Datei ÜBERSCHRIEBEN werden soll 
    8 --> die Dateistruktur erstellt werden soll, FALLS diese noch nicht existiert 

    Die beiden Flags könnte man auch zusammen addieren und gleich von vornherein eine 9 schreiben. Die vordefinierten Funktionen erkennen das und "wissen", was sie tun sollen.


    Zu dem ComSpec Gedöns kann ich dir leider nichts sagen, hab das noch nie gebraucht und somit NULL Kenntniss.

    • Offizieller Beitrag

    Wenn da echt Bedarf besteht, würde ich mich bereit erklären eine "Online-School" zu realisieren. Kann man mit mehreren Teilnehmern (für einen allein wär das ineffizient) gleichzeitig über Teamviewer abhalten oder für größere Anzahl mit einer Webinar-Software. Müßte aber erst schauen, ob es da eine Freeware gibt. Cisco ist glaub ich lizenzpflichtig.Also mal umschauen wer echten Bedarf hat und Themenschwerpunkte zusammenstellen. Ich würde daraus ein Schulungsprogramm erstellen, hatte mir mal für eine Schulung eine Darstellungssoftware geschrieben. Also Handwerkszeug ist da.
    Aber nur, wenn es wirklich ernst gemeint ist. Und eines vorneweg: Wer ernsthaft Koda zum Designen benutzt sollte danach keine Fragen stellen. Ich bin der Meinung, dass Koda zum Nicht-Denken verleitet und das ist kontraproduktiv. Nur wer in der Lage ist, das Modell seiner GUI im Kopf zu erstellen, kann auch ordentlich strukturiert programmieren.


    Also ich finde die Idee auch super und würde mit entsprechender Infrastruktur helfen. So haben wir hier auf Arbeit das Cisco Webex für alle frei zur Verfügung und an dem Punkt stehen mir alle Türen offen. :)
    Auch würde ich mich bereiterklären, eine entsprechende Plattform für Schulungsmaterialien ala schulung.autoit.de, einzurichten. Vielleicht hat ja jemand schon Erfahrungen mit einer entsprechenden Oberfläche gemacht. Oder wir stellen einfach nur ein Verzeichnislisting mit entsprechenden Schulungsunterlagen und Beispielen zur Verfügung.

    Grüße

    René

  • Hallo Lottich,

    vielen Dank für Deine Antwort und die Erklärungen zu den Nummern. Den Rest kapieren tu ich es allerdings nicht richtg.

    Was genau muss ich machen, damit mir der Index im vom Benutzer angegebenen Verzeichnis der Inputbox erstellt und abspeichert wird? Ich weiß den Pfad im vorhinein ja nicht.
    Ich versuche mal Deine Erklärung umzusetzen. Beton liegt auf versuche. ... :/

    EDIT: Ne, ich kapier es nicht. Was solll ich bei $Rest_vom_Pfad = "\Unterordner1\Unterordner2\" eintragen. Was ist, wenn der Benutzer im 5ten Unterordner einen Index erstellen möchte?

    Einmal editiert, zuletzt von bazii (11. August 2015 um 19:46) aus folgendem Grund: EDIT:

  • Also: Makros sind im Prinzip nichts anderes als Variablen, die Infos über passend zu dem jeweiligen PC, bzw. Nutzer gibt. Man kann sich ja nicht darauf verlassen, dass z.B. der Pfad zum Desktop immer gleich ist, da er vom Usernamen abhängt. Durch das Makro muss man diesen Usernamen nicht umständlich herausfinden. Wenn du dann @DesktopDir nutzt, wird der Pfad zum Desktop des aktuellen Users gesetzt. Für @ScriptDir gilt dasgleiche. Du kannst es nutzen, um den Pfad des aufrufenden Programmes herauszufinden. Das ist ein String. Diesen verknüpft Lottich mit anderen String: @ScriptDir&"\blub" wäre der Ordner/Datei blub in dem Pfad, in dem die Ausgeführte Autoit Exe sich befindet.
    Dadurch, dass du beim Run() @Scriptdir als workingdir übergeben hast, wurden die Befehle für cmd (comspec) in dem @Scriptdir ausgeführt. würdest du dort den eingelesenen Pfad einfügen, würde dieser auch verwendet werden :)

  • @bazii: Weisst du, was das beste ist an selbst erstellten Funktionen?

    Du kannst ihnen Daten "mitgeben". Was bedeutet das? nehmen wir mal ein Beispiel aus deinem Code:


    Gleich in der 1. Zeile kannst du der Funktion Daten mitgeben, in 2 Varianten

    • Variante 1: Func _indextxt($variable_die_ich_mitgeben_habe)

    In diesem Fall MUSST du beim Aufruf der Funktion (bei dir ist es der Aufruf in der While Schleife mit: Case $Button2) der Funktion eine Variable mitgeben, da sonst die Funktion nicht funktioniert und das Script abschmiert

    • Variante 2: Func _indextxt($variable_die_ich_mitgeben_habe = "irgend ein Text, zum Beispiel eine Pfadangabe ^^")

    Hierbei musst du nicht unbedingt was beim Funktionsaufruf mitgeben, KANNST es aber. Gibst du nichts mit, wird automatisch "irgend ein Text, zum Beispiel eine Pfadangabe ^^" benutzt. Gibst du doch etwas mit, wird "irgend ein Text, zum Beispiel eine Pfadangabe ^^" mit dem von dir mitgegebenen Daten ausgetauscht.

    Warum ist das nun so eine tolle Sache?? Ganz einfach. Weil es dir das Programmieren ungemein erleichtern wird!!!!
    Diese mitgegebenen Daten kannst du als eine Art Platzhalter in deiner Funktion verwenden. so würde aus deiner Funktion zum Beispiel sowas werden

    AutoIt
    Func _indextxt($Variable_die_ich_mitgegeben_habe = @ScriptDir)
    	RunWait(@ComSpec & ' /c ' & 'dir /n /os /4 /s > index_.txt' & '"', "", $Variable_die_ich_mitgegeben_habe, @SW_HIDE)
    	;Sleep(200)
    	RunWait(@ComSpec & ' /c ' & 'cmd /U /C TYPE index_.txt > index.txt' & '"', "", $Variable_die_ich_mitgegeben_habe, @SW_HIDE)
    	;Sleep(200)
    	RunWait(@ComSpec & ' /c ' & 'del index_.txt' & '"', "", $Variable_die_ich_mitgegeben_habe, @SW_HIDE) ; Watum eigentlich diese Zeile?? wird da nicht die erstellte IndexDatei wieder gelöscht??? Wenn du die Datei vorher löschen willst, solltest du diesen Befehl am Funktionsanfang verwenden. Sonst löschst du die Datei immer wieder gleich nach dem Erstellen und zwar so schnell, dass du davon nicht mal irgendwas mitkriegst ^^
    	;Sleep(200)
    ;~	FileMove(@ScriptDir & "\" & "index.txt", $sPath & "\" & "index.txt", 1 + 8) ; diese Zeile sollte nicht mehr nötig sein...
    	;Exit
    EndFunc   ;==>_indextxt

    Wie du siehst, hab ich hier in den RunWait Zeilen das Macro @ScriptDir gegen $Variable_die_ich_mitgegeben_habe ausgetauscht. Aktuell würde sich aber noch immer nichts am Funktionsverhalten ändern, weil die mitgegebe Variable dem ScriptDir Macro entspricht.
    Also geben wir der Funktion die gewollten Daten mit, damit sich das WorkingDir (Arbeitsordner) mit. Das geschieht nun in deiner While Schleife. Da wo du geschrieben hast: Case $Button2

    AutoIt
    While 1
    	$nMsg = GUIGetMsg()
    	Switch $nMsg
    		Case $Button2
    ;~ 			StartAnim()
    ;~			_indextxt($Variable_die_ich_mitgeben_will) ; <--- so musst du dir das vorstellen
    			_indextxt(GUICtrlRead($Input1))
    			Sleep(200)
    ;~ 			StopAnim()
    WEnd

    jetzt wird, wenn Button2 geklickt wird, automatisch das Control "ausgelesen" indem der Pfad ausgewählt wurde und in der Funktion weiter verarbeitet.

    Und BÄÄÄÄÄÄNGGGG, ist dein WorkingDir Problem, worauf dich @Kanashius bereits hingewiesen hat, erledigt.


    Edit kurz vorm Absenden: OMG, wie blind bin ich denn?
    eigentlich brauchst du ja nur das @ScriptDir gegen $sPath austauschen, steht ja in Zeile 2 der Funktion, aber du verwendest es nicht wie du willst ^^
    Tausche einfach in den RunWait Zeilen das @ScriptDir gegen $sPath aus. Das sollte schon helfen.
    Jetzt hab ich aber schon so viel geschrieben, da weigere ich mich jetzt, das alles wieder zu löschen :D

  • Hallo Kanashius und Lottich,

    ihr habt wirklich alle Mühen mir, das zu erklären und ich kapiere es ja auch einigermaßen.
    Aber es funktioniert leider nicht. Die Index.txt wird immer im ScriptDir erstellt, egal was ich mache.

    Hier mal der Code, den ich nach den Erklärungen von Lottich versucht habe.

    Was zum Kuckuck mache ich falsch. Ist ja schon peinlich. ..... Sorry.

    Lottich: Zu Deiner Frage:

    Zitat von Lottich

    ; Watum eigentlich diese Zeile?? wird da nicht die erstellte IndexDatei wieder gelöscht??? Wenn du die Datei vorher löschen willst, solltest du diesen Befehl am Funktionsanfang verwenden. Sonst löschst du die Datei immer wieder gleich nach dem Erstellen und zwar so schnell, dass du davon nicht mal irgendwas mitkriegst ^^

    Berechtigte Frage:
    Das mache ich darum, weil die Ausgabe von dir > /n /os /4 /s leider keine Umlaute abbilden kann. Mit umbennen unter berücksichtigung von /U /C funktioniert es wunderbar. Ich habe die Zeilen also genauso geschrieben wie es sein soll.

  • Hab deinen Fehler gefunden. Du hast RunWait falsch verwendet, indem du jeweils 1x  , "" zuviel verwendest. Oder korrekt ausgedrückt:
    Dein WorkingDir hast du an der falschen Stelle platziert.

    Ändere mal deinen Code von  RunWait(@ComSpec & ' /c ' & 'dir /n /os /4 /s > index_.txt' & '"', "", $sPath, @SW_HIDE)

    nach  RunWait(@ComSpec & ' /c ' & 'dir /n /os /4 /s > index_.txt' & '"', $sPath, @SW_HIDE)

    mit den anderen RunWaits natürlich sinngemäß genauso verfahren.

  • Hallo Lottich,

    Das war es. Du bist klasse. Hast mir sehr weitergeholfen. Alleine hätte ich das "", , welches zuviel war nicht entdeckt. Alles funktioniert wie es soll. Ich versuche das jetzt mal auf die Index.html Erstellung anzuwenden.

    @all, welche sich hier beteiligt haben:

    Habt herzlichen Dank für die Hilfe. Ihr seid klasse Helfer. :thumbup: