Ausgabe in CMD mittlerweile möglich ?

  • Mit API hast du aber mehr Möglichkeiten, z.B. könnte man bei _CMD_Startup noch einen Parameter machen "zwingend neue CMD-Instanz/bestimmte verwenden(per PID))

    Projekte: Keine größeren (und fertigen)
    Gegen Internetzensur:
    https://epetitionen.bundestag.de/index.php?acti…s;petition=3860
    (Zeichnungsfrist abgelaufen)
    __________________________________________________________________________________________________________________________________
    Dieser Beitrag wurde bereits 264 mal editiert, zuletzt von »Fast2« (30. Februar 2009, 12:99)

  • Dafür hast Du aber auch genau 10.455 Zeilen Code includiert ... :D

    Naja, aber Recht hast Du schon, man kann ja noch mehr draus machen.

    Übrigens habe ich im englischsprahigen Forum keine lösung gefunden, die aus dem eigenen Standard-Eingabe-Stream lesen kann.
    Kannst ja da mal posten, wenn Du damit fertig bist. ;)


    Gruß
    Greenhorn


  • ???
    Meinst du sowas wie: Script1 startet Script2 und schreibt dann per StdinWrite in den Eingabe Stream vom 2.Script, welches das dann z.B. per MsgBox ausgeben soll? Wie das geht hab ich mich auch schon gefragt, habe es aber 1. Noch nicht gebraucht und 2. Vergessen zu fragen :D

    Projekte: Keine größeren (und fertigen)
    Gegen Internetzensur:
    https://epetitionen.bundestag.de/index.php?acti…s;petition=3860
    (Zeichnungsfrist abgelaufen)
    __________________________________________________________________________________________________________________________________
    Dieser Beitrag wurde bereits 264 mal editiert, zuletzt von »Fast2« (30. Februar 2009, 12:99)

  • Also das geht:

    [autoit]

    $PID = Run("Script2.exe",@ScriptDir,@SW_SHOW,1)
    StdInWrite($PID,"HIHI")

    [/autoit]

    Script2:

    [autoit]

    Do
    $x = ConsoleRead()
    Until $x <> ""
    msgBox(0,"",$x)

    [/autoit]
  • ???
    Meinst du sowas wie: Script1 startet Script2 und schreibt dann per StdinWrite in den Eingabe Stream vom 2.Script, welches das dann z.B. per MsgBox ausgeben soll? Wie das geht hab ich mich auch schon gefragt, habe es aber 1. Noch nicht gebraucht und 2. Vergessen zu fragen :D


    Nein eigentlich nicht ..., das waren aber die Versuche die ich im engl. Forum gefunden habe.
    Ist wohl auch interessant, aber ich meinte eigentlich Tastatureingaben in das Konsolenfenster des Programms.

    Also das geht:

    [autoit]

    $PID = Run("Script2.exe",@ScriptDir,@SW_SHOW,1)
    StdInWrite($PID,"HIHI")

    [/autoit]

    Script2:

    [autoit]

    Do
    $x = ConsoleRead()
    Until $x <> ""
    msgBox(0,"",$x)

    [/autoit]


    Aber wie aktiviere ich die Tastatureingabe ?
    Ich habe auch versucht mit ConsoleRead() in einer Schleife Tatatureingaben auszulesen, aber die Schleife beendet sich sofort wieder.
    Errorcode für ConsoleRead ist -4, hab aber noch nicht herausgefunden was er bedeutet, die Dokumentation lässt außerdem ein Bspl. fehlen.


    Gruß
    Greenhorn


  • Mit der UDF geht das doch?
    Neue Version :)

    Spoiler anzeigen
    [autoit]

    #cs
    CMD.au3 -> Use CMD to get UserInput and write to it, even with special chars
    Author: Prog@ndy
    Version: 1.5

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

    Put the following two lines in your Script to use CMD-Funtions:

    #include <CMD.au3>
    ; These two lines, if the CMD-Console should be used, if possible
    #AutoIt3Wrapper_Change2CUI=y
    Global Const $_CMD_USEWINDOW = True
    ; This line, if always a new Console should be created:
    ;~ Global Const $_CMD_USEWINDOW = False

    #ce
    #include<WinAPI.au3>
    Global $GLOBAL_hConsole, $GLOBAL_hConsoleIn
    ; Initialize the CMD Funcs
    ; Parameter: [Opt] $ExitOnFatal - If True, The App exits with Fatal error if an error occurs in this Function (Default: False)
    ; Return values: Success: 1
    ; Error: 0 and @error:
    ; 1 - Could not allocate Console -> no In or outuput-Handle
    ; 2 - GetStdHandle for Output failed -> No Output-Handle, too
    ; 3 - GetStdHandle for Input failed, but we have an Ouput-Handle
    ;Author: Prog@ndy
    Func _CMD_STARTUP($ExitOnFatal = 0)
    If Not IsDeclared("_CMD_USEWINDOW") Then
    #Region --- CodeWizard generated code Start ---
    ;MsgBox features: Title=Yes, Text=Yes, Buttons=Yes and No, Default Button=Second, Icon=Critical
    If Not IsDeclared("iMsgBoxAnswer") Then Local $iMsgBoxAnswer
    $iMsgBoxAnswer = MsgBox(276, "No Console App specified!", "You hav to copy these lines to your main-Script, just before you call _CMD_STARTUP:" & @CRLF & "; These two lines, if the CMD-Console should be used, if possible" & @CRLF & " #AutoIt3Wrapper_Change2CUI=y" & @CRLF & " Global $_CMD_USEWINDOW = True" & @CRLF & "; This line, if always a new Console should be created:" & @CRLF & " Global $_CMD_USEWINDOW = False" & @CRLF & @CRLF & " COPY TO CLIPBOARD?")
    Select
    Case $iMsgBoxAnswer = 6 ;Yes
    ClipPut("; These two lines, if the CMD-Console should be used, if possible" & @CRLF & _
    "#AutoIt3Wrapper_Change2CUI=y" & @CRLF & _
    "Global Const $_CMD_USEWINDOW = True" & @CRLF & _
    "; This line, if always a new Console should be created:" & @CRLF & _
    ";~ Global Const $_CMD_USEWINDOW = False")
    Case $iMsgBoxAnswer = 7 ;No

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

    EndSelect
    #EndRegion --- CodeWizard generated code Start ---
    Exit
    ElseIf Not @Compiled Then
    #Region --- CodeWizard generated code Start ---
    ;MsgBox features: Title=Yes, Text=Yes, Buttons=OK, Icon=Critical
    MsgBox(16, "Script Not compiled", "To use CMD-Functions, the Script has to be compiled first.")
    #EndRegion --- CodeWizard generated code Start ---

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

    Exit
    EndIf
    If Not IsDeclared("_CMD_USEWINDOW") Then Local $_CMD_USEWINDOW = True
    If Not $_CMD_USEWINDOW Or Not _WinAPI_AttachConsole() Then
    $ret = DllCall("Kernel32.dll", "long", "AllocConsole")
    If $ret = 0 Then
    If $ExitOnFatal Then _WinAPI_FatalAppExit("Could not allocate Console")
    Return SetError(1, 0, 0)
    EndIf
    EndIf
    Global $GLOBAL_hConsole = _WinAPI_GetStdHandle(1)
    If $GLOBAL_hConsole = -1 Then
    If $ExitOnFatal Then _WinAPI_FatalAppExit("GetStdHandle for Output failed")
    Return SetError(2, 0, 0)
    EndIf
    Global $GLOBAL_hConsoleIn = _WinAPI_GetStdHandle(0)
    If $GLOBAL_hConsoleIn = -1 Then
    If $ExitOnFatal Then _WinAPI_FatalAppExit("GetStdHandle for Input failed")
    Return SetError(1, 0, 0)
    EndIf
    Return 1
    EndFunc ;==>_CMD_STARTUP

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

    ; PASUES CMD, waits for ENTER
    ;Prog@ndy
    Func _CMD_PAUSE()
    _CMD_Write("PAUSE: ENTER drücken")
    _CMD_READ()
    EndFunc ;==>_CMD_PAUSE

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

    ;Writes Text to CMD
    ;Prog@ndy
    Func _CMD_Write($text)
    Local $temp = _WinAPI_WriteConsole($GLOBAL_hConsole, CharToOEM($text))
    Return SetError(@error, @extended, $temp)
    EndFunc ;==>_CMD_Write

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

    ;REads Text from CMD
    ;Prog@ndy
    Func _CMD_READ()
    Local $test = DllStructCreate("char[10000]")
    Local $read = 5000
    Local $temp = _WinAPI_ReadFile($GLOBAL_hConsoleIn, DllStructGetPtr($test), DllStructGetSize($test), $read)
    If @error Then Return SetError(@error, @extended, $temp)
    Return OemToChar(DllStructGetData($test, 1))
    EndFunc ;==>_CMD_READ

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

    ;===============================================================================
    ; Name: OemToChar
    ; Description: Wandelt einen ASCII- in einen ANSI-String
    ; Parameter(s): $szSrc = String der umgewandelt werden soll
    ; Requirement(s): keine
    ; Return Value(s): bei Erfolg: umgewandelter String
    ; bei Fehler: "" und @error = 1
    ; Author(s): bernd670
    ;===============================================================================
    Func OemToChar($szSrc)
    ;~ Private Declare Function OemToChar Lib "user32.dll" Alias "OemToCharA" (ByVal lpszSrc As String, ByVal lpszDst As String) As Long
    Local $placeholder
    For $i = 0 To StringLen($szSrc)
    $placeholder &= " "
    Next
    Local $lRetVal = DllCall("user32.dll", "long", "OemToChar", "str", $szSrc, "str", $placeholder)
    If IsArray($lRetVal) And $lRetVal[0] = 1 Then
    Return SetError(0, 0, $lRetVal[2])
    EndIf

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

    Return SetError(1, 0, "")
    EndFunc ;==>OemToChar

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

    ;===============================================================================
    ; Name: CharToOEM
    ; Description: Wandelt einen ANSI- in einen ASCII-String
    ; Parameter(s): $szSrc = String der umgewandelt werden soll
    ; Requirement(s): keine
    ; Return Value(s): bei Erfolg: umgewandelter String
    ; bei Fehler: "" und @error = 1
    ; Author(s): Prog@ndy
    ;===============================================================================
    Func CharToOEM($szSrc)
    Local $placeholder
    For $i = 0 To StringLen($szSrc)
    $placeholder &= " "
    Next
    Local $lRetVal = DllCall("user32.dll", "long", "CharToOem", "str", $szSrc, "str", $placeholder)
    If IsArray($lRetVal) And $lRetVal[0] = 1 Then
    Return SetError(0, 0, $lRetVal[2])
    EndIf

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

    Return SetError(1, 0, "")
    EndFunc ;==>CharToOEM

    [/autoit]
  • @progandy

    Der Thread ist ja nicht ganz up to date... die UDF aber eigentlich eine feine Sache. Variante 1 funktioniert bei mir nur nicht. D.h. mit

    #AutoIt3Wrapper_Change2CUI=y
    Global Const $_CMD_USEWINDOW = True

    wird zwar ein Konsolenfenster geöffnet und gleichzeitig aber die leere Msgbox. Es kann nichts eingegeben werden und verabschiedet sich dann entsprechend. Autoit 3.3.61. Eine Idee dazu?

    Viele Grüße
    Thomas

  • Auch eine feine Sache. Vielen Dank! Ich checke momentan bloß noch nicht, wie ich das für meine Zwecke einsetzen könnte. Ich will interaktiv einen ssh-client (ssh.exe aus OpenSSH) auslesen und Kommandos senden. Hier checke ich momentan nur, wie ich etwas reinschreibe und auslese... Manchmal steht man aber auch auf dem Schlauch :wacko: