For-Schleife funktioniert nicht

  • Ich möchte Variablen aus einer Ini Datei auslesen und diese in einem Array speichern um diese wieder in einer Dropdown-Auswahl zu verwenden.
    Da ich mich mit AutoIt noch nicht so gut auskenne habe ich erstmal eine For-Schleife für Kommandozeile erstellt, die auch wunderbar funktioniert.
    Setze ich diese aber in mein AutoIt Skript ein funktioniert diese nicht mehr. In SciTE wird immer ERROR ausgegeben.
    Ich habe schon verschiedene Beispiele mit For Schleifen in AutoIt Skripten gesehen, wobei keine so aufgebaut ist wie meine.

    Bekomme ich das überhaupt so zum laufen, oder muss ich das doch über AutoIt interne Funktionen wie IniRead machen?

    Code
    for /f "skip=5 tokens=3 delims==" %i in ("Meine.ini") echo %i

    Die Ini befindet sich im gleichen Verzeichnis wie das Skript was später als Exe kompiliert dort bleiben soll. Es handelt sich dabei um einen Ordner auf einem Netzlaufwerk, falls das was zur Sache tut. Das ganze muss ohne feste Pfadangabe funktionieren.

    Ich habe das ganze versucht direkt einzubauen und auch versucht die Ausgabe über StdoutRead mit Run(@Comspec ... @Scriptdir $STDOUT_CHILD etc einzufangen, aber ich bekomme überall immer nur ERROR. :(

  • Wenn du einfach Daten speichern willst machs doch einfach in einer Datei, die du Zeilenweise einließt. Jede Zeile ist ein Eintrag im DropDownmenü.
    Was auch immer du mit der Kommandozeile willst, keine Ahnung, was du meinst.
    Was für Errors, und was für Scripte.
    Ich hab weder verstanden, was du genau willst, noch, woran es scheitert. Magst du das bitte noch etwas genauer erläutern? :)

    MfG Kanashius

    Normaler for-schleifen aufbau:

    AutoIt
    for $i=0 to ubound($array)-1 step 1
    ;was auch immer
    next
  • Bin ich hier auf der faschen Seite? Ich dachte hier ginge es um die Skriptsprache AutoIt...
    Dementsprechend bastele ich gerade ein AutoIt Skript.
    Darin habe ich diese Schleife eingefügt.
    Um den ganzen Krempel zu testen gehe ich in SciTE dann auf "Tools - Go" um das Skript auszuführen und im Output Fenster steht dann ... Run(^ERROR

    Und ums Dateien speichern, also unnötige temporäre Dateien erstellen, möchte ich natürlich auch herumkommen. Den Kram mit Batches in temporäre Dateien zu schreiben und nachher wieder einzulesen hätte ich zur Not auch noch hinbekommen. Aber das ganze soll doch etwas sauberer geskriptet sein. ;)

  • Hallo fred,

    du kannst Batch in keiner Weise mit AutoIt vergleichen. Das geht schon bei der Syntax los. (Die Art und Weise, wie der Code geschrieben werden muss)
    Deine Batch For Schleife wird, wenn du diese 1:1 in AutoIt übernimmst, NIEMALS funktionieren.
    Auch dein Run(@Comspec blabla ... wird nie funktionieren, weil die Syntax einfach falsch ist.

    Öffne einfach mal den Scite Editor und drück dann F1. Da öffnet sich die integrierte Hilfe Datei. Da sind sehr viele Beispiele die du dir ansehen kannst, um die Syntax "besser kennen zu lernen".
    In AutoIt werden zb einzelne Funktionsparameter immer mit einem Komma getrennt, nie mit einem Leerzeichen, wie es in Batch üblich ist.

    In der Hilfe kannst du auch nach dem Befehl Run suchen und dir die/das Beispiel dazu anschauen. Da findest du auch For-Schleifen...


    MfG Lo..

  • Kann die Aufgabe denn von einer For-Schleife in AutoIt einfach bewältigt werden?
    Oder wäre es besser über IniRead zu gehen? Oder brauch ich auch bei IniRead nochmal ne Schleife zum einlesen?

    Sind hoffentlich genug Beispiele in der Hilfe. Das mit der For-Schleife für Kommandozeile habe ich erst nach einer ganzen Weile richtig verstanden, da es nirgends richtig erklärt war und auf den meisten Seiten die Begriffe tokens und delims nur kurz angerissen und nicht ausführlich erklärt wurden. Mehr oder weniger durch Zufall habe ich trotzdem auch in der Einstiegsphase einige funktionierende For-Schleifen erzeugt, auch wenn ich nachher nicht so ganz nachvollziehen konnte warum. ^^

  • Kann die Aufgabe denn von einer For-Schleife in AutoIt einfach bewältigt werden?

    Welche Aufgabe?
    So wirklich konkret ist diese noch nicht definiert.
    Ideal wäre eine Beispiel-Ini-Datei und zu sagen was genau rauskommen soll.

    Oder wäre es besser über IniRead zu gehen? Oder brauch ich auch bei IniRead nochmal ne Schleife zum einlesen?

    Eine For-Schleife wiederholt lediglich Programmabläufe und verändert dabei eine Laufvariable.
    Eine For-Schleife kann also keine Ini-Dateien auslesen. Sie ist lediglich ein Element der Programmflusssteuerung.
    Um an die Werte der ini-Datei zu kommen bieten sich natürlich die Ini-Funktionen an.
    Ob nun ein Aufruf dieser Funktionen genügt oder mehrere innerhalb einer For-Schleife aufgerufen werden müssen kann man ohne konkrete Aufgabenstellung nicht sagen.

  • Dann etwas konkreter. Die oberen 5 Zeilen interessieren nicht, dort stehen die Setup Variablen, dann kommen die interessanten.
    Hab meine Idee auch nochmal etwas verändert gegenüber der ursprünglichen Aufgabe.

    Dazu soll einmal der Name der Sektion ausgelesen werden für Dropdown, dann für jede Sektion der Name der Variable und der Text der Variable selbst. Diese sollen je nach gewählter Sektion dann nebeneinander dargestellt werden. Also per Dropdown Sektion auswählen, dann werden die Variablen-Namen und die Variable selbst dargestellt.
    Die Variable bzw der Variablen-Name soll ausgewählt werden können, woraufhin ein weiteres Dropdown-Feld aktiv wird, in dem alle Dateinamen mit Endung xyz aus dem aktuellen Verzeichnis aufgelistet werden.
    Wie man sich an der Stelle vielleicht schon denken kann soll das Skript / Programm dazu dienen, die Ini upzudaten.
    Optional wäre noch die Funktion, die alte Datei gleich zu löschen. Vielleicht per Checkbox anwählbar.

    Die Ini ist folgendermassen aufgebaut:

  • Dazu soll einmal der Name der Sektion ausgelesen werden für Dropdown

    Welches DropDown?
    Möchtest du eine grafische Benutzeroberfläche erstellen?
    Ist die Erstellung dessen Teil der Frage? - weil die eigentliche Frage ja mit dem Auslesen von Ini-Dateien zu tun hatte.

    zu den konkreten Fragen die Ansätze:

    Dazu soll einmal der Name der Sektion ausgelesen werden

    Alle Sektionsnamen einer IniDatei erhälst du per IniReadSectionNames().

    für jede Sektion der Name der Variable und der Text der Variable selbst

    Alle Keys+Values einer Sektion in einer Ini-Datei erhälst du per IniReadSection()

    In der Hilfe sind diese gut beschrieben, vor allem die Beispiele können sehr zum Verständnis beitragen.

  • Ja, das ganze soll eine grafische Oberfläche bekommen.
    Ansonsten könnte man ja gleich bei der alten Methode bleiben: Ini mit Texteditor öffnen, alte Variable löschen und neue reinkopieren, speichern und ggf. Datei löschen.

    Hat sich bei der IniRead Funktion in letzter Zeit was geändert? Die genannten Befehle finde ich in meiner AutoIt Hilfedatei nicht. Hatte mir vor ca nem halben Jahr mal die neueste Beta-Version geladen. Die verwende ich auch noch.

    Zitat

    IniRead ( "filename", "section", "key", "default" )

    Hmmm... OK, die Befehle gibt's tatsächlich, nur die Suchfunktion in der Hilfe spuckt die mir nicht direkt aus.
    Tippe ich "iniread" ein, kommt als Ergebnis: IniRead, IniWrite, IniDelete.
    Die Suchfunktion in der Hilfedatei ist also stark verbesserungswürdig. :(

  • Wenn du den Befehl in SciTe eintippst (und Scite4AutoIt) nutzt, kannst du auch, wenn du auf die Funktion geklickt hast mit F1 die Hilfe zu dem Befehl direkt aufrufen.

    Das Script dürfte genau das machen, was du möchtest, falls du noch hilfe brauchst, oder nicht weiterkommst kannst du ja hier fragen :).
    Kannst ja nen bisschen Basteln.

    MfG Kanashius

  • Supi. Werd ich mal genau drüberschauen. Das macht schon größtenteils das was ich möchte.
    Nur fehlt irgendwo noch nen Reset, wenn man das erste Dropdown verändert. Mit dem aktuellen Skript werden einfach alle weiteren eingelesenen Variablen in das zweite Dropdown-Feld hinzugefügt. Es sollen natürlich immer nur die angezeigt werden, die auch zu der Sektion gehören (und natürlich auch entsprechend gespeichert).
    Werde mal weiter dran schrauben und wenns mal fertig wird poste ich natürlich das Ergebnis.

  • Kleines Update

    Hab das Verhalten der ComboBoxen mal etwas angepasst, da es mir so noch nicht gefallen hat.

    Fehlt nur noch ne weitere ComboBox und ne Checkbox. Muss mich auch mal damit beschäftigen, wie man die GUI Elemente anordnet. Da gibts sicher auch noch Verbesserungspotential.
    Funktionieren würde das Ding so auch schon, aber ich möchte es noch etwas komfortabler gestalten, so wie ich es weiter oben beschrieben habe.
    Falls ich was nicht hinbekomme melde ich mich wieder.
    Das nächste Update könnte ne Weile dauern, hab nicht so viel Zeit dafür über.

  • Nur zur Verbesserung, damit du was lernst :)

    AutoIt
    while _GUICtrlComboBox_DeleteString($iComboData,0)<>-1
    	_GUICtrlComboBox_ResetContent($iComboData)
    	$data=""
    	GUICtrlSetData($iInputValue,$data)
    WEnd
    ;besser so:
    ;Wieso alle Elemente einzeln löschen (Whileschleife), wenn der Reset Befehl alle löscht? (hatte den Befehl zu dem zeitpunkt nicht gefunden)
    ;Diese beiden aufrufe solltest du nicht in die Whileschleife packen. Warum auch, muss ja nicht x Mal gemacht werden, sondern nur einmal.
    _GUICtrlComboBox_ResetContent($iComboData)
    GUICtrlSetData($iInputValue,"") ;ne exra variable ist hier unnötig.
  • Fällt damit die while Schleife komplett raus?
    Hab noch etwas gebastelt und die nächste ComboBox eingebaut. Fehlt nur noch die Checkbox. Vielleicht krieg ich das morgen oder übermorgen sogar fertig. Hatte mir das etwas schwieriger vorgestellt, aber für die weitere ComboBox sind nur ein paar einfache Zeilen Code nötig. :D
    Funktioniert jetzt also schon alles bis auf die noch nicht implementierte optionale Löschfunktion.
    Dann muss am Ende nur noch ein Schutz rein, damit das Programm keinen Unsinn in die Ini schreibt. Hab mal den Speicher-Button gedrückt ohne was auszuwählen. Das hat mir dann folgendes an die Ini angehängt.

    Code
    []
    =


    Ich such dann mal ne Funktion den Button so lange zu sperren bis in allen ComboBoxen was ausgewählt wurde.

    Hmm... Mit ner If Funktion bekomme ich es hin über _GUICtrlComboBox_GetCurSel($iComboSection)=-1 zu prüfen ob was ausgewählt ist und entsprechend den Button zu enablen. Allerdings funktioniert das nur solange ich nur zwei ComboBoxen prüfe. Wenn ich die dritte mit reinsetze geht es nicht mehr und der Button bleibt grau.

    Also

    Code
    If Not _GUICtrlComboBox_GetCurSel($iComboSection)=-1 or _GUICtrlComboBox_GetCurSel($iComboData)=-1 Then
                         GUICtrlSetState($iButtonSave,$GUI_ENABLE)
                    EndIf

    mit nur zwei ComboBoxen funktioniert während

    Code
    If Not _GUICtrlComboBox_GetCurSel($iComboSection)=-1 or _GUICtrlComboBox_GetCurSel($iComboData)=-1 or _GUICtrlComboBox_GetCurSel($iComboBox3)=-1 Then
                         GUICtrlSetState($iButtonSave,$GUI_ENABLE)
                    EndIf

    mit allen drei nicht funktioniert. Kann ich nicht beliebig viele Bedingungen in der If-Abfrage hintereinander haben???

    Einmal editiert, zuletzt von fred08155 (10. Juli 2015 um 12:26)

  • Ja, while fällt weg.
    Löschfunktion: sieh dir mal IniDelete an (IniDelete($sIniToChange,GUICtrlRead($iComboSection),GUICtrlRead($iComboData)))
    Was den schutz angeht: am einfachsten wäre es, wenn du einfach beim Buttonklick prüfst, ob in den controls was steht (mit guictrlread(...)). Ansonsten müsstest du mit WM_Notifity/WM_Command arbeiten um zu erkennen, wann benutzereingaben getätigt werden, damit du in dem fall, dass alle inhalt haben den button enablen kannst. Das ist denke ich für dich als anfänger noch etwas zu schwer ;)

  • Beim Löschen guck ich wohl eher nach FileDelete oder so. Ich will ja nix aus der Ini löschen, sondern die alte Datei, die dann nicht mehr benötigt wird, wenn die beim Update durch eine neue ersetzt wird.
    Das krieg ich schon hin, dürfte ähnlich einfach funktionieren wie bei VBS, damit hab ich schon einiges gebastelt.

    Mit der If-Abfrage funktioniert es teilweise. Hab jetzt so viel hin und her probiert dass ich so langsam nicht mehr weiß wo mir der Kopf steht.
    Manche Varianten haben nicht zuverlässig funktioniert, mal wurde der Button bei Auswahl eines Eintrags in der ComboBox aktiviert, mal nicht.
    Scheint auch irgendwie Probleme mit der letzten ComboBox zu geben. Scheint dem Skript nicht zu gelingen, mit GetState abzufragen ob nichts oder etwas ausgewählt wurde.

    Mir gelingt es bisher auch nicht, die letzte ComboBox in die Switch - Case Abfrage mit reinzubringen. Schreibe ich die da rein bekommt die ComboBox keinen Inhalt. Steht die ausserhalb wird die einwandfrei befüllt.

    Die dritte CombioBox wird mit

    Code
    _GUICtrlComboBox_AddDir($iComboBoxXYZ, @ScriptDir & "\*.xyz")


    befüllt. Hab ich mir aus der Hilfe rausgesucht. :D

  • Das Skript reiche ich bei Gelegenheit nach, dafür sitz ich grad am falschen Rechner.
    Strings hab ich am Anfang verglichen, wollte nicht so recht deswegen habe ich dann später den Listenindex verglichen.
    Der sollte "-1" sein, wenn nix ausgewählt ist.
    Ne Abfrage vor dem speichern ist auch schon drin. Hatte ich erst auf den Listenindex der dritten ComboBox gesetzt - wollte nicht funktionieren. Ist momentan auf der $iComboData, das funktioniert. Wenn in der drtten ComboBox nix ausgewählt ist speichert das dann halt eine leere Variable.