Trochę o plikach wsadowych (Windows) Zmienne środowiskowe

Transkrypt

Trochę o plikach wsadowych (Windows) Zmienne środowiskowe
Trochę o
(Windows)
plikach
wsadowych
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:
@echo off
echo %1
shift
echo %1
shift
echo %1
shift
echo %1
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
@echo off
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ć:
@echo off
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ć
@echo off
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.

Podobne dokumenty