Trochę o plikach wsadowych (Windows) Zmienne środowiskowe Zmienną środowiskową można ustawić na stałe w systemie (Panel sterowania->system- >Zaawansowane ustawienia systemu->zmienne środowiskowe) lub też ustawić je tylko na czas danej sesji (na czas otwarcia okna cmd). Do ustawiania wartości zmiennych na czas sesji służy polecenie set: set ZMIENNA=wartość Do zmiennych możemy się dowoływać w linii poleceń lub plikach wsadowych obejmując je znakami % (procent), np.: echo %PATH% Dodatkowo w plikach wsadowych możemy posługiwać się parametrami wywołania dla plików wsadowych parametry te są numerowane i poprzedzone znakiem % (procent), np. w wywołaniu plik.bat a b c d wartości poszczególnych parametrów będą dostępne jako: %1 = a %2 = b %3 = c %4 = d Ponadto mamy dostęp do nazwy skryptu (%0). W przypadku, kiedy możemy mieć zmienną liczbę parametrów, możemy użyć komendy shift, która przesuwa licznik parametrów, tzn. że możemy zapisać skrypt plik.bat jako: shift shift shift
i wyniki będzie prawidłowy (tzn. będą wyświetlone parametry od 1 do 4). Maski plików, długie i krótkie nazwy plików Każda nazwa pliku w systemie Windows może składać się z nazwy podstawowej oraz rozszerzenia człony te są rozdzielone kropką, przy czym kropki mogą występować w nazwie głównej (wtedy za rozszerzenie pliku przyjmuje się fragment po ostatniej kropce). Rozszerzenie (zazwyczaj) określa rodzaj (przeznaczenie pliku). W wielu poleceniach linii komend możemy posługiwać się tzw. maskami plików, które pozwalają nam wybrać wiele plików i pewnych wspólnych cechach w nazwie. Do maskowania służą znaki: * - który zastępuje dowolny ciąg znaków oraz? - który zastępuje dokładnie jeden znak. Typowe zastosowanie to np. wyszukanie wszystkich plików tekstowych (*.txt) lub bardzie ogólnie wszystkich plików o określonym rozszerzeniu. W przypadku plików z danymi pogodowymi, które nazwa są tak jak lata których dotyczą (1901.txt, 1902.txt,, 2016.txt), możemy np. (do testów wydajnościowych) wybrać tylko część plików (np. tylko pliki, które mają 1 jako ostatnią cyfrę roku: *1.txt lub tylko pliki z określonej dekady: 201?.txt). Warto też wspomnieć o tym, że w nazwach plików można stosować m. in. spacje co nieco komplikuje sytuację, ponieważ w poleceniach linii komend spacja jest traktowana jako separator parametrów dlatego w przypadku takich nazw plików (i katalogów) należy ująć takie nazwy w cudzysłowy (''nazwa pliku''). Przegląd podstawowych komend linii poleceń Aby korzystać z linii poleceń, należy uruchomić program cmd. Podstawową grupę poleceń stanowią komendy do obsługi systemu plików. copy służy do kopiowania pliku(-ów) z jednej lokalizacji do innej; możliwe jest także łączenie plików (jako plików tekstowych: parametr /A lub plików binarnych: /B w przypadku plików tekstowych dodawane są znaki końća linii po każdym pliku); del usuwa grupę plików; Polecenia copy i del nie działają rekurencyjnie (tzn. nie uwzględniają podkatalogów). W przypadku potrzeby skopiowania plików wraz ze strukturą katalogów/podkatalogów należy użyć polecenia xcopy. mkdir, rmdir polecenia do tworzenia i usuwania katalogów; dir listowanie zawartości katalogów; x: - przejście do dysku x (oczywiście zamiast x możemy wstawić dowolną literę dostępnego napędu/dysku) cd katalog przejście do określonego katalogu (podkatalogu); jeżeli nazwa katalogu jest podana bez początkowego znaku backslash (\), to przechodzimy do podkatalogu z pozycji bieżącego podkatalogu, w przypadku kiedy na początku występuje znak \, przechodzimy do
katalogu względem katalogu głównego bieżącego dysku; polecenie cd bez parametrów wyświetli nam informację o bieżącym katalogu. Podstawowe komendy linii poleceń można zawsze wywołać z parametrem /? aby uzsyakć pomoc na temat danego polecenia (np. część z nich m. in. copy, del ma opcje pozwalające na wyłączenie konieczności potwierdzania). Pliki wsadowe Pliki takie pozwalają zebrać grupę często wykonywanych poleceń w całość i zapisać je pod wybraną nazwą. Można też w ten sposób zapisać wywołania programów, które posiadają rozbudowany zbiór parametrów wtedy raz przetestowana konfiguracja parametrów może być zapisana pod określoną nazwą. Plik wsadowe są plikami tekstowymi i do ich edycji wystarczy dowolny edytor tekstowy (np. notatnik). Wyświetlanie komunikatów Do wyświetlania komunikatów, służy polecenie echo. Ale polecenie to służy także do sterowania wyświetlaniem innych komunikatów w przypadku, kiedy chcemy ograniczyć ilość wyświetlanych informacji należy użyć konstrukcji która pozwala wyłączyć wyświetlanie komunikatów (a znak @ na początku nie pozwala na wyświetlanie dodatkowych komunikatów dla tej jednej komendy). Komentarze W przypadku bardziej rozbudowanych skryptów, warto skorzystać z komentarzy: REM Komentarz Sterowanie programem W plikach wsadowych można wykorzystywać komendy znane z programowania, służące do sterowania przepływem informacji; są to instrukcje warunkowe (if), pętle (for) i instrukcje skoku (goto). Instrukcja warunkowa (if) Może być stosowana w postaci if %1== 1 komenda if not %1== 1 komenda lub if exist lokalizacja_pliku komenda
if not exist lokalizacja_pliku komenda Zamiast pojedynczej komendy możemy też wpisać ich kilka, obejmując je zwykłymi nawiasami (). Pętla (for) Występuje w postaci for %%G in (lista) do komenda gdzie lista może być np. listą plików o określonej masce (lub katalogów, jeżeli użyjemy przełącznika /D). Podwójne procenty (%%) stosowane są w plikach wsadowych (w przypadku konieczności wykorzystania komendy for w linii poleceń stosujemy pojedynczy znak %. Możliwe jest także rekurencyjne przeszukiwanie katalogów (przełącznik /R). Przełącznik /F pozwala potraktować zawartość pliku jako listę, tzn. że komenda for /F %%G in (1234.txt) echo %%G nie wyświetli napisu 1234.txt tylko zawartość pliku 1234.txt (linia po linii). Instrukcja skoku (goto) Pomimo tego, że instrukcja taka nie jest lubiana przez programistów, w plikach wsadowych używa się jej dosyć często, np. do sprawdzenia czy podano odpowiednie parametry wywołania: if %1 == goto brak komenda1 komenda2 goto koniec :brak echo nie podałeś parametrów wywołania :koniec Wzajemne wywołania plików wsadowych Do wywołania jednego pliku wsadowego z innego służy komenda call. Bez komendy call sterowanie przechodzi do pliku, tzn. że w przypadku dówch plików plik1.bat echo Jesteś w pliku 1 plik2.bat echo Jesteś nadal w pliku 1 plik2.bat echo Jesteś w pliku 2
wywołanie pliku plik1.bat spowoduje, że napis Jesteś nadal w pliku 1 nie pojawi się, ponieważ w drugiej linii tego pliku sterowanie przeszło do pliku plik2.bat. Fragmenty nazw plików Niekiedy w plikach wsadowych potrzebne są nam tylko fragmenty z całej nazwy pliku, jaki przekazano (np. w poleceniu for). I tak dla zmiennej %%i mamy: %%~di drive %%~pi directory/path %%~ni file name %%~xi file extension %%~zi file size. Po co nam to wszystko W naszym przypadku możemy użyć plików wsadowych do zautomatyzowania procesu wstępnego przetwarzania danych. Dane są zgromadzone w postaci plików spakowanych (gz), pogrupowanych w katalogi dla danego roku. Ponieważ platforma Hadoop słabo sobie radzi z dużą ilością niewielkich plików (a w naszym wypadku jest ich ok. 0.5 miliona), trzeba jej wstępnie przygotować (jeden plik dla danego roku). Plik przetwarzający pojedynczy katalog (do_dir.bat) ma postać: set mdir=g:\bigdata set gzdir=g:\tools\7z mkdir %mdir%\noaa-txt\%1 for /R "%mdir%\noaa\%1" %%I in ("*.gz") do ( ) "%gzdir%\7z.exe" e -o%mdir%\noaa-txt\%1 "%%~fi" copy /A %mdir%\noaa-txt\%1\* %mdir%\noaa-txt\%1\%1.txt del %mdir%\noaa-txt\%1\*-%1 /q Warto zwrócić uwagę, że na początku skryptu ustawiamy ścieżki jako zmienne, co pozwala łatwo modyfikować skrypt w przypadku zmiany struktury katalogów (np. gdy mamy dane na dysku USB, który może być montowany pod różnymi literami napędów). Następnie za pomocą zewnętrznego programu rozpakowujemy pliki gz do odpowiedniego katalogu, łączymy otrzymane pliki w jedne
(copy /A ) i usuwamy rozpakowane pliki. Plik przetwarzający wszystkie katalogi (do_all_dirs.bat) ma postać FOR /D %%G in ("G:\BigData\noaa\*") DO ( Echo We found %%~ng call do_dir %%~ng ) Tutaj nie stosowano już zmiennej do nazwy katalogu bo występuje on tylko raz.