Tym razem zajmiemy się wyświetlaniem okna komunikatu z poziomu skryptu powłoki Windows. Oknu możemy nadać te klawisze, które chcemy, np. Ok, Yes i No, czy jakikolwiek inny zestaw, a także na wyjściu sprawdzić, co user ewentualnie wybrał (jeśli jakiś wybór mu daliśmy 😉 ).

Jeśli chcemy użyć pełnego wachlarza możliwości, stwierdziłem, że najmniejszą linią oporu będzie posłużenie się skryptem VisualBasic i jego funkcją MsgBox, np.:

MsgBox("Are you sure you want to do this??",4,"Haha!")

Pierwszy parametr to treść komunikatu, trzeci to tytuł okna. Drugi parametr, to zestaw przycisków, które mają być udostępnione użytkownikowi do wyboru. Możliwości są następujące:

0 Tylko przycisk OK
1 OK i Cancel
2 Abort, Retry i Ignore
3 Yes, No i Cancel
4 Yes i No
5 Retry i Cancel
16 Użyj ikonki Critical Message
32 Użyj ikonki Warning Query
48 Użyj ikonki Warning Message
64 Użyj ikonki Information Message
0 Pierwszy przycisk jest domyślny
256 Drugi przycisk jest domyślny
512 Trzeci przycisk jest domyślny
768 Czwarty przycisk jest domyślny

Jak widać, mamy tu dostępne trzy grupy. Wybieramy pożądane opcje i sumujemy je, np. chcąc wyświetlić klawisze “Yes” i “No”, dodać ikonkę “Warning Query” i uczynić przycisk “No” domyślnie zaznaczonym, użyjemy wartości 4+32+256:

MsgBox("Are you sure you want to do this??",4+32+256,"Haha!")

Oczywiście, nic nie stoi na przeszkodzie, aby wpisać tam po prostu 292, ale dla późniejszej analizy i edycji, łatwiej pozostawić to w takiej czytelnej postaci.

Skrypt VBS skryptem VBS, ale my chcemy wywołać nasze okienko z regularnego skryptu wsadowego… uciekniemy się do małego tricku i… stworzymy tymczasowy plik vbs i go wywołamy 😉

echo MsgBox("Are you sure you want to do this??",4+32+256,"Haha!") >tempmsg.vbs
call tempmsg.vbs

Tu pojawia się kolejny problem: jak sprawdzić, co wybrał użytkownik? Najpierw, zmusimy nasz skrypt VBS do zwracania na swoim wyjściu wynik funkcji MsgBox – czyli właśnie wybór użytkownika. Robimy to tak:

wscript.quit MsgBox("Are you sure you want to do this??",4+32+256,"Haha!")

Dzięki temu, cały skrypt na swoim wyjściu zwróci wartość wg klucza:

1 OK
2 Cancel
3 Abort
4 Retry
5 Ignore
6 Yes
7 No

W naszym pierwotnym skrypcie, po wywołaniu skryptu VBS, musimy sprawdzić wartość zmiennej %errorlevel%, która wskazuje właśnie na wynik ostatnio wykonanej komendy.

echo wscript.quit MsgBox("Are you sure you want to do this??",4+32+256,"Haha!") >tempmsg.vbs
call tempmsg.vbs
if %errorlevel% NEQ 6 goto finish

echo Jest! Zgodził się! Hurrra!!
echo Tutaj rozkręcamy imprezkę...

:finish
del tempmsg.vbs

Prawda, że proste? 🙂