veniplex
Goto Top

AutoIT - Auf Eingabeaufforderung reagieren

Hallo zusammen,

folgendes Problem:

Ich habe eine AutoIT GUI. In einem Input gebe ich einen Befehl ein, z.B.
ipconfig
. Anschließend drücke ich auf einen Button und AutoIT sendet den befehl an die cmd und gibt mir anschließend das Ergebnis in einem Edit aus.

Wenn ich nun aber einen Befehl wie
time
benutze, bekomme ich keine Rückgabe, da time eine Eingabe erwartet.

Ist es möglich, diese Eingabe ebenfalls in der AutoIT GUI zu realisieren und sozusagen eine "Antwort" an die versteckte cmd zu schicken?


Hier mal mein kleines Codeschnipsel, ist nichts schönes, dient einfach nur zu Testzwecken:
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("ipconfig Test", 657, 428, 267, 242)  
$Button1 = GUICtrlCreateButton("Ausführen", 8, 8, 75, 25)  
$Input1 = GUICtrlCreateInput("", 90, 8, 200, 25)  
$Edit1 = GUICtrlCreateEdit("", 8, 40, 633, 377)  
GUICtrlSetData(-1, "")  
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $Button1
			$befehl = GUICtrlRead($Input1)
			$rueckgabe = ""  
			$pid = Run($befehl,"",@SW_HIDE,6)  
			While 1
				; Rückgabe auslesen
				If StdOutRead($pid,True) Then $rueckgabe &= StdOutRead($pid)
				If StdErrRead($pid,True) Then $rueckgabe &= StdErrRead($pid)
				; bei Fehler ist der Process beendet
				If @error  Then ExitLoop
				; und warten, oder wollen wir den Rechner 100% auslasten
				Sleep(100)
			Wend
			$wert = GUICtrlRead($Edit1)
			GUICtrlSetData($Edit1, $wert&@CRLF&$rueckgabe)
	EndSwitch
WEnd

Content-ID: 313524

Url: https://administrator.de/contentid/313524

Ausgedruckt am: 13.11.2024 um 11:11 Uhr

Pjordorf
Pjordorf 25.08.2016 um 10:33:47 Uhr
Goto Top
Hallo,

Zitat von @veniplex:
Wenn ich nun aber einen Befehl wie
time
benutze, bekomme ich keine Rückgabe, da time eine Eingabe erwartet.
Wenn du nur die Zeit oder das Datum lesen willst tut es ein
time /t
date /t
Ein "time /?" hätte es dir auch gesagt.

Gruß,
Peter
veniplex
veniplex 25.08.2016 um 10:42:10 Uhr
Goto Top
Hallo Pjordorf,

danke dafür, allerdings bezieht sich meine Frage wirklich rein auf die Umsetzung in AutoIT. Der time Befehl sollte nur als Beispiel dienen, damit man nachvollziehen kann was ich mit Eingabe meine face-smile.
129813
129813 25.08.2016 aktualisiert um 11:02:34 Uhr
Goto Top
Hi,
wait a max. defined time for the process to return. If this time is elapsed, make the console visible and bring it to the front. AutoIt has enough Win32 functions to do this.

Regards
colinardo
colinardo 25.08.2016 um 11:36:35 Uhr
Goto Top
Hallo Sascha382,
schreibe den Aufruf stattdessen so:
$pid = Run("cmd /c """ & $befehl & """","",@SW_HIDE,6)  
Grüße Uwe
veniplex
veniplex 25.08.2016 um 12:24:46 Uhr
Goto Top
Hallo colinardo,

das hat auf jeden Fall schonmal geholfen, danke face-smile.

Kannst du mir jetzt noch sagen wie ich mit dem Input auf die Abfrage reagieren kann?

Beispiel:

Ich gebe den Befehl
time
ein, als Ausgabe erhalte ich dann
Aktuelle Zeit: 12:23:02,22
Geben Sie die neue Zeit ein: 
Wenn ich jetzt im Input eingebe
10:00:32,22
, wie kann ich das an die cmd senden, sodass diese weiß, aha er möchte die Zeit in 10:00:32,22 ändern?
colinardo
colinardo 25.08.2016 aktualisiert um 13:33:46 Uhr
Goto Top
Das musst du dann spezifisch je nach Befehl hinterlegen und per StdInWrite() an den Prozess senden. Hier das Beispiel für time
#NoTrayIcon
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <Constants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("ipconfig Test", 657, 428, 267, 242)  
$Button1 = GUICtrlCreateButton("Ausführen", 8, 8, 75, 25)  
$Input1 = GUICtrlCreateInput("", 90, 8, 200, 25)  
$Edit1 = GUICtrlCreateEdit("", 8, 40, 633, 377)  
GUICtrlSetData(-1, "")  
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $Button1
			$befehl = GUICtrlRead($Input1)
			$rueckgabe = ""  
			$pid = Run("cmd /c """ & $befehl & """","",@SW_HIDE,$STDIN_CHILD + $STDOUT_CHILD + $STDERR_CHILD)  
			while ProcessExists($pid)
				Do
					Sleep(10)
					$rueckgabe &= StderrRead($pid)
					$rueckgabe &= StdoutRead($pid)
				Until Not @extended Or @error
				; Prozess is noch nicht fertig ? dann schick ihm Daten per Stdin
				if ProcessExists($pid) then
					StdinWrite($pid,"10:00:00" & @CRLF)  
					StdinWrite($pid)
				EndIf
				Do
					Sleep(10)
					$rueckgabe &= StderrRead($pid)
					$rueckgabe &= StdoutRead($pid)
				Until @error
				ExitLoop
			Wend
			$wert = GUICtrlRead($Edit1)
			GUICtrlSetData($Edit1, $wert&@CRLF&$rueckgabe)
	EndSwitch
WEnd