AutoIt/Instrukcje sterujące

Z Wikibooks, biblioteki wolnych podręczników.
Przejdź do nawigacji Przejdź do wyszukiwania

Pętle[edytuj]

While ... Wend[edytuj]

Podstawową pętlą w AutoIt jest pętla While. Pętla jest wykonywana tak długo, jak długo warunek po While jest prawdziwy.

While <warunek>           ; warunek wykonania pętli
   <polecenia>            ; polecenia które chcemy wykonywać w pętli
       ...                
Wend                      ; oznacza koniec pętli

Przykład:

$i = 0 							; początkowa wartość zmiennej $i
While $i < 10 					; sprawdzenie wartość zmiennej $i
	MsgBox(0, "Pętla", $i) 		; wyświetlenie aktualnej wartość $i
	$i += 1 					; zwiększenie o 1 wartość zmiennej $i
WEnd 							; koniec pętli

W tym przypadku pętla zostanie wykonana dziesięć razy, ponieważ przy 11 próbie zmienna $i osiągnie wartość 10, przez co przekroczy warunek pętli while.

Pętla z warunkiem 1 jest wykonywana w nieskończoność.

While 1
   MsgBox(0, "", "Hello World!")
Wend


Do ... Until[edytuj]

Kolejnym typem pętli jest pętla Do...Until. Jest ona bardzo podobna do pętli While, jednak tutaj wprowadzamy warunek zakończenia pętli. Tego typu pętla zawsze będzie wykonana przynajmniej raz (pętla While może nie być wykonana ani razu, gdy warunek od razu nie jest spełniony):

$i = 0
Do
	MsgBox(0, "Pętla", $i)
	$i += 1
Until $i = 10 ; warunek zakończenia pętli


For ... To ... Next[edytuj]

Stosowanie While lub Until jako pętli, która ma wykonana określoną ilość razy nie jest wygodne. Wygodniej jest posłużenie się kolejnym typem pętli:

For <licznik = początkowa wartość> to <Wartość licznika powyżej której pętla nie będzie wykonywana>
   <polecenia, które zostaną wykonywane w pętli>
Next                   ;oznaczenie końca pętli

Za każdym przejściem pętli jej licznik jest zwiększany o 1.

Przykład:

For $i = 1 To 10
	MsgBox(0, "Pętla", $i)
Next

Step jest dodatkowym argumentem pętli For..To.. - oznacza on, o ile będzie się zmieniać wartość $i przy każdym kroku (zamiast domyślnego +1).

W tym przypadku, wartość zmienia się o 2:

For $i = 1 To 10 Step 2
	MsgBox(0, "Pętla", $i)
Next

A w tym odliczanie do tyłu:

For $i = 10 To 1 Step -1
	MsgBox(0, "Pętla", $i)
Next


For ... In ...Next[edytuj]

Pętla po indeksach tablicy (tylko dla tablic jednowymiarowych):

For $zmienna In $tablica
	MsgBox(0, "Pętla", $zmienna)
Next

Zmienna po For przyjmuje wartość kolejnych komórek tablicy.


Składnia AutoIt umożliwia zagnieżdżenie pętli (pętla w pętli):

While 1
	For $repeat = 10 To 1 Step -1 ;
		MsgBox(0, "Pętla", $repeat)
	Next
WEnd


Dodatkowe polecenie wewnątrz pętli[edytuj]

ContinueLoop[edytuj]

Polecenie natychmiastowego powrotu na początek pętli przed osiągnięciem jej końca.

For $i = 10 To 1 Step -1 ;
	If $i = 5 Then ContinueLoop
	MsgBox(0, "Pętla", $i)
Next

W tym przypadku pętla pominie wyświetlanie 5, ponieważ ContinueLoop nakazuje powrót do początku pętli zanim ta mogłaby wyświetlić wartość 5.


Po ContinueLoop można podać liczbę określającą, do którego poziomu pętli mamy wrócić (domyślnie jest to 1). Ma to zastosowanie w pętlach zagnieżdżonych.

Powrót o jeden poziom:

While 1
	For $i = 1 To 10
		MsgBox(0, "Pętla", $i)
		If $i = 5 Then ContinueLoop ;powrót do For
	Next
WEnd

Powrót o dwa poziomy:

While 1
	For $i = 1 To 10
		MsgBox(0, "Pętla", $i)
		If $i = 5 Then ContinueLoop 2 ;powrót do While
	Next
WEnd

ExitLoop[edytuj]

Polecenie natychmiastowego wyjścia z pętli.

For $i = 10 To 1 Step -1
	MsgBox(0, "Pętla", $i)
	If $i = 5 Then ExitLoop
Next

W powyższym przykładzie pętla zakończy się po osiągnięciu wartości 5 przez zmienną $i.

Po ExitLoop można podać liczbę określającą ile poziomów pętli mamy opuścić (domyślnie jest to 1). Ma to zastosowanie w pętlach zagnieżdżonych.

Wyjście o jeden poziom:

While 1
	For $i = 1 To 10
		MsgBox(0, "Pętla", $i)
		If $i = 5 Then ExitLoop ; opuszczenie pętli For...Next - pozostaje wewnątrz While..WEnd
	Next
WEnd

Wyjście o dwa poziomy:

While 1
	For $i = 1 To 10
		MsgBox(0, "Pętla", $i)
		If $i = 5 Then ExitLoop 2 ; opuszczenie pętli For...Next i While...WEnd
	Next
WEnd


Instrukcje warunkowe[edytuj]

If...Elseif...Else...Endif[edytuj]

If <warunek> Then <polecenie>

lub

If <warunek> Then
   <polecenie>
   <polecenie>
      ...
Endif             ; Koniec poleceń wykonywanych przy spełnieniu warunku

Podczas deklarowania warunków można korzystać z operatorów logicznych (OR, AND, NOT):

If <warunek1> <operator logiczny> <warunek2>... Then <polecenie>


Operatory logiczne:

AND - polecenia zostaną wykonane jedynie wtedy, gdy <warunek1> i <warunek2> zostaną spełnione.

OR - polecenia zostaną wykonane jedynie wtedy, gdy <warunek> albo <warunek2> zostanie spełniony.

NOT - Polecenie zostanie wykonane gdy warunek nie zostanie spełniony.

Pozostało omówić jeszcze Elseif...Else:

If <warunek> Then             ; główny warunek
   <instrukcja wykonywana jeśli spełniony zostanie warunek główny>
                               ...
Elseif <inny warunek> Then    ; dodatkowy warunek
   <instrukcja wykonywana jeśli spełniony zostanie drugi warunek, a pierwszy nie>
                               ...
Else
   <instrukcja wykonywana jeśli nie zostanie spełniony żaden z warunków>
                               ...
Endif
$i = 1
While 1
	If $i >= 2 And $i < 11 Then
		MsgBox(0, "Pętla", $repeat)
	EndIf
	$i += 1
WEnd

Polecenia wpisane w warunek Elseif oraz Else zostają wykonane jedynie wtedy, gdy główny warunek nie zostaje spełniony. Po napotkaniu pierwszego spełnionego warunku po If lub Elseif reszta kodu aż do Endif zostanie pominięta.

Polecenia po Else zostaną wykonane tylko wtedy, gdy żaden warunek nie będzie spełniony.

_Przyklad(30)
Func _Przyklad($iWiek)
	If ($iWiek < 0) Then
		MsgBox(0, "Przykład", "Nie można mieć mniej niż 0 lat")
	ElseIf ($iWiek = 0) Then
		MsgBox(0, "Przykład", "Masz 0 lat")
	ElseIf $iWiek >= 1 And $iWiek < 10 Then
		MsgBox(0, "Przykład", "Masz mniej niż 10 lat")
	ElseIf $iWiek >= 10 And $iWiek < 20 Then
		MsgBox(0, "Przykład", "Masz mniej niż 20 lat")
	ElseIf ($iWiek >= 20 And $iWiek < 30) Or $iWiek = 30 Then
		MsgBox(0, "Przykład", "Masz mniej niż 30 lub 30 lat")
	ElseIf $iWiek > 30 And $iWiek < 40 Then
		MsgBox(0, "Przykład", "Masz mniej niż 40 lat")
	ElseIf $iWiek >= 40 And $iWiek < 50 Then
		MsgBox(0, "Przykład", "Masz mniej niż 50 lat")
	Else
		MsgBox(0, "Przykład", "Masz co najmniej 50 lat")
	EndIf
EndFunc   ;==>_Przyklad

Ternery operator (potrójny operator warunkowy)[edytuj]

(warunek) ? (w_1) : (w_2)

Zwraca wartość wyrażenia w_1 gdy warunek jest prawdziwy, lub wyrażenia w_2 gdy warunek jest fałszywy.

$c = ($a > $b) ? $a-$b : 0

jest równoważne następującej sekwencji:

If $a > $b Then
	$c = $a - $b
Else
	$c = 0
EndIf

Operator może być użyty także bez zwracania wartości:

$a = 2
$a>1 ? MsgBox(0,'','$a>1') : MsgBox(0,'','$a<=1')


Switch...Case...Case Else...EndSwitch[edytuj]

Switch <wyrażenie>
   Case <wartość> [To <wartość>] [,<wartość> [To <wartość>] ...]
       <instrukcja>
       ...
   [Case <wartość> [To <wartość>] [,<wartość> [To <wartość>] ...]]
       <instrukcja>
       ...]
   [Case Else
       <instrukcja>
       ...]
EndSwitch


Przykład:

$iMiesiac = 0
While $iMiesiac + 1 < 7
	Switch $iMiesiac + 1
		Case 1 ; gdy wyrażenie $iMiesiac+1 = 1
			MsgBox(0, "", "Styczeń")
		Case 2 ; gdy wyrażenie $iMiesiac+1 = 2
			MsgBox(0, "", "Luty")
		Case 3 To 4, 5 ; gdy wyrażenie $iMiesiac+1 = <od 3 do 4> lub $iMiesiac+1 = 5
			MsgBox(0, "", "Marzec, Kwiecień albo Maj...")
		Case Else
			MsgBox(0, "", "...a teraz na pewno Czerwiec") ; w pozostałych przypadkach
	EndSwitch
	$iMiesiac += 1
WEnd

Select...Case...Case Else...EndSelect[edytuj]

Jest podobne do Switch...Case...EndSwitch jednak w tym przypadku nie jesteśmy ograniczeni 1 argumentem, możemy je dowolnie dobierać.

Select
   Case <warunek>
       <instrukcja>
       ...
   [Case <warunek>
       <instrukcja>
       ...]
   [Case Else
       <instrukcja>
       ...]
EndSelect

Poniższy skrypt wyświetla nazwy miesięcy, ponadto prezentuje zastosowanie Case Else, jako argumentu:

While 1
	Select
		Case $iMiesiac = 1
			MsgBox(0, "", "Styczeń")
		Case $iMiesiac = 2
			MsgBox(0, "", "Luty")
		Case $iMiesiac = 3
			MsgBox(0, "", "Marzec")
		Case $iMiesiac = 4
			MsgBox(0, "", "Kwiecień")
		Case $iMiesiac = 5
			MsgBox(0, "", "Maj")
		Case $iMiesiac = 6
			MsgBox(0, "", "Czerwiec")
		Case Else
			MsgBox(0, "", "Dalej nie odliczam - mam wakacje")
			ExitLoop
	EndSelect
	$iMiesiac = $iMiesiac + 1
WEnd

ContinueCase[edytuj]

Polecenia Switch i Select kończą działanie po natrafieniu na pierwszy spełniony warunek. Można jednak wymusić sprawdzanie następnych warunków używając polecenia ContinueCase, np.:

Switch $a
	Case 1
		$bMessage = False
		ContinueCase
	Case 2 To 5, 10
		$bMessage1 = True
EndSwitch


Inne instrukcje sterujące[edytuj]

Wstrzymanie wykonania skryptu[edytuj]

Sleep ( czas )

Funkcja powoduje wstrzymanie wykonania skryptu na okres czasu podany w milisekundach. Maksymalny okres to 2147483647 ms (24 doby). Funkcja nie zwraca żadnej wartości.

Sleep(5000)  ;wstrzymanie wykonania skryptu na 5 sekund


Zakończenie działania skryptu[edytuj]

Exit

Normalnie działanie skryptu kończy się w momencie osiągnięcia końca kodu. Polecenie Exit umożliwia zakończenie w dowolnym miejscu kodu.

Przykład:

$iNumer = 0
If $iNumer = 0 Then Exit ;jeżeli $iNumer = 0 zakończenie skryptu
MsgBox(0, "", "Komunikat") ;jeżeli $iNumer = 0 komunikat nie będzie wyświetlony

Funkcja Exit może przekazywać wartość. Wtedy wywołanie będzie wyglądało następująco:

Exit kod

lub

Exit (kod)

gdzie kod oznacza przekazywany przez Exit kod, który musi być liczbą typu Integer.

Kod ten zostanie wyświetlony w konsoli i jest przekazywany do makra @exitCode. Kod można odczytać z makra w funkcji zarejestrowanej przez OnAutoItExitRegister.

Domyślna wartość przekazywana wynosi 0.

Forma wywołania Exit() jest niedopuszczalna i powoduje błąd.

Przykład:

$iKod = 777
Exit $iKod