AutoIt/Konsola tekstowa

Konsola tekstowa edytuj

Mimo, że MS Windows jest graficznym systemem operacyjnym, możliwa jest także praca w trybie tekstowym. Tryb ten jest emulowany przez tzw. konsolę tekstową.

Dzięki niej możliwe jest uruchomienie w Windows programów nie posiadających interfejsu graficznego.

Konsola tekstowa składa się z dwóch elementów:

wejście - klawiatura komputerowa

wyjście - wyświetlacz pracujący w trybie tekstowym (emulowany przez okno pracujące w trybie tekstowym).


 

Standardowe strumienie edytuj

Konsola tekstowa komunikuje się z programem poprzez standardowe kanały, zwane strumieniami. Trzy podstawowe połączenia I/O noszą nazwy:

stdin - standard input (standardowy strumień wejścia)

stdout - standard output (standardowy strumień wyjścia)

stderr - standard error (standardowy strumień błędów).

Standardowy strumień wejścia to dane (zwykle tekst) przekazywane do programu.

Standardowy strumień wyjścia to strumień, do którego program zapisuje dane wynikowe.

Standardowy strumień błędów jest zwykle wykorzystywany do wyświetlania komunikatów o błędach i informacjach przydatnych do debugowania.

AutoIt umożliwia przechwytywanie transmisji w tych strumieniach, dzięki czemu z poziomu skryptu można przesyłać dane z i do konsoli.


Interpreter poleceń edytuj

Interpreter poleceń (ang. command processor) – część systemu operacyjnego odpowiedzialna za tłumaczenie poleceń systemowych wprowadzanych przez użytkownika w trybie konwersacyjnym.

Dokonuje on interpretacji wprowadzanych w wierszu poleceń konsoli znaków jako nazw poleceń, programów, plików czy parametrów, a następnie wykonuje stosowne działanie lub wyświetla komunikat błędu, jeżeli polecenie nie zostanie rozpoznane.

Interpretery poleceń to podstawowe programy uruchamiane w konsoli tekstowej. W systemie Windows 7 znajdują się trzy różne:

command.com - interpreter wywodzący się z systemu MS DOS

cmd.exe - interpreter stosowany w rodzinie systemów operacyjnych MS Windows NT, Windows 2000, XP, 2003, Windows Vista i Windows 7, Windows CE oraz OS/2

powershell.exe - nowy, rozbudowany interpreter poleceń, powiązany z platformą .NET Framework (dostępny dla Windowe XP i nowszych)

Wszystkie interpretery mogą pracować także w trybie wsadowym, gdyż zawierają wbudowany język skryptowy (bardzo prosty dla command.com i znacznie bardziej rozbudowany dla powershell.exe).


Współpraca AutoIt z konsolą tekstową edytuj

AutoIt w zasadzie nie służy do tworzenia programów pracujących w trybie tekstowym. Skrypty AutoIt mogą jednak współpracować z aplikacjami konsolowymi, uruchamiać je, przesyłać dane i odbierać wyniki.


Uruchamiane programów konsolowych edytuj

Programy konsolowe uruchamia się za pomocą funkcji Run lub RunWait.

Run ( "nazwa_programu" [, "folder_roboczy" [, stan_okna [, opcje ]]]
RunWait ( "nazwa_programu" [, "folder_roboczy" [, stan_okna [, opcje ]]]

Zostały one opisane w rozdziale:AutoIt / Przejmowanie kontroli / Run.

Jeżeli za pomocą tych funkcji uruchomimy jakiś program konsolowy, to najpierw zostanie wywołana konsola tekstowa, a w niej będzie działał nasz program.

Przykład:

Run("powershell ")

Proces działający w konsoli będzie miał status procesu potomnego w stosunku do procesu skryptu. Aby z poziomu skryptu mieć dostęp do wnętrza konsoli musimy uzyskać dostęp do interesujących nas standardowych strumieni.

Normalnie funkcje Run i RunWait zwracają identyfikator (ID) do uruchamianego procesu. Jednak odpowiednie ustawienie parametru opcje spowoduje, że uzyskany identyfikator zostanie powiązany z konkretnym strumieniem danych.

Parametr opcje może przyjmować następujące wartości (nazwy stałych wg pliku definicji Constants.au3):

0x1 ($STDIN_CHILD)   - powiązanie ze strumieniem STDIN
0x2 ($STDOUT_CHILD)  - powiązanie ze strumieniem STDOUT
0x4 ($STDERR_CHILD)  - powiązanie ze strumieniem STDERR
0x8 ($STDERR_MERGED) - powiązanie ze strumieniem STDOUT i STDERR. Oznacza zarówno $STDOUT_CHILD i $STDERR_CHILD.

Wartości można sumować, np.: $STDERR_CHILD + $STDOUT_CHILD - uzyskujemy powiązanie z obiema strumieniami.

Przykład:

#include <Constants.au3>
$foo = Run("powershell dir c:\ ", "", @SW_SHOW, $STDERR_CHILD + $STDOUT_CHILD)


Kompilacja skryptu jako aplikacji konsolowej edytuj

Aby skrypt w momencie uruchomienia otwierał okno konsoli tekstowej, należy go skompilować jako aplikację konsolową. Aby to uzyskać, na początku skryptu wstawiamy odpowiednią dyrektywę wrappera:

#AutoIt3Wrapper_Change2CUI=y
;
;dalej treść skryptu
;


 

Przechwytywanie strumieni po stronie konsoli edytuj

Funkcje z tej grupy symulują działanie konsoli tekstowej, wysyłają dane do programu i pobierają z programu.

Dzięki temu dane, które normalnie są pobierane i wysyłane przez konsolę mogą być pobierane i wysyłane przez skrypt AutoIt.


UWAGA: Aby możliwe było przechwycenie strumieni danych, program konsolowy musi byś uruchomiony z odpowiednimi parametrami!



Grupa zawiera cztery funkcje. Są to kolejno:

StdinWrite edytuj

StdinWrite ( id_procesu [, dane] )

Funkcja zapisuje dane do standardowego strumienia STDIN. Zwraca ilość wprowadzonych znaków (bajtów). Jeżeli wystąpi błąd makro @error <> 0.

id_procesu - identyfikator procesu konsolowego (uzyskany funkcją Run lub RunWait)

dane - (opcjonalnie) dane przekazywane do programu konsolowego, pominięcie tego parametru oznacza zakończenie transmisji danych)

Za pomocą StdinWrite można przesyłać teksty i dane binarne.


StdoutRead edytuj

StdoutRead ( id_procesu [, peek [, binary]] )

Funkcja zwraca odczytane dane ze standardowego strumienia STDOUT. Jeżeli osiągnięto koniec danych, lub wystąpił inny błąd to makro @error <> 0.

W makrze @extended zwracana jest ilość odczytanych bajtów danych.

id_procesu - identyfikator procesu konsolowego (uzyskany funkcją Run lub RunWait)

peek - jeżeli True to odczytane dane nie są usuwane ze strumienia (domyślnie False, czyli dane są usuwane)

binary - jeżeli True to dane są traktowane jako łańcuch binarny, domyślnie False, czyli dane są traktowane jako tekst

UWAGA: - Aby odczytać wszystkie dane funkcja musi być wywoływana w pętli, aż do osiągnięcia ich końca (@error<>0).

Przykład (skrypt sortuje alfabetycznie wiersze tekstu za pomocą konsolowego programu sort.exe stanowiącego składnik systemu operacyjnego):

#include <Constants.au3>

;uruchomienie programu konsolowego
;parametr $STDIN_CHILD + $STDOUT_CHILD umożliwia przekierowanie obu strumieni
$id = Run("sort.exe", "", "", $STDIN_CHILD + $STDOUT_CHILD)

;przesłanie danych do programu konsolowego poprzez strumień STDIN
StdinWrite($id, "Maria" & @LF & "Beata" & @LF & "Waldemar" & @LF & "Piotr")
StdinWrite($id) ;koniec transmisji

$data = ""
While 1  ;odczytywanie w pętli strumienia STDOUT
   $data &= StdoutRead($id)
   If @error Then ExitLoop
WEnd
MsgBox(0, "Posortowane:", $data)


StderrRead edytuj

StderrRead ( id_procesu [, peek [, binary]] )

Funkcja zwraca odczytane dane ze standardowego strumienia STDERR. Jeżeli osiągnięto koniec danych, lub wystąpił inny błąd to makro @error <> 0.

W makrze @extended zwracana jest ilość odczytanych bajtów danych.

id_procesu - identyfikator procesu konsolowego (uzyskany funkcją Run lub RunWait)

peek - jeżeli True to odczytane dane nie są usuwane ze strumienia (domyślnie False, czyli dane są usuwane)

binary - jeżeli True to dane są traktowane jako łańcuch binarny, domyślnie False, czyli dane są traktowane jako tekst

UWAGA: - Aby odczytać wszystkie dane funkcja musi być wywoływana w pętli, aż do osiągnięcia ich końca (@error<>0).

Przykład (specjalnie wywołujemy nieistniejące polecenie interpretera poleceń aby pokazać sposób odczytu ze strumienia STDERR):

#include <Constants.au3>

;wywołanie systemowego interpretera poleceń
$id = Run(@ComSpec & " /c bleble", '', '', $STDERR_CHILD)
$errmsg = ""

While 1 ;odczyt w pętli ze strumienia STDERR
   $errmsg &= StderrRead($id)
   If @error Then ExitLoop
WEnd
MsgBox(0, "StderrRead:", $errmsg)


StdioClose edytuj

StdioClose ( id_procesu )

Funkcja powoduje natychmiastowe zamknięcie przekierowań dla wszystkich strumieni danego procesu. Zwraca wartość różną od zera gdy sukces, lub 0 gry wystąpił błąd (proces nie miał przekierowania, lub już zostało zamknięte).

Przykład:

#include <Constants.au3>

$id = Run(@ComSpec, '', '', $STDIN_CHILD + $STDOUT_CHILD)
;
;
;
StdioClose($id)


 

Przechwytywanie strumieni po stronie programu edytuj

Funkcje z tej grupy umożliwiają wysyłanie danych do konsoli i pobieranie z konsoli.

Dzięki temu skrypt AutoIt może wysyłać dane do konsoli lub je z niej odczytywać.





Grupa zawiera trzy funkcje. Są to kolejno:

ConsoleRead edytuj

ConsoleRead ( peek [, binary]] )

Funkcja zwraca odczytane dane ze standardowego strumienia STDIN. Jeżeli osiągnięto koniec danych, lub wystąpił inny błąd to makro @error <> 0.

W makrze @extended zwracana jest ilość odczytanych bajtów danych.

peek - jeżeli True to odczytane dane nie są usuwane ze strumienia (domyślnie False, czyli dane są usuwane)

binary - jeżeli True to dane są traktowane jako łańcuch binarny, domyślnie False, czyli dane są traktowane jako tekst

UWAGA: - Aby odczytać wszystkie dane funkcja musi być wywoływana w pętli, aż do osiągnięcia ich końca (@error<>0).

Przykład (skrypt musi być skompilowany):

; Skompilować skrypt
; Wpisać w wierszu poleceń, np.:
; dir | c:\test.exe

#AutoIt3Wrapper_OutFile= "c:\test.exe"

If Not @Compiled Then
   MsgBox(0, "", "Skrypt musi być skompilowany.")
   Exit -1
EndIf

$data = ""
While True
   $data &= ConsoleRead()
   If @error Then ExitLoop
WEnd
;wyświetlenie wyniku wpisanego polecenie w oknie AutoIt
;zamiast w konsoli tekstowej
MsgBox(0, "", "Wynik: " & @CRLF & @CRLF & $data)


ConsoleWrite edytuj

ConsoleWrite ( "dane" )

Funkcja zapisuje dane do standardowego strumienia STDOUT. Zwraca ilość wprowadzonych znaków (bajtów).

dane - dane przekazywane do konsoli

Za pomocą ConsoleWrite można przesyłać teksty i dane binarne.


ConsoleWriteError edytuj

ConsoleWriteError ( "dane" )

Funkcja zapisuje dane do standardowego strumienia STDERR. Zwraca ilość wprowadzonych znaków (bajtów).

dane - dane przekazywane do konsoli

Za pomocą ConsoleWriteError można przesyłać teksty i dane binarne.

Przykład (skrypt musi być skompilowany):

#AutoIt3Wrapper_Change2CUI=y

ConsoleWrite("Uruchomiono program:" & @LF & @AutoItExe)
ConsoleWriteError( @LF & @LF & "ERROR?")
While 1
WEnd


Ćwiczenia edytuj

1. Napisać skrypt umożliwiający uruchamiane w trybie interakcji poleceń i skryptów napisanych w języku interpretera poleceń "cmd.exe". Wyświetlanie wyników i komunikatów błędów w MsgBox.

Przykładowe rozwiązania: AutoIt/Ćwiczenia dla zaawansowanych - przykładowe rozwiązania