Übergabe eines Kommandozeilenergebnisses an Variable

  • Hallo,
    bisher hat mir die Hilfe und / oder die Forumergebnisse immer geholfen, aber aus irgendeinem Grund überfordert das meine Fähigkeiten.
    Ich habe folgende Kommandozeile
    "C:\Program Files\RevoUninstaller\RevoCmd.exe" /m keepass*

    Als Ergebnis kommt heraus
    KeePass Password Safe 2.24

    Dieses Ergebnis möchte ich an eine Variable übergeben. Ich habe mir die Hilfe zu Run, StdoutRead etc. und auch die Beiträge im Forum zu den Schlagworten angesehen, aber ich bin vermutlich zu alt dafür.

    Ich wäre also dankbar für die Vervollständigung von
    Run("C:\Program Files\RevoUninstaller\RevoCmd.exe" /m keepass* ... Parameter)

    und

    $Ergebis = ...

    KeePass ist hier nur das Beispiel

    Auf jeden Fall erstmal einen guten Rutsch

    Einmal editiert, zuletzt von schelle (2. Januar 2014 um 15:10)

  • Funktioniert das?

    [autoit]


    $Parameter= "/m keepass"
    $CMD = Run("C:\Program Files\RevoUninstaller\RevoCmd.exe "&$Parameter)
    $Ergebnis = ""
    While 1
    $Ergebnis &= StdoutRead($CMD)
    If @error Then ExitLoop
    Wend
    ConsoleWrite($Ergebnis & @CRLF) ;Ungetestet

    [/autoit]

    Sind TV-Quizfragen zu einfach? A) Ja B) Harry Potter

    Spoiler anzeigen

    Ich gebe zu dieser Post hat wahrscheinlich nicht viel geholfen,
    aber ich versuche wenigstens zu helfen :rolleyes:

  • Hallo,
    danke, aber das klappt auch nicht.
    Nur um es noch mal klarzustellen: Ich möchte nicht auf der Kommandozeile arbeiten, sondern in AutoIt. Ich brauche halt nur diesen Wert.
    Momentan löse ich es so, das ich den Wert in eine Datei schreibe und diesen auslese, aber ich finde das ist nicht das Non-Plus-Ultra.

  • Hi,
    probiere das mal.
    Wenn in der Msgbox etwas dargestellt wird, einfach mit deinem Programmnamen testen

    [autoit]

    #include <Constants.au3>

    [/autoit][autoit][/autoit][autoit]

    $programm = "dir"
    $parameter = "c:" & Chr(92) & "program files (x86)" ;Backslash....:(

    [/autoit][autoit][/autoit][autoit]

    ;ggf auskommentieren
    ;~ $programm="C:\Program Files\RevoUninstaller\RevoCmd.exe"
    ;~ $parameter="/m keepass"

    [/autoit][autoit][/autoit][autoit]

    $string = '"' & $programm & " """ & $parameter& """"
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $string = ' & $string & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console

    [/autoit][autoit][/autoit][autoit]

    ;'"' setzt bei Pfadnamen mit enthaltenen Leerzeichen erforderlichen Anführungsstriche
    Local $out = Run(@ComSpec & " /c " & $string, @ScriptDir, @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD) ;Programm anpassen
    Local $line
    While 1
    $line &= StdoutRead($out)
    If @error Then ExitLoop
    WEnd
    MsgBox(0, "StdoutRead", $line)

    [/autoit]


    //EDIT, klasse, dass die Backslash nicht dargestellt werden ;(

    ciao
    Andy


    "Schlechtes Benehmen halten die Leute doch nur deswegen für eine Art Vorrecht, weil keiner ihnen aufs Maul haut." Klaus Kinski
    "Hint: Write comments after each line. So you can (better) see what your program does and what it not does. And we can see what you're thinking what your program does and we can point to the missunderstandings." A-Jay

    Wie man Fragen richtig stellt... Tutorial: Wie man Script-Fehler findet und beseitigt...X-Y-Problem

    Einmal editiert, zuletzt von Andy (1. Januar 2014 um 20:08)

  • Der Code von PuReIroNie ist auch falsch. Schau dir doch einfach das Beispiel in der Hilfe zu

    [autoit]

    stdoutread

    [/autoit]

    an:


    [autoit]


    ; Demonstriert StdoutRead()
    #include <Constants.au3>

    [/autoit][autoit][/autoit][autoit]

    Local $foo = Run(@ComSpec & " /c dir foo.bar", @SystemDir, @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD)
    Local $line
    While 1
    $line = StdoutRead($foo)
    If @error Then ExitLoop
    MsgBox(0, "STDOUT gelesen:", $line)
    WEnd

    [/autoit][autoit][/autoit][autoit]

    While 1
    $line = StderrRead($foo)
    If @error Then ExitLoop
    MsgBox(0, "STDERR gelesen:", $line)
    WEnd

    [/autoit][autoit][/autoit][autoit]

    MsgBox(0, "Debug", "Wie aufregend...")

    [/autoit]


    Das Beispiel ist zugegebenermaßen nicht optimal, dein Fehler liegt vermutlich auch an der fehlerhaften Bildung des Befehlsstrings für run().

    Du schreibst nämlich:

    [autoit]

    Run("C:\Program Files\RevoUninstaller\RevoCmd.exe" /m keepass* ... Parameter)

    [/autoit]

    Was schonmal einen Syntaxfehler werfen dürfte, da du die Parameter nicht in Anführungszeichen einschließt.

    Richtig wäre eher so:

    [autoit]


    Run("C:\Program Files\RevoUninstaller\RevoCmd.exe /m keepass")

    [/autoit]

    Damit der stdout überhaupt gelesen werden kann muss wie im Hilfebeispiel noch das Flag für $STDOUT_CHILD im run() Aufruf untergebracht werden.

    Hier das überarbeitete Beispiel auf deinen Fall angepasst:

    [autoit]


    #include <Constants.au3>

    [/autoit][autoit][/autoit][autoit]

    $sProgram = 'C:\Program Files\RevoUninstaller\RevoCmd.exe'
    $sParam = '/m keepass'

    [/autoit][autoit][/autoit][autoit]

    $sOut = getCmdOut($sProgram & " " & $sParam)

    [/autoit][autoit][/autoit][autoit]

    ConsoleWrite($sOut & @CRLF)

    [/autoit][autoit][/autoit][autoit]

    Func getCmdOut($sExecute)
    Local $pid = Run(@ComSpec & " /c " & '"' & $sExecute & '"', "", @SW_HIDE, $STDOUT_CHILD)
    Local $sReturn

    [/autoit][autoit][/autoit][autoit]

    While 1
    $sReturn &= StdoutRead($pid)
    If @error Then ExitLoop
    WEnd

    [/autoit][autoit][/autoit][autoit]

    Return $sReturn
    EndFunc

    [/autoit]


    EDIT:

    Tja da war Andy flotter, dafür hab ich ne schöne Funktion draus gemacht. :P

    Einmal editiert, zuletzt von misterspeed (1. Januar 2014 um 17:50)

  • misterspeed,
    teste mal bitte, ob dein Script auch funktioniert, wenn du im Pfadnamen Leerzeichen drin hast

  • Verdammt!

    Hier eine Fassung, die sowohl für DOS commands, als auch normale Programmaufrufe mit und ohne Leerzeichen im Pfad funktionieren sollte:

    Spoiler anzeigen
    [autoit]


    #include <Constants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    ; DOS-Befehl mit Parameter ausführen
    $sProgram = 'dir'
    $sParam = '*.*'
    $sOut = getCmdOut($sProgram,$sParam,True)
    ConsoleWrite($sOut & @CRLF)
    ConsoleWrite(@CRLF & "-----------------------------------" & @CRLF)

    [/autoit] [autoit][/autoit] [autoit]

    ; Normaler Befehl mit Parameter ausführen (Pfad mit Leerzeichen)
    $sProgram = 'C:\Program Files\RevoUninstaller\RevoCmd.exe'
    $sParam = '/m keepass'
    $sOut = getCmdOut($sProgram,$sParam)
    ConsoleWrite($sOut & @CRLF)
    ConsoleWrite(@CRLF & "-----------------------------------" & @CRLF)

    [/autoit] [autoit][/autoit] [autoit]

    ; Normaler Befehl ohne Parameter ausführen (Pfad mit Leerzeichen)
    $sProgram = 'C:\Program Files\RevoUninstaller\RevoCmd.exe'
    $sOut = getCmdOut($sProgram)
    ConsoleWrite($sOut & @CRLF)

    [/autoit] [autoit][/autoit] [autoit]

    Func getCmdOut($sProg,$sParam="",$dosCMD=False)
    Local $pid
    Local $sReturn

    [/autoit] [autoit][/autoit] [autoit]

    If $dosCMD Then
    If $sParam = "" Then
    $pid = Run(@ComSpec & " /c " & $sProg, "", @SW_HIDE, $STDOUT_CHILD)
    Else
    $pid = Run(@ComSpec & " /c " & $sProg & ' ' & $sParam, "", @SW_HIDE, $STDOUT_CHILD)
    EndIf
    Else
    If $sParam = "" Then
    $pid = Run('"' & $sProg & '"', "", @SW_HIDE, $STDOUT_CHILD)
    Else
    $pid = Run('"' & $sProg & '" ' & $sParam, "", @SW_HIDE, $STDOUT_CHILD)
    EndIf
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $sReturn &= StdoutRead($pid)
    If @error Then ExitLoop
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Return $sReturn
    EndFunc

    [/autoit]

    EDIT:

    Andy: Backslash bekommste angezeigt wenn du auf

    [autoit]

    '\'

    [/autoit]

    ausweichst ;)

    Der Foren bzw. BB-Code Bug sollte trotzdem behoben werden, nervt irgendwie...

    3 Mal editiert, zuletzt von misterspeed (1. Januar 2014 um 18:36)