Skryptowanie Windowsa: powłoka

tech • 1038 słów • 5 minut czytania

Windows jak każdy inny system również da się w bardzo łatwy sposób oskryptować. Nie wszyscy mają pojęcie na ile sposób i możliwości można to zrobić. To nie tylko babranie się w powłoce systemowej, która niektórym kojarzy się tylko i wyłącznie z dawnymi czasami panowania DOS-a lub przywilej systemów uniksopodobnych. Dlatego w najbliższych notkach przedstawię kilka możliwości i sposobów jakie oferuje system Microsoftu w sferze skryptowania i ułatwiania sobie życia. Sam używam głównie tego systemu, ale bez automatyzacji i skryptów moja praca pewnie byłaby dużo cięższa, a na pewno mniej wygodna i komfortowa.

Po co w ogóle używać skryptów? Bo skrypty pozwalają na automatyzację rutynowych i często wykonywanych zadań, nie tylko programistom, czy administratorom, ale także zwykłym użytkownikom. Jeśli często musimy wykonywać te same czynności, nie jednokrotnie żmudne i nudne, to najprościej napisać skrypt, który nas od nich uwolni lub przynajmniej w większym stopniu wyręczy i zaoszczędzimy czas. Możliwości skryptów są ograniczone tylko wiedzą i wyobraźnią autora, a także możliwościami systemowymi i sprzętowymi komputera.

Przejdźmy do pierwszego sposobu jaki oferuje nam system w automatyzacji pracy - powłoka systemu.

Powłoka poleceń systemu Windows używa interpretera poleceń cmd.exe, który często zwany jest konsolą lub wierszem poleceń. Nie będę tutaj zbytnio się wgłębiał w same tajniki windowsowej powłoki. Wiele ciekawych informacji można znaleźć na TechNecie Microsoftu, chociażby w artykule “Omówienie powłoki poleceń” gdzie przedstawiono podstawowe i niezbędne informacje o wierszu poleceń, a dalej można zapoznać się z opisem poleceń i narzędzi jakie można wykorzystać w pracy z konsolą dla Windows Server 2k3, Windows XP i Windows Server 2k8. Warto tutaj zaznaczyć fakt, że wraz z każdą nową wersją systemu dodano kilka nowych poleceń, a kilka starych usunięto, ale wykorzystując wspólny podzbiór nasze skrypty powinny być w miarę przenośne, z drugiej strony nie ma sensu również schodzić poniżej wersji XP.

Skrypty powłoki, czasem zwane także plikami wsadowymi, to nic innego jak zwykłe pliki tekstowe ASCII z rozszerzeniem bat lub cmd. W takim pliku zapisano polecenia i uruchamiane narzędzia z linii poleceń, które są kolejno wykonywane po jego uruchomieniu. Skrypty mogą zawierać dokładnie wszystko to co można wprowadzić ręcznie w konsoli i oferuje powłoka systemowa, w tym instrukcje sterujące, pętle lub inne konstrukcje, znane z języków programowania, przekierowania wejścia/wyjścia, potoki i inne… A także przekazywać dodatkowe dane do skryptu poprzez parametry wywołania.

Jak widać windowsowa skrypty powłoki nie ustępują ich uniksowym odpowiednikom. Powłoki obu systemów posiadają podobne, skromne możliwości. Mocy im dodaje dopiero masa programów narzędziowych dostępnych z wiersza poleceń, które w systemach uniksowych są dostępne w standardzie, Windows zawiera ich znikomą ilość, tylko te niezbędne.

Ale nic nie stoi na przeszkodzie, aby samemu pisać takie narzędzia, programy lub korzystać z gotowych jakie można znaleźć w sieci. Tutaj godne polecenia są windowsowe odpowiedniki wielu unikowych programów konsolowych, które dodają takiej samej mocy windowsowej powłoce i skryptom co uniksowym shellom. Można je znaleźć na stronie projektu GnuWin32, ilość dostępnych narzędzi jest dosyć pokaźna. Inny podobny projekt to GNU utilities for Win32.

Chyba nie trzeba wspominać o tym, aby wszelkie narzędzie jakie chcemy mieć dostępne z wiersza poleceń bez babrania się z katalogami i ścieżkami, znajdowały się w jednej z lokalizacji, na jakie wskazuje zmienna środowiskowa PATH? Do łatwego zarządzania zawartością zmiennej PATH można wykorzystać mój prosty skrypcik również w powłoce, o którym pisałem nie tak dawno w notce Wiersz poleceń i PATH.

Żeby nie być gołosłownym, sam używam wielu skryptów do automatyzacji różnych czynności ;)

Dobrym przykładem może być prosty skrypt służący do generowania logu z repozytorium SVN projektu xime i załadowania go na serwer o północy każdego dnia za co odpowiada windowsowy cron1:

@echo off
setlocal

set REPO=file:///E:/repositories/xime
set LOGLIMIT=

set FTP_HOST=host
set FTP_LOGIN=login
set FTP_PASS=pass
set FTP_DIR=/xime.pl

set SVNLOG=%TEMP%\svnlog.txt
set FTPSCRIPT=%TEMP%\ftp.script

echo Log wygenerowano %DATE% %TIME%> %SVNLOG%
echo. >> %SVNLOG%

if not "%LOGLIMIT%" == "" set loglimit=-l %LOGLIMIT%
svn log %LOGLIMIT% %REPO% | iconv -f Windows-1250 -t utf-8 >> %SVNLOG%

echo open %FTP_HOST%> %FTPSCRIPT%
echo %FTP_LOGIN%>> %FTPSCRIPT%
echo %FTP_PASS%>> %FTPSCRIPT%
echo cd %FTP_DIR%>> %FTPSCRIPT%
echo put %SVNLOG%>> %FTPSCRIPT%
echo bye>> %FTPSCRIPT%

ftp -s:%FTPSCRIPT%

del %FTPSCRIPT%
del %SVNLOG%

Jego odpowiednik w uniksowym shellu mógłby wyglądać tak (pominięto ustawianie zmiennych):

echo "Log wygenerowano `date`" > $SVNLOG
echo >> $SVNLOG

if [ -n "$LOGLIMIT" ]; then LOGLIMIT="-l $LOGLIMIT"; fi
svn log $LOGLIMIT $REPO >> $SVNLOG

echo "open $FTP_HOST"				>  $FTPSCRIPT
echo "user $FTP_LOGIN $FTP_PASS"	>> $FTPSCRIPT
echo "cd $FTP_DIR"					>> $FTPSCRIPT
echo "put -a $SVNLOG"				>> $FTPSCRIPT
echo "bye"							>> $FTPSCRIPT

lftp -f $FTPSCRIPT

unlink $SVNLOG
unlink $FTPSCRIPT

Sam upload na ftp, można skrócić do jednej linijki:

lftp -u $FTP_LOGIN,$FTP_PASS $FTP_HOST$FTP_DIR -e "put -a $SVNLOG;quit"

Ale chciałem zachować podobna strukturę co w windowsowym skrypcie do porównania ;)

Podobnego skryptu używam do backupowania danych. Skrypt kompresuje katalogi repozytorium i kilka innych newralgicznych danych, a następnie uploaduje na serwer lub w inne miejsce.

Przy pisaniu skryptów windowsowej powłoki poleceń warto pamiętać o kilku drobnych szczegółach i poradach:

  • Jeśli nie chcemy, aby interpreter wyświetlał wykonywane polecenia ze skryptu możemy dane polecenie poprzedzić znakiem @, albo globalnie w obrębie skryptu wyłączyć funkcją echo: @echo off.

  • Warto na początku skryptu poprzez setlocal ograniczyć widoczność zmiennych. Przez co ustawiane przez skrypt zmienne środowiskowe poleceniem set będą miały zasięg lokalny - aż do końca skryptu, bądź napotkania endlocal. W przeciwnym razie po wykonaniu skryptu ustawione przez niego zmienne będą dostępne w danej instancji konsoli, co nie zawsze może być pożądane.

  • Polecenie echo nie używa znaków " do określania wyświetlanego ciągu tekstu, wszystkie takie znaki zostaną potraktowane jako cześć wyświetlanego komunikatu, dlatego w powyższym skrypcie operator przekierowania wyjścia znajduje się zaraz za treścią, ponieważ wszelkie białe znaki również zostałyby potraktowane jako cześć tekstu.

Ciekawe informacje o pisaniu skryptów powłoki, wierszu poleceń:

Jak będę miał lub znajdę jakiś ciekawy skrypt powłoki to na pewno się podzielę ;)

Celowo nie poruszyłem tutaj tematu PowerShella, ponieważ powłoka ta dopiero od Windows 7 znajdzie się domyślnie w systemie. I tak nie zastąpi ona systemowej powłoki poleceń, ale jako konsola tekstowa posiada dużo więcej możliwości, w tym dostęp do platformy .NET. Z podobnych względów pominąłem wszelkie “emulatory” uniksowego basha jak cygwin i inne tego typu zabawki.

Następnym razem będzie co nieco o skryptowaniu w VBScript i JScript ;)


Przypisy

  1. Odpowiednik unixowego crona w systemie Windows to Harmonogram zadań, dostępny również z wiersza poleceń przez at. ↩︎

Komentarze (0)

Dodaj komentarz

/dozwolony markdown/

/nie zostanie opublikowany/