IniWrite Problem

  • Hallo Zusammen,

    ich steh mal wieder auf dem Schlauch :(

    Ich möchte den Value eines Key's in einer Ini-Datei vergleichen. Bei Ungleichheit soll der Key/die Section gelöscht und neu geschrieben werden (die Section hat nur einen Key). Aber das tut er nicht.

    Der Quellcode für das Script sieht so aus:

    Und die Ini-Datei so:

    Code
    [EXCEL]
    ExcelDir=.\

    Durch das "ConsoleWrite" sehe ich, dass sowohl die beiden Strings unterschiedlich sind, als auch der StringCompare ein vernünftiges Ergebnis liefert. Denoch wird entweder das If nicht ausgeführt, oder das Schreiben in die Ini-Datei.

  • Versuchs mal so:

    SciTe 3.7.3

    2 Mal editiert, zuletzt von Moombas (14. Januar 2022 um 11:45)

  • Also mal abgesehen davon, dass du den Array aus "_PathSplit" nicht abfängst, was dazu führt, dass "$pExcelFilePath" nicht gefüllt wird, funktioniert es so leider auch nicht.

    Wie gesagt, der Vergleich funktioniert und ich bekomme ein vernünftiges Ergebnis daraus. Allerdings bleibt die INI-Datei unverändert.

  • Den Array brauch ich nicht abfangen, der Wert wird in die angegebene Variable übergeben und wird bei mir auch vernünftig gefüllt.

    Und auch die Ini Datei wird bei mir nach den Änderungen einwandfrei neu geschrieben.

  • Bei mir ändert er die Ini-Datei nicht, wenn ich eine Verzeichnisebene höher gehe und eine Excel-Datei auswähle. Wenn ich eine Excel-Datei im ScriptOrdner auswähle, ändert er mir die ini-Datei.

    Beim 2. Aufruf des Scripts ändert er mir die ini-datei wieder nicht, wenn ich wieder eine Verzeichnisebene höher gehe und die alte Excel-Datei auswähle.

    IniWrite meldet allerdings jedes mal, erfolgreich in die Datei geschrieben zu haben (Rückgabewert = 1)

  • Das Arbeitsverzeichnis wird beim Start des Skripts auf @ScriptDir festgelegt. Dieser Pfad kann während der Ausführung des Skripts durch Aufrufen von FileChangeDir geändert werden. Beachten Sie jedoch, dass das aktuelle Arbeitsverzeichnis auch durch einige Funktionen automatisch geändert werden kann - z.B. FileOpen/SaveDialog bei erfolgreicher Rückgabe oder Run, wenn der Parameter "Arbeitsverzeichnis" angegeben ist.


    Genau deshalb verwendet Moombas

    Code
       IniDelete(@ScriptDir & "\test.ini", "EXCEL" )
       IniWrite(@ScriptDir & "\test.ini", "EXCEL", "ExcelDir", $pExcelFilePath )

    (die Section hat nur einen Key)

    Warum dann nicht

    Code
    $pExcelDir = IniRead ( @ScriptDir & "\test.ini", "EXCEL", "ExcelDir", @ScriptDir )

    Das Löschen der Section kannst Du Dir auch sparen.

  • Bzw. ich würde für solche Dateien immer eine Global Const setzen.

    Das direkte auslesen des einzelnen Wertes hatte ich jetzt nicht vorgeschlagen, da ich nicht wusste, ob später noch mehr Werte zu der Sektion hinzukommen, die so behandelt werden sollen.

    Aber ich würde wie Velted sonst auch einfach den Wert direkt ansprechen, als eine ganze Sektion.

  • OK, hab das jetzt umgestellt, und es funktioniert!! :)

    Danke Euch beiden! War mein Fehler, ich hab das zwar schon x mal gelesen, dass das @WorkingDir durch den FileOpenDialog verändert wird, aber denk da nie dran. :( Es gibt leider auch keine Möglichkeit, das zu verhindern -.- Da werde ich sicherlich noch ein paar mal drüber stolpern :(

  • JBO 17. Januar 2022 um 10:40

    Hat das Label [ gelöst ] hinzugefügt.
  • Du musst dir das nicht mal generell merken (was so etwas angeht), sondern eher versuchen anzugewöhnen Sachen, die an einem festen Ort liegen auch entsprechend zu definieren und dem Programm nicht die Möglichkeit zu geben durch Workingdir etc. dir da einen Strich durch die Rechnung zu machen.

    Auch würde ich, wie bereits im vorigen Beitrag erwähnt, solche Variablen als Global Const setzen und darauf zugreifen, dann können sie auch nicht im laufenden Script durch Funktionen etc. verändert werden.

    Also anstatt dem "\test.ini", das du 3mal in deinem Script hast, lieber Global Const $IniFile = @ScriptDir & "\test.ini" und dann diese Konstante einsetzen.

  • Du musst dir das nicht mal generell merken (was so etwas angeht), sondern eher versuchen anzugewöhnen Sachen, die an einem festen Ort liegen auch entsprechend zu definieren und dem Programm nicht die Möglichkeit zu geben durch Workingdir etc. dir da einen Strich durch die Rechnung zu machen.

    Auch würde ich, wie bereits im vorigen Beitrag erwähnt, solche Variablen als Global Const setzen und darauf zugreifen, dann können sie auch nicht im laufenden Script durch Funktionen etc. verändert werden.

    Also anstatt dem "\test.ini", das du 3mal in deinem Script hast, lieber Global Const $IniFile = @ScriptDir & "\test.ini" und dann diese Konstante einsetzen.

    ja, in meinem Hauptscript hab ich das auch in eine Variable gespeichert, allerdings nicht CONST. Aber ich muss dann noch überall @ScriptDir davor setzen.