Problem mit GUICtrlRead?

  • Hallo

    Vorspann:
    da ich desöfteren ISO Dateien überprüfen muss, ob diese fragmentiert sind (falls ja gibt es beim booten von Stick Probleme) hab' ich mir gedacht, ich baue mir mal gschwind eine kleine GUI dafür.
    Als externes Programm nutze Contig. (Contig.exe ist ein Konsolenprogramm mit Befehlsparametern) Ich habe Kenntnis davon, dass es bereits Programme zum Download gibt, die mein Vorhaben auch realisieren würden aber ich möchte es zur Übung selbst schreiben.

    Problem:
    Wenn ich einen Pfad zur Abarbeitung auswähle, funktioniert alles perfekt.
    Aber wenn ich eine Datei (oder mehrere Dateien) auswähle, bekomme ich nur eine leere Ausgabe.

    Was habe ich bereits getan um den Fehler auszugrenzen?
    Alles mir bekannte und für mich machbare.

    Wie könnt Ihr mir helfen?
    Bin über jeden nützlichen Hinweis sehr dankbar.

    Hier mein Skript:
    Eigentlich ist es bis auf wenige andere Funktionen fertig, wenn es mir eine (dammne) Ausgabe einer Datei auswerfen würde. Eventuell könnt ihr es ja auch brauchen.

  • Zitat von Helpfile zu FileOpenDialog


    Return Value

    Success: the full path of the file(s) chosen. Results for multiple selections are "Directory|file1|file2|...

    hier mal der enzsprechende Ausschnitt aus meinem [Beispiel] NeMP3-P (MP3-Player) Version 0.8.4.7

  • Hallo autoBert,

    vielen Dank für Deinen Hinweis. Leider komme ich damit nicht ganz klar, denn auch wenn ich den Teil von deinem Code bei mir umsetze, z. B. mit
    Local $dateiwahl = FileOpenDialog($sMessage, @ScriptDir, " (*.iso)", 1 + 2 + 4) komme ich nicht weiter.

    Dein Hinweis auf das Return Value Success:the full path of the file(s) chosen. Results for multiple selections are "Directory|file1|file2|...
    klappt doch bei mir, da ich mehrere Dateien auswählen kann.

    Würdest Du bitte so freundlich sein und mir bei den nötigen Zeilen unter die Arme greifen so dass es zu einer Ausgabe der Dateiinformationen kommt?

    Da lag ich ja dann komplett falsch, den Fehler in GUICtrlRead zu vermuten.

  • Nein FileOpenDialog verwendet einen String, bei nur 1er ausgewählten Datei kein Problem, bei Mehrfachauswahl mußt du den String splitten. Da deine Gui aber ein Inputcontrol und kein LV-Control hat wäre es am einfachsten wenn du $FD_MULTISELECT ((4) = Allow MultiSelect) weglässt, ansonsten müsstest du deine GUI umbauen. Da der MP3-Player als Beispiel gedacht ist, ist er imho gut dokumentiert, solltest du nach Umbau der GUI meine func 1:1 übernehmen (mit Search Replace) können.

  • Hallo autoBert,

    vielen Dank für den Rat. Ich versuche das so umzusetzen wie Du mir rätst. Bin sehr gespannt auf das Resultat. Melde mich hier wieder zurück.

  • Bitte entschuldigt den Doppelpost:

    Ich habe das jetzt so eingebaut. Ich weiß allerdings nicht wirklich, nicht was ich an der GUI verändern soll:

    Das Ergenis ist immer noch eine leere Ausgabe nach Auswahl einer Datei. Bei Auswahl eines Verzeichnisses klappt es. Was muss ich noch ändern?

  • Wie du es schaffst mit FileOpenDialog einen Ordner auszuwähler ist mir ein Rätsel, ich kann nur 1 oder mehrere Dateien auswählen.

    Nur zum verdeutlichen ein ConsoleWrite eingebaut:

    Code
    ConsoleWrite($contigdir & ' *'&@TAB& $Dateiwahl&@CRLF)
    	Local $bericht = Run($contigdir & ' *', $Dateiwahl, @SW_HIDE, $STDIN_CHILD + $STDOUT_CHILD)


    (an den Dateinamenn darfst du dich nicht stären, habe keine ISO's) Consolenausgabe:

    Code
    C:\Users\Bert\AutoIt3.My\Temp\Contig.exe *	C:\Users\Bert\AutoIt3.My\Temp\_GUICtrlEdit_Create.au3
    Code
    C:\Users\Bert\AutoIt3.My\Temp\Contig.exe *	C:\Users\Bert\AutoIt3.My\Temp|_GUICtrlEdit_Create.au3|test.png|_IEHeadInsertEventScript.au3


    ich kenne die möglichen Aufrufparamater der Contig.exe nicht. aber Run erwartet an der Stelle einen Ordnerpfad, von daher sollte das Switchen zu von FileOpenDialog zu FileSelectFolder eine Möglichkeit sein.

    Einmal editiert, zuletzt von autoBert (17. März 2016 um 22:46)

  • Beispiel:

    lg
    Racer


    PS: warum Gettok? Weil ich von RB5 komme (das leider nicht mehr weiterentwickelt wird und lieb gewonnen Sachen man einfach nicht hergibt! :rolleyes:

  • Hallo autoBert,

    Wie du es schaffst mit FileOpenDialog einen Ordner auszuwähler ist mir ein Rätsel, ich kann nur 1 oder mehrere Dateien auswählen.

    bitte entschuldige die im Beitrag zuvor und unausführliche Beschreibung. Ich musste ins Bett, die Augen haben geflimmert. Ich sitze seit 3 Abenden an dem Problem und komme nicht weiter. Heute schon wieder seit 2 Stunden. Ja, ich benötige sehr lange dazu, weil ich versuche viele Dinge selbst auszuprobieren bevor ich frage.

    So, die Erklärung für Deine Frage ist, dass ich einen Pfad manuell ohne den FileOpenDialg zu nutzen, in das Inputfeld eingegeben habe. Ein ausgeählter Pfad funktioniert also. Dazu gibt es bei der Contig.exe bei dem defragmentieren von Verzeichnissen die Möglichkeit einer Wildcard, also den Parameter *

    Nutze ich den FileOpenDialog, wähle ich eine Datei aus. Egal welche (*.*) man kann mit Contig.exe alle Dateiarten defragmentieren. Ich benötige eben nur ISO-Dateien.
    Wenn ich eine Datei untersuchen möchte mit Contig.exe, dann wähle ich den Parameter "-a" "Dateiname", also Contig.exe -a Dateiname

    Im ersten Postig habe ich eine Verlinkung zu Contig. Da stehen auch alle Parameter drin.

    Das Problem wird wie Du vermutest an Local $bericht = Run($contigdir & ' -a', $dateiwahl, @SW_HIDE, $STDIN_CHILD + $STDOUT_CHILD) liegen, da nur ein ein Verzeichnis erwartet wird, ich aber eine Datei aus Local $dateiwahl = GUICtrlRead($Inputbox1) mitgeben muss.


    Zitat von autoBert

    ich kenne die möglichen Aufrufparamater der Contig.exe nicht. aber Run erwartet an der Stelle einen Ordnerpfad, von daher sollte das Switchen zu von FileOpenDialog zu FileSelectFolder eine Möglichkeit sein.


    Das kann ich alleine nicht. Ich poste nochmal den Code im Anschluss so, wie Conig.exe mit dem Parameter -a und einer Datei arbeiten sollte.
    Wie gesagt, ein Verzeichnis über meinen Code auszugeben ist problemlos machbar. Dazu einfach den Parameter von "-a" auf "*" ändern und in die Inputbox ein Verzeichnis von Hand eintragen wie d:\Daten.


    Problematisch ist, dass StdoutRead nur mit Run richtig arbeitet. Oder gibt es noch andere Möglichkeiten, ein externes Konsolenfenster auszulesen?


    Aber ganz ehrlich. Kapieren tu ich es nicht, warum es so kompliziert ist, eine Datei zur Berichtsausgabe mit AutoIt auszugeben, wenn ich es in der Konsole in 2 Sekunden hinbekomme.

    Was muss in einer CMD gemacht werden, um zum Resultat zu kommen?

    In einer CMD tippe ich ein Contig.exe -a Dateiname und fertig. Ich möcht mit meinem Programm


    1. Den Dateipfad auswählen
    2. Mit dem Button "Bericht" möchte ich Contig.exe ausführen und die Ausgabe in eine Textdatei umleiten und ausgeben.


    Racer: Danke für das Beipiel. Es hat mich aber auch nicht weitergebracht.

    Vielleicht gibt es ja eine ganz andere Möglichkeit, mein Vorhaben umzusetzen. Ich wüßte aber nicht wie.

  • Hi,

    In einer CMD tippe ich ein Contig.exe -a Dateiname und fertig.


    warum versuchst du das nicht auch in AutoIt und übergibst den Dateipfad einfach per Parameter mit anstatt über die workingdir:

    AutoIt
    Run($contigdir & ' -a' & " """ & $dateiwahl & """", "", @SW_HIDE, $STDIN_CHILD + $STDOUT_CHILD)


    Ich habe nicht viel Erfahrung mit Run aber das sollte klappen, zumindest bei einzelnen Dateipfaden.

    Leider komplett ungetestet da ich grade kein AutoIt habe.

    mfg,
    Zeitriss

  • Hallo Zeitriss,


    Run($contigdir & ' -a' & " """ & $dateiwahl & """", "", @SW_HIDE, $STDIN_CHILD + $STDOUT_CHILD)

    ist die Lösung gewesen. Klasse Tip. Herzlichen Dank!
    Eine Frage habe ich aber noch. Wo kann ich nachlesen oder bitte erkläre mir, wie die Magie funktioniert. Wie kommst Du auf diese Schreibweise. Was bewirken die Zeichen ' & " """ & $dateiwahl & """", "" genau? Ich dachte dass ich mit Local $bericht = Run($contigdir & '" -a', $Ordnerwahl, @SW_HIDE, $STDIN_CHILD + $STDOUT_CHILD) genau dasselbe erreiche als Du mit Run($contigdir & ' -a' & " """ & $dateiwahl & """", "", @SW_HIDE, $STDIN_CHILD + $STDOUT_CHILD)

    @autoBert, Dir auch herzlichen Dank für Deine Hilfe!

    Somit habe ich das Thema in den erweiterten Einstellungen als erledigt markiert.

  • Wie kommst Du auf diese Schreibweise.

    Du meinst die vierfachen Anführungsstriche?

    Wenn man ein String mit einem Anführungsstrich beginnt muss man zum setzen von Anführungsstrichen innerhalb des Textes diese Doppelt setzen.
    Wenn ich also 4 stück direkt hintereinander schreibe, ( """" ) ergibt das am ende ein einzigen Anführungszeichen.
    Beispiel:

    AutoIt
    MsgBox(0,"Ein Anführungszeichen","""")
    MsgBox(0,"Text mit Anführungszeichen","Hallo ""Welt""")

    Was das gesamte angeht, bei deiner Variante wurde das Programm nur mit dem Parameter -a aufgerufen, da du den Pfad nicht in den ersten Parameter von Run gesetzt hattest sondern in den zweiten.

    Du hast dem Programm also nicht wirklich mitgeteilt welche Datei es bearbeiten soll.
    Als du Ordner bearbeitet hast hat die Contig.exe einfach den Ordner bearbeitet der als workingdir eingetragen war, aber bei Dateien klappt das nicht.
    Bei meiner Varriante wird die Config.exe quasi folgender maßen aufgerufen:
    Contig.exe -a "Dateiname"

    Bei deiner allerdings nur:
    Contig.exe -a

    Da der Dateipfad bei dir nicht im ersten Parameter stand.

    Deine Varriante:
    Local $bericht = Run($contigdir & '" -a', $Ordnerwahl, @SW_HIDE, $STDIN_CHILD + $STDOUT_CHILD)
    - Aufruf
    - Workingdir

    Meine Varriante:


    Run($contigdir & ' -a' & " """ & $dateiwahl & """", "", @SW_HIDE, $STDIN_CHILD + $STDOUT_CHILD)
    - Aufruf
    - Workingdir

    Hoffe jetzt ist es ungefähr verständlich^^

    Edit:
    In der Deutschen Hilfe unter Zeichenketten kann man die Funktionsweise von """" nachlesen:

    mfg
    Zeitriss

    2 Mal editiert, zuletzt von Zeitriss (18. März 2016 um 22:28)

  • Hallo Zeitriss,

    Hoffe jetzt ist es ungefähr verständlich^^

    Es ist für mich nun klar, was ich bei $contigdir & '" -a', $Ordnerwahl, falsch gemacht habe und mir wurde auch nun klar, warum dann folglich Dein Code
    $contigdir & ' -a' & " """ & $dateiwahl & """", funktioniert hat.

    Was mir allerdings nicht klar war, ist welches Workingdir mit "", definiert wurde. Ich dachte bislang, dass sich Blank ("") uses the current working directory logischer Weise automatisch auf den Pfad von "program" Run "program" [, "workingdir" [, show_flag [, opt_flag]]] ) beziehen müsste. Also so was wie @scriptdir sein muss.


    In der Hilfe steht, The working directory. Blank ("") uses the current working directory. This is not the path to the program. Wenn ich folglich richtig gelesen hätte, wäre das event. nicht passiert.


    Blank ( "") verwendet also das aktuelle Arbeitsverzeichnis, das ist nun klar. Was ich aber bisher nicht wußte war, dass AutoIt den Bezug automatisch auf """ & $dateiwahl & """" umsetzen kann. Das ist ganz schön schlau von dem Programmierer von AutoIt gedacht. Für mich schon Magie. Kannn aber auch sein ich blicke das noch nicht richtig.


    Nu, lange Rede kurer Sinn, ich wäre da nie alleine drauf gekommen.


    Vielen Dank für Deine ausführliche Erklärungen. Du hast es so toll geschrieben dass ich es (vermutlich) kapiert habe. :klatschen: Und das will was heißen. :rolleyes:

  • Was mir allerdings nicht klar war, ist welches Workingdir mit "", definiert wurde.

    Nun, das Workingdir ist das Verzeichnis, in dem das Script arbeitet.
    Wenn du in AutoIt dein Programm schreibst kannst du ja bei Dateien im selben Ordner einfach "datei.txt" schreiben. Das geht, weil, wenn du das Programm startest, der Ordner als Workingdir angegeben ist, in dem sich das Programm befindet. Änderst du das Workingdir beim starten, dann würde die "datei.txt" nicht gefunden werden. Das Workingdir spielt also immer eine Rolle, wenn das Programm mit relativen Pfaden arbeitet.
    In Autoit kannst du das auch mit @WorkingDir abfragen.

  • Zitat von Zeitriss

    Zeichenketten


    @Zeitriss
    Vielen Dank für Deinen nachträglichen Edit mit dem verlinken zum Beispiel der Zeichenketten.


    In Autoit kannst du das auch mit @WorkingDir abfragen.

    @Kanashius
    Das werde ich zukünftig machen. Das ist auch bei anderen eingebauten Macroreferenzen in meinen Skripten ein sehr guter Tip. Vielen Dank auch Dir für die Info.