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))
Ausgabe in CMD mittlerweile möglich ?
-
- [ gelöst ]
-
sc4ry -
24. Februar 2008 um 17:38 -
Geschlossen -
Erledigt
-
-
Dafür hast Du aber auch genau 10.455 Zeilen Code includiert ...
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 -
Also das geht:
[autoit]$PID = Run("Script2.exe",@ScriptDir,@SW_SHOW,1)
[/autoit]
StdInWrite($PID,"HIHI")Script2:
[autoit]Do
[/autoit]
$x = ConsoleRead()
Until $x <> ""
msgBox(0,"",$x) -
???
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
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)
[/autoit]
StdInWrite($PID,"HIHI")Script2:
[autoit]Do
[/autoit]
$x = ConsoleRead()
Until $x <> ""
msgBox(0,"",$x)
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 VersionSpoiler anzeigen
[autoit]#cs
[/autoit] [autoit][/autoit] [autoit]
CMD.au3 -> Use CMD to get UserInput and write to it, even with special chars
Author: Prog@ndy
Version: 1.5Put the following two lines in your Script to use CMD-Funtions:
[/autoit] [autoit][/autoit] [autoit]
#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 ;NoEndSelect
[/autoit] [autoit][/autoit] [autoit]
#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 ---Exit
[/autoit] [autoit][/autoit] [autoit]
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; PASUES CMD, waits for ENTER
[/autoit] [autoit][/autoit] [autoit]
;Prog@ndy
Func _CMD_PAUSE()
_CMD_Write("PAUSE: ENTER drücken")
_CMD_READ()
EndFunc ;==>_CMD_PAUSE;Writes Text to CMD
[/autoit] [autoit][/autoit] [autoit]
;Prog@ndy
Func _CMD_Write($text)
Local $temp = _WinAPI_WriteConsole($GLOBAL_hConsole, CharToOEM($text))
Return SetError(@error, @extended, $temp)
EndFunc ;==>_CMD_Write;REads Text from CMD
[/autoit] [autoit][/autoit] [autoit]
;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])
EndIfReturn SetError(1, 0, "")
[/autoit] [autoit][/autoit] [autoit]
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])
EndIfReturn SetError(1, 0, "")
[/autoit]
EndFunc ;==>CharToOEM -
@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 = Truewird 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 -
- Offizieller Beitrag
Es gibt dazu auch etwas neuere Threads. z.B. hier
-
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:
-