Zanim plik wsadowy wyrządzi szkodę..

Jako wielki fan Wiersza Poleceń (CMD) i automatyzacji pracy poprzez tworzenie Plików Wsadowych jestem Wam winien jedną przestrogę: z czasem mając coraz więcej plików wsadowych możemy zwyczajnie zapomnieć co w nich drzemie i niechcący uruchomić zestaw komend prowadzących do tragedii 😉 Naprawdę przydatnym nawykiem, a wręcz logicznym obowiązkiem administratora jest nazywanie skryptów tak, aby mówiły nam, co robią np:

Install_Skype_silent.bat (instalacja Skype w trybie „cichym” (bez widocznego okna) )
Inst_VPN_reboot.bat (instalacja klienta VPN i restart komputera)
Pinguj_ serwery_txt.bat (PING’owanie komputerów z pliku serwery.txt)
!!_restartuj_ serwery_txt.bat (restart maszyn z pliku serwery.txt)

W ten prosty sposób częściowo zabezpieczymy się przed uruchomieniem niepożądanych komend. Co jednak z pechowym, niezamierzonym kliknięciem? Jesteśmy tylko ludźmi, zmęczeni, zajęci kilkoma rzeczami na raz lub rozbawieni kolejnym wydaniem GEEK LIFE’a możemy kliknąć o jeden batch za dużo.. Tu warto zastosować dodatkowe zabezpieczenie: na początku kodu możemy wrzucić nasz komentarz i zwykłą pauzę:

@echo off
echo Instalacja VPN i wymuszony restart
pause

Przypadkowe uruchomienie pliku .bat nie spowoduje (jeszcze) uruchomienia właściwego kodu. Stanie się to dopiero po naciśnięciu dowolnego klawisza:

Instalacja VPN i wymuszony restart
Aby kontynuować, naciśnij dowolny klawisz . . .

A jeśli plik wsadowy np. z instalatorem programu ma pokazać się naszym użytkownikom i zależy nam, aby ci byli poinformowani o tym, co za chwilę się stanie? Użytkownicy bardzo często boją się wyskakujących komunikatów, często też klikają w nie „na ślepo”, a przecież w wielu przypadkach instalacja oprogramowania powinna być świadoma. Szczególnie gdy nasz skrypt CMD utrudni im pracę (wyłączy program, rozłączy sieć, obciąży komputer, wymusi restart… )

Osobiście polecam tworzenie pewnego rodzaju ekranów powitalnych, które przykują uwagę użytkownika do „czarnego okienka”. Choć pisemnej gwarancji nie mogę Wam dać, to zapewniam, że poniższy przykład w większości przypadków poinformuje Waszych użytkowników o tym, co za chwile się stanie, a oni świadomie to zaakceptują lub odrzucą:

cls
@echo *******************************************************
@echo *** Rozpoczyna sie instalacja nowego pakietu MS OFFICE.
@echo *** Proces potrwa ok 5-10 minut
@echo *** i zakonczy się automatycznym restartem komputera
@echo ***
@echo *** Zapisz otwarte dokumenty i zamknij aplikacje MS OFFICE,
@echo *** aby nie utracic wynikow swojej pracy
@echo ***
@echo *** …Nacisnij dowolny klawisz aby kontynuowac
@echo *** lub zamknij to okno klikajac na krzyzyk w prawym gornym rogu
@echo ***
@echo *******************************************************
pause >nul
goto zgadzam_sie
cls
:zgadzam_sie
cls

Oto efekt:

*******************************************************
*** Rozpoczyna sie instalacja nowego pakietu MS OFFICE.
*** Proces potrwa ok 5-10 minut
*** i zakonczy sie automatycznym restartem komputera
***
*** Zapisz otwarte dokumenty i zamknij aplikacje MS OFFICE,
*** aby nie utracic wynikow swojej pracy
***
*** …Nacisnij dowolny klawisz aby kontynuowac
*** lub zamknij to okno klikajac na krzyzyk w prawym gornym rogu
***
*******************************************************

W powyższym przykładzie opcje są dwie: albo użytkownik kliknie dowolny klawisz, albo zamknie okienko krzyżykiem. Czy ten wybór, możemy uczynić jeszcze bardziej świadomym? Jeśli jest taka potrzeba to owszem. Program może czekać na wciśnięcie konkretnego klawisza (np. T/N) i zachować się zgodnie z wyborem:

@echo off
:wybor
set /P czy=Czy jestes pewien, ze chcesz kontynuowac? Wybierz [T/N] i nacisnij ENTER
if /I „%czy%” EQU „T” goto :tak
if /I „%czy%” EQU „N” goto :nie
cls
goto :wybor
:tak
echo „Wybrales TAK, zatem rozpoczynamy instalacje…”
pause
exit
:nie
echo „Wybrales NIE. Instalacja anulowana…”
pause
exit

Wyglądać to będzie następująco:

Czy jestes pewien, ze chcesz kontynuowac? Wybierz [T/N] i nacisnij ENTER

To co jest fajne w tym przykładzie, to fakt, że system działa w pętli i będzie czekał na T/N do skutku, chyba że ktoś zamknie okno CMD krzyżykiem, a opcji może być więcej niż dwie. Tak, tak 🙂 W batch’u możemy zbudować całkiem spore menu wyboru:)

Myślę, że warto jeszcze wspomnieć o komendzie timeout, która zatrzyma nasz batch na X sekund (nawet do 99999)

Na przykład w ten sposób zatrzymamy nasz program na 10 sekund, po których wykona się dalsza część kodu:

Timeout 10

Oczekiwanie można zakończyć kliknąwszy w dowolny klawisz. Aby ignorować wciskane klawisze możemy użyć:

timeout 10 /nobreak

W tym wypadku oczekiwanie można zakończyć tylko poprzez całkowite wyłączenie skryptu kombinacją CTRL+C.

Podkreślam jednak, że po limicie czasu wykona się dalsza część Pliku Wsadowego, dlatego też nie można go traktować jako kompletne zabezpieczenie.
Mam nadzieję, że powyższy artykuł po pierwsze pozwoli Wam uniknąć nieprzyjemnych konsekwencji uruchomienia skryptu CMD, a po drugie ułatwi komunikację z użytkownikami. Nikt przecież nie lubi, jak mu Admin gmera na komputerze bez ostrzeżenia 🙂

Łukasz Skalikow

Obecnie Manager IT. Przez lata byłem Inżynierem systemów. Jestem entuzjastą i specem od vSphere, Windows serwer, GPO. Od zawsze byłem zwolennikiem wiersza poleceń i automatyzacji. Obecnie, ze względu na pracę, rodzinę i wyjazdy służbowe, dużo mniej udzielam się na blogu, ale mam nadzieję, że pośród kilkuset porad opublikowanych na spece.it, wiele osób znajdzie dla siebie coś przydatnego :)

Przeczytaj także...

Dodaj komentarz