$CmdLine Fehler

  • Hallo Forum
    Ich schlage mich seit Tagen mit einem Problem herum.

    [autoit]


    ;Programm1: (Start.exe)
    Dim $Parameter[5][5]
    $Parameter[1][1]= „Wert1“
    $Parameter[1][2]= „Wert2“
    $Parameter[1][3]= „Wert3“
    $Parameter[1][4]= „Wert4“
    ShellExecute(@ScriptDir"\Multidestop.exe",'"'&$Parameter[1][1]&$Parameter[1][2]& $Parameter[1][3]& $Parameter[1][4]& '"')
    ;-------------
    ;Program 2: (Multidestop.exe)
    _ArrayDisplay($CmdLine)
    ToolTip($CmdLine[1])

    [/autoit]


    Soweit so gut.
    Wenn die Multidestop.exe gestartet wird, zeigt mir „_ArrayDisplay($CmdLine)“ in 1.Zeile alle Werte zusammen hängend an.
    (Row[1] Wert1Wert2Wert3Wert4)

    Der Rest von dem Array ist leer
    Normal müsste doch jeder Wert in einer eigenen Zeile stehen. ?(
    Wo liegt der Fehler?

  • Zum Debugging gehört vor allem sich Inhalte von Variablen und zu übergebenden Werten mal auszugeben und auf Korrektheit zu prüfen.
    In deinem Fall würde man wohl sich mal den zu übergebenden Parameterstring genauer anschauen - z.B. so:

    [autoit]

    msgbox(0,"", '"'&$Parameter[1][1]&$Parameter[1][2]& $Parameter[1][3]& $Parameter[1][4]& '"')

    [/autoit]

    So sollte schnell klar werden wo das Problem liegt.

  • AspirinJunkie
    Das ist doch wohl logisch das man zuerst mit Msgbox bzw. Tooltip die Werte anschaut.
    Auch mit _ArrayDisplay($Parameter)sind die Werte im 1.Programm korrekt.
    Ich extrahiere diese Daten aus einer Textdatei mit „StringSplit“

    Hast du dir mein Beispiel genauer angeschaut?
    Da wirst du erkennen dass Prop. mit der Übergabe zwischen der 1.exe und der 2.exe etwas nicht stimmt.

    [autoit]


    ;Programm1
    ShellExecute(@ScriptDir"\Multidestop.exe",'"'&$Parameter[1][1]&$Parameter[1][2]& $Parameter[1][3]& $Parameter[1][4]& '"')
    ;------
    ;Programm2
    _ArrayDisplay($CmdLine)

    [/autoit]


    Die „&“ Zeichen zwischen den Parametern sind aber Nötig um die gesamten Daten zu übertragen.
    $CmdLine führt scheinbar keine Trennung durch, sollte es aber machen, denn ansonsten ist währe Array sinnlos.

  • Das ist doch wohl logisch das man zuerst mit Msgbox bzw. Tooltip die Werte anschaut.

    Anschauen alleine reicht offensichtlich nicht, man muss auch verstehen was passiert...

    Hast du ASspirinjunkie´s Beispiel angeschaut? Und es hat bei dir immer noch nicht "geklickt"?


    Wenn die Multidestop.exe gestartet wird, zeigt mir „_ArrayDisplay($CmdLine)“ in 1.Zeile alle Werte zusammen hängend an.

    (Row[1] Wert1Wert2Wert3Wert4)

    GENAU DAS hast du doch auch in deinem Shellexecute so übergeben!


    $CmdLine führt scheinbar keine Trennung durch, sollte es aber machen, denn ansonsten ist währe Array sinnlos.

    Du hast offensichtlich nicht verstanden, dass das Parameter-ARRAY und der daraus von dir gebildete STRING nichts miteinander zu tun haben...
    Wie soll der STRING denn aussehen? Sollen die Parameter durch ein Leerzeichen voneinander getrennt sein? Dann füge die erforderlichen Leerzeichen doch einfach ein...ich verstehe das Problem nicht!

  • Das ist doch wohl logisch das man zuerst mit Msgbox bzw. Tooltip die Werte anschaut.

    Was du anscheinend aber dennoch unterlassen hast.

    wenn du mein kurzes Beispiel ausführst, erhälst du als Ergebnis:

    Code
    "Wert1Wert2Wert3Wert4"

    Und das macht dich überhaupt nicht stutzig?
    Damit übergibst du an das zweite Programm nur einen einzigen Parameter.
    Es gibt nichts (Leerzeichen...) an dem das zweite Programm erkennen könnte, dass es sich um mehrere einzelne Werte handelt.

  • Sorry ich wollte nicht unhöflich sein
    Das mit dem Trennzeichen leuchtet mir ein, nur brachte das keinen Erfolg, daher habe ich euren Tip nicht verstanden. In der Help stand auch nichts von einem zusätzlichen Trennzeichen.
    Auch mit chr(13) oder chr(32) bekomme ich immer das dasselbe Ergebnis

    ShellExecute(@ScriptDir & "\Multidestop.exe", '"'&$Parameter[$Nr][1]&chr(13)&$Parameter[$Nr][2]&chr(13)&$Parameter[$Nr][3]&chr(13)&$Parameter[$Nr][4]&'"')

  • Bei der Parameterübergabe an Programme trennt man einzelne Parameter per Leerzeichen.
    Wenn ein Parameter allerdings selbst ein Leerzeichen enthält schließt man ihn in Anführungszeichen ein, damit dessen Leerzeichen nicht als Parametertrennung interpretiert wird.

    Wenn du deinen Parameterstring folgendermaßen bastelst:

    [autoit]

    MsgBox(0,"", '"' & $Parameter[1][1] & '" "' & $Parameter[1][2] & '" "' & $Parameter[1][3] & '" "' & $Parameter[1][4] & '"')

    [/autoit]

    sollte das gewünschte Ergebnis kommen. Die Anführungszeichen sind dabei wie gesagt nur notwendig, wenn die Werte selbst Leerzeichen enthalten.

  • Danke dir :thumbup:
    Das hat geklappt, das mit dem Leezeichen habe ich noch nicht ganz geschluckt und die vielen Hochkomma bringen mich noch leicht aus dem Konzept. :/
    Naja habe noch viel zu lernen. :whistling:
    Hauptsache das es jetzt läuft.
    Einen dickes plus für Euch

    • Offizieller Beitrag

    Hallo,

    vielleicht wird's ja einfacher wenn du StringFormat nimmst!

    [autoit]

    MsgBox(0,"", StringFormat('"%s" "%s" %s" "%s"', $Parameter[1][1], $Parameter[1][2], $Parameter[1][3], $Parameter[1][4]))

    [/autoit]
  • In der Help stand auch nichts von einem zusätzlichen Trennzeichen.

    das war ein Eigentor.... ;(

    Hier der Link zur engl. Hilfe http://en.helpdoc-online.com/autoit_v3/sour…tro/running.htm

    und die Übersetzung in der deutschen Hilfe....(herauskopiert, schau einfach mal in deine Hilfe, der Foren-Editor bekommt die Darstellung nicht auf die Reihe)
    Sowohl die Trennzeichen als auch deren (doppelte) Maskierung ist sogar mit Beispielen erklärt!

    Spoiler anzeigen

    Skripte ausführen

    Wenn man AutoIt startet, dann wird man nach dem Skript gefragt, welches man öffnen möchte. Eine Skriptdatei ist eine einfache Textdatei, die AutoIt-Schlüsselwörter und -Funktionen enthält, die AutoIt sagen, was es machen soll. Skripte können mit notepad.exe oder einer viel besseren Alternative geschrieben werden.
    Obwohl AutoIt 3-Skripte einfache Textdateien sind, erhalten sie üblicherweise die Endung .au3, damit sich Skripte und Textdateien besser unterscheiden lassen. Wenn man AutoIt komplett installiert hat, kann man ein Skript ausführen, indem man es einfach doppelt anklickt. Man kann auch Optionen wählen - nämlich das Skript zu öffnen, zu bearbeiten oder zu kompilieren - wenn man mit der rechten Maustaste auf die .au3-Datei klickt.
    Hier ein Beispielskript. Es ist zu beachten, dass das ; einen einzeiligen Kommentar einleitet ähnlich REM in MSDOS-Batch-Dateien):
    ; Das ist mein erstes Skript
    MsgBox(0, "Mein erstes Skript!", "Hallo Welt!")
    Kompliziertere Skripte werden Funktionen nutzen, die normalerweise am Ende des Skriptes platziert werden. Hier ein ähnliches Skript mit Funktionen:
    ; Das ist mein erstes Skript (mit Funktionen)
    MsgBox(0, "Mein zweites Skript!", "Hallo aus dem Hauptskript!")
    TestFunc()

    Func TestFunc()
    MsgBox(0, "Mein zweites Skript!", "Hallo aus der Funktion!")
    EndFunc
    Kommandozeilenparameter
    Das besondere Array $CmdLine wird mit den, deinem AutoIt-Skript übergebenen, Kommandozeilenparametern initialisiert. Der Skriptname wird dabei nicht als Parameter aufgefasst; den kann man über @ScriptName herausfinden. Ein Parameter, der Leerzeichen beinhaltet, muss von "doppelten Anführungszeichen" umgeben sein. Kompilierte Skripte akzeptieren Kommandozeilenparameter genauso.

    $CmdLine[0] ist die Anzahl der Parameter
    $CmdLine[1] ist Parameter 1
    $CmdLine[2] ist Parameter 2 etc.
    ...
    $CmdLine[$CmdLine[0]] ist einer der Wege, um den letzten Parameter auszulesen...
    Wenn man also sein Skript so ausführt:
    AutoIt3.exe meinskript.au3 param1 "das ist ein anderer Parameter"
    $CmdLine[0] ergibt... 2
    $CmdLine[1] ergibt... param1
    $CmdLine[2] ergibt... das ist ein anderer Parameter
    @ScriptName ergibt... meinskript.au3
    Zusätzlich zu $CmdLine gibt es noch eine Variable namens $CmdLineRaw, die unformatierten Kommandozeilenparameter enthält. Im obigen Beispiel:
    $CmdLineRaw ergibt... meinskript.au3 param1 "das ist ein anderer Parameter"
    Falls das Skript kompiliert wurde wird es dies ausführen:
    meinskript.exe param1 "das ist ein anderer Parameter"
    $CmdLineRaw entspricht... param1 "das ist ein anderer Parameter"
    Es ist zu beachten, dass $CmdLineRaw nur die Parameter zurückgibt.
    Es ist zu beachten, dass nur 63 Parameter durch $CmdLine[...] zurückgegeben werden können, aber $CmdLineRaw wird immer die komplette Befehlszeile zurückgeben.
    AutoIt spezifische Kommandozeilenparameter
    Form1: AutoIt3.exe [/ErrorStdOut] [/AutoIt3ExecuteScript] Datei [params ...]
    Eine AutoIt3 Skriptdatei ausführen

    /ErrorStdOut
    Erlaubt es fatale Fehler auf StdOut umzuleiten, welches durch eine Anwendung wie den Scite Editor verarbeitet werden kann. Dieser Schalter kann in einem kompilierten Skript verwendet werden.
    Um eine Standard AutoIt Skriptdatei 'meinscript.au3' auszuführen ist dieser Befehl zu verwenden:
    'AutoIt3.exe 'meinscript.au3'
    Form2: Compiled.exe [/ErrorStdOut] [params ...]
    Ausführen einer AutoIt3 Skriptdatei die mit Aut2Exe erstellt wurde.
    Form3: Compiled.exe [/ErrorStdOut] [/AutoIt3ExecuteScript Datei] [params ...]
    So kann direkt aus einer kompilierten AutoIt3 Skriptdatei eine andere nicht kompilierte Skriptdatei gestartet werden. Dann ist es nicht notwendig eine andere Kopie der AutoIT3.exe in der kompilierten Datei zu installieren.

    Form4: Es gibt zwei Möglichkeiten, Anführungszeichen maskieren, um einen Befehl als Zeichenkette einem anderen Befehl zur Ausführung zu übergeben:
    Man umschliesst den zu übergebenden Befehl mit den jeweils anderen Anführungszeichen, also
    $string = "MsgBox(0, 'Hallo Welt!', 'Hi!')"
    oder
    $string = 'MsgBox(0, "Hallo Welt!", "Hi!")'

    Zweite Möglichkeit, Anführungszeichen durch Verdopplung maskieren:
    $string = "MsgBox(0, ""Hallo Welt!"", ""Hi!"")"
    $string = 'MsgBox(0, ''Hallo Welt!'', ''Hi!'')'

    Beispiel:
    MsgBox(0, 'Hallo Welt!', 'Hi!')

    bei direkter Eingabe an der Eingabeaufforderung würde das so aussehen:
    AutoIt.exe /AutoIt3ExecuteLine "MsgBox(0, 'Hallo Welt!', 'Hi!')"
    (Maskierung der einfachen Anführungszeichen mittels doppelter Anführungszeichen)

    Befehlszeile an Run() übergeben:
    Run('AutoIt.exe /AutoIt3ExecuteLine "MsgBox(0, ''Hallo Welt!'', ''Hi!'')"')
    oder
    Run(@AutoItExe & ' /AutoIt3ExecuteLine "MsgBox(0, ''Hallo Welt!'', ''Hi!'')"')


    auch das wäre möglich:
    AutoIt.exe /AutoIt3ExecuteLine 'MsgBox(0, ''Hallo Welt!'', ''Hi!'')'
    (Maskierung der einfachen Anführungszeichen mittels Verdopplung)
    Run(@AutoItExe & ' /AutoIt3ExecuteLine ''MsgBox(0, ''''Hallo Welt!'''', ''''Hi!'''')'' ')
    Die Anführungszeichen der MsgBox werden zur Übergabe an die AutoIt.exe maskiert, und beide zur Übergabe an Run() jeweils erneut maskiert

    Form3 und Form4 für ein kompiliertes Skript durch #NoAutoIt3Execute deaktiviert werden.