Skryptowanie Windowsa: powłoka

Windows jak każdy inny system również da się w bardzo łatwy sposób skryptować. Nie wszyscy mają pojecie na ile sposób i możliwości można to robić. To nie tylko babranie się w powłoce systemowej, która niektórym kojarzy się tylko z czasami panowania DOS’a lub przywilej systemów uniksopodobnych.

Dlatego w kilku najbliższych notkach przedstawię kilka możliwości i sposobów jakie oferuje system Microsoftu w sferze skryptowania i umilania sobie życia. Sam używam głownie tego systemu i bez automatyzacji i skryptów moja praca pewnie byłaby dużo cięższa, a na pewno mniej wygodna.

Po co w ogóle używać skryptów?

Jednym z częstych odpowiedzi na to pytanie jest odpowiedz taka, że skrypty pozwalają na łatwą automatyzację rutynowych i często wykonywanych zadań, nie tylko programistom, czy administratorom, ale także zwykłym użytkownikom.

To prawda, jeśli często musimy wykonywać te same czynności, nie jednokrotnie żmudne, to najprościej napisać skrypt, który nas od nich uwolni, lub przynajmniej w większym stopniu wyręczy, który za nas automatycznie wykona zaplanowane czynności , dzięki czemu zaoszczędzimy i czas i pracę.

Możliwości skryptów są ograniczone tylko wiedzą i wyobraźnią autora, a także możliwościami systemowymi i sprzętowymi komputera.

Może tyle tytułem wstępu. 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.

Wiedząc już wszystko o powłoce systemowej i dostępnych poleceniach oraz narzędziach, można śmiało zabrać się za pisanie skryptów powłoki.

Skrypty powłoki, czasem zwane także plikami wsadowymi, to nic innego jak zwykłe pliki tekstowe ASCII, w których zapisano kolejno wykonywane polecenia i uruchamiane narzędzia z linii poleceń, czyli wszystko to co można wprowadzić ręcznie w konsoli. Po uruchomieniu takiego pliku, wszystkie zawarte w nim polecenia zostaną kolejno wykonywane. Pliki takie muszą posiadać rozszerzenie bat lub cmd.

Skrypty oprócz normalnych poleceń powłoki mogą zawierać dodatkowe instrukcje sterujące, pętle i inne konstrukcje, znane z innych języków programowania. Można również przekazywać dodatkowe dane do skryptu poprzez parametry wywołania. Oraz używać wielu innych możliwości jakie oferuje powłoka poleceń, czyli przekierowania wejścia/wyjścia, potoki i inne…

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. Godne polecenia są windowoswe 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, 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 w notce Wiersz poleceń i PATH.

Żeby nie być gołosłowny, używam wiele skryptów, chociażby prosty skrypt do generowania logu z repozytorium SVN projektu xime i uploadowania go na serwer o północy każdego dnia.

Do wykonania tych czynności aktualnie używam prostego skryptu powłoki:

@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 ;)

Skrypt ten uruchamiany jest o północy każdego dnia przez windowsowy cron – Harmonogram zadań, dostępny również z wiersza poleceń przez wywołanie at.

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

O czym warto pamiętać przy pisaniu skryptów windowsowej powłoki poleceń?

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

@echo off

Warto również na początku skryptu ustawić poprzez setlocal widoczność zmiennych, aby ustawiane przez skrypt zmienne środowiskowe poleceniem set 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, wszelkie 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 poruszano tutaj tematu PowerShella, ponieważ powłoka ta dopiero od Windows 7 znajdzie się domyślnie w systemie, ale i tak nie zastępuje systemowej powłoki poleceń, ale jako konsola tekstowa posiada dużo więcej możliwości, w tym dostęp do platformy .NET.

Tak samo pominięto wszelkie „emulatory” uniksowego basha jak cygwin i inne tego typu zabawki.

Następnym razem co nieco o VBScript i JScript ;)

Jedno przemyślenie nt. „Skryptowanie Windowsa: powłoka”

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *