II. Programowanie wsadowe DOS/Windows
1
II. Programowanie wsadowe DOS/Windows
Instrukcj
ę
przygotowano na podstawie materiałów udost
ę
pnionych przez kolegów z Zakładu
Sterowania Wydziału Elektrycznego (Obecnie oryginał instrukcji znajduje si
ę
na stronie
http://www.ee.pw.edu.pl/~graniszw), plików pomocy do systemu Windows oraz materiałów własnych.
1. Wst
ę
p
Program wsadowy jest to ci
ą
g polece
ń
trybu linii komend lub wywoła
ń
programów zapisany w pliku
tekstowym o rozszerzeniu
.bat
Celem programowania wsadowego jest:
•
przyspieszenie pracy
•
personalizacja
ś
rodowiska systemu operacyjnego
W j
ę
zyku programowania wsadowego mo
ż
na stosowa
ć
wszystkie komendy dost
ę
pne w trybie linii
komend. Do sterowania działaniem programu wsadowego słu
żą
komendy steruj
ą
ce:
call
- uruchamia programu wsadowego z poziomu innego programu wsadowego, a
nast
ę
pnie powrót do programu
ź
ródłowego (odpowiednik procedury w j
ę
zykach
wy
ż
szego rz
ę
du)
echo
- wy
ś
wietla komunikaty na ekranie, oraz mo
ż
e słu
ż
y
ć
do wł
ą
czania lub wył
ą
czania
wy
ś
wietlania komunikatów
for
- powtarza komend
ę
dla zestawu zmiennych
goto
- przechodzi do innej cz
ęś
ci programu
If
- wykonuje komendy w zale
ż
no
ś
ci od spełnienia warunku
pause
- zatrzymuje wykonanie programu do czasu wci
ś
ni
ę
cia dowolnego klawisza
rem
- komentarz
shift
- przesuwa parametry programu (
%9
%8,%8
%7 itd.)
W dalszej cz
ęś
ci instrukcji zostan
ą
szczegółowo omówione powy
ż
sze instrukcje.
Informacje o sposobie wywołania komendy uzyskuje si
ę
poprzez wpisanie nazwy komendy z
parametrem
/?
np.:
if /?
. Nazwy programów wsadowych podlegaj
ą
tym samym ograniczeniom,
jak nazwy plików w systemie - dopuszczalne s
ą
długie nazwy. Programy wsadowe uruchamia si
ę
podaj
ą
c w trybie interaktywnym nazw
ę
pliku wsadowego (najlepiej ł
ą
cznie z rozszerzeniem). Plik
wsadowy mo
ż
na tak
ż
e uruchomi
ć
w trybie okienkowym wybieraj
ą
c go poprzez podwójne (lub
jednokrotne - zale
ż
nie od ustawie
ń
) klikni
ę
cie klawiszem myszki - tak jak ka
ż
dy inny program.
Zatrzyma
ć
wykonanie programu wsadowego mo
ż
na poprzez naci
ś
ni
ę
cie kombinacji klawiszy
Ctrl+S
lub
Pause
. Wykonanie programu jest kontynuowane po naci
ś
ni
ę
ciu dowolnego klawisza.
Przerwa
ć
działanie programu wsadowego mo
ż
na poprzez naci
ś
ni
ę
cie kombinacji klawiszy
Ctrl+C
lub
Pause
.
2. U
ż
ywanie Notatnika do tworzenia skryptów.
Skrypty s
ą
plikami tekstowymi, wi
ę
c do ich tworzenia mo
ż
na u
ż
ywa
ć
programu
Notatnik
. Nale
ż
y
jednak uwa
ż
a
ć
na jedn
ą
cech
ę
tego programu: podczas zapisywania dodaje on rozszerzenie
txt
do
nazwy programu, np. zapisuj
ą
c pod nazw
ę
skrypt.bat
program zapisze
skrypt.bat.txt
,
czyli NIE jest to skrypt. Aby
Notatnik
nie dodawał rozszerzenia, to przy pierwszym zapisie (tylko
wtedy podajemy nazw
ę
) oprócz wpisania nazwy i rozszerzenia, np.
skrypt.bat
nale
ż
y na oknie
II. Programowanie wsadowe DOS/Windows
2
dialogowym wybra
ć
opcj
ę
Wszystkie pliki
w okienku
Zapisz jako typ
. Uchroni to
przed dodaniem rozszerzenia
txt
.
Przy przegl
ą
daniu plików za pomoc
ą
standardowego narz
ę
dzia
„Mój komputer”
s
ą
ukryte
znane przez system operacyjny rozszerzenia plików, co utrudnia podejrzenie prawdziwego
rozszerzenia pliku. Aby wył
ą
czy
ć
t
ą
opcj
ę
, nale
ż
y wybra
ć
z menu
Narz
ę
dzia
Opcje
folderów...
a nast
ę
pnie na zakładce
Widok
odznaczy
ć
opcj
ę
Ukryj rozszerzenia
plików znanych typów
.
3. Wy
ś
wietlanie komunikatów
Komunikaty w programach wsadowych mo
ż
na wy
ś
wietla
ć
korzystaj
ą
c z instrukcji
echo
. Składnia
tego polecenia:
echo <Tre
ść
komunikatu>
Aby wy
ś
wietli
ć
pust
ą
lini
ę
nale
ż
y u
ż
y
ć
polecenia
echo.
(z kropk
ą
na ko
ń
cu, bez spacji).
Przykład
echo Program przesuwa pliki z katalogu KAT1 do KAT2
move KAT1 KAT2
dir KAT2
Aby dany tekst nie wy
ś
wietla
ć
na ekranie, ale aby zapisa
ć
do pliku, nale
ż
y posłu
ż
y
ć
si
ę
symbolami
przekierowania
>
oraz
>>
omówionymi w instrukcji do pierwszego
ć
wiczenia.
W celu wy
ś
wietlania dłu
ż
szych tekstów, korzystniej jest zapisa
ć
tre
ść
w pliku tekstowym i wy
ś
wietli
ć
go u
ż
ywaj
ą
c instrukcji
type
- przyspiesza to prac
ę
, szczególnie w sieciach.
Komenda
echo
mo
ż
e by
ć
u
ż
yta do ograniczenia wy
ś
wietlania wykonywanych instrukcji programu. I
tak, aby wył
ą
czy
ć
wy
ś
wietlanie wykonywanych instrukcji nale
ż
y u
ż
y
ć
instrukcji:
echo off
Aby wł
ą
czy
ć
wy
ś
wietlanie wykonywanych instrukcji:
echo on
Efekt podobny do u
ż
ycia
echo off
dla pojedynczej instrukcji mo
ż
na osi
ą
gn
ąć
poprzedzaj
ą
c
instrukcj
ę
znakiem
@
. Warto wspomnie
ć
,
ż
e wywołuj
ą
c polecenie
echo off
pojawi si
ę
na ekranie
ta instrukcja (bo „echo” nie jest jeszcze wył
ą
czone), dlatego najcz
ęś
ciej jest wywoływane polecenie
@
echo off
. Zazwyczaj nie jest po
żą
dane wy
ś
wietlanie poszczególnych polece
ń
ze skryptu,
dlatego te
ż
wi
ę
kszo
ść
skryptów b
ę
dzie si
ę
zaczyna
ć
od tego polecenia.
Przykład
@echo off
echo Program kopiuje pliki tekstowe z katalogu KAT1 do
KAT2
copy KAT1 KAT2
dir KAT2
II. Programowanie wsadowe DOS/Windows
3
4. Komenda
pause
Zatrzymanie programu mo
ż
na wymusi
ć
korzystaj
ą
c z komendy
pause
. Instrukcja
pause
wy
ś
wietla
komunikat
Naci
ś
nij dowolny klawisz aby kontynuowa
ć
...
a nast
ę
pnie oczekuje na wci
ś
ni
ę
cie dowolnego klawisza.
Przykład
@echo off
echo Program kasuje pliki tekstowe w KAT1
echo Zaczynam kasowa
ć
...
pause
del KAT1\*.txt
cls
dir KAT1
W celu pomini
ę
cia wy
ś
wietlania komunikatu, wyj
ś
cie komendy
pause
mo
ż
na przekierowa
ć
na
wyj
ś
cie puste:
nul
, tak jak na poni
ż
szym przykładzie:
echo Naci
ś
nij dowolny klawisz
pause > nul
Ć
wiczenia do wykonania
1. W katalogu, do którego masz prawo do zapisu, utwórz skrypt o nazwie
a.bat
2. Skrypt ma utworzy
ć
nast
ę
puj
ą
c
ą
struktur
ę
katalogów:
.
kat1
kat2
podkatalog jeden
(prosz
ę
zachowa
ć
spacj
ę
w nazwie podkatalogu)
3. W ka
ż
dym podkatalogu prosz
ę
utworzy
ć
plik
nazwa.txt
, który b
ę
dzie zawierał
ś
cie
ż
k
ę
do
tego katalogu (nale
ż
y wykorzysta
ć
polecenie
cd
i przekierowanie strumienia)
5. Etykieta i skok do etykiety
goto
Etykieta jest to nazwa danego wiersza w skrypcie. Etykiety definiuje si
ę
pisz
ą
c nazw
ę
etykiety
poprzedzon
ą
dwukropkiem np.:
:etykieta
Poprzez etykiety i instrukcje skoku
goto
mo
ż
na zmieni
ć
kolejno
ść
wykonywania instrukcji programu.
Składnia polecenia skoku wygl
ą
da nast
ę
puj
ą
co:
goto etykieta
Przykład:
echo Zaraz zostanie wywołana instrukcja skoku
II. Programowanie wsadowe DOS/Windows
4
goto et1
echo To polecenie zostanie pomini
ę
te
:et1
6. Programy z parametrami i polecenie
shift
Programy wsadowe mog
ą
by
ć
wywoływane z parametrami tak jak zwykłe programy/polecenia, np. dla
polecenia copy
plik1 plik2
pierwszym argumentem jest
plik1
, a drugim
plik2
. Dost
ę
p do
parametrów z poziomu programu wsadowego odbywa si
ę
przez u
ż
ycie symboli %0 do %9. Symbol
%0 oznacza nazw
ę
wykonywanego programu wsadowego. Symbole od %1 do %9 odpowiadaj
ą
kolejnym parametrom. W sposób prosty mo
ż
na si
ę
odwoła
ć
do dziewi
ę
ciu parametrów.
Przykład
@echo off
echo Program kopiuje pliki tekstowe
pause
copy %1\*.txt %2
cls
dir %2 /p
Aby móc odczyta
ć
kolejne parametry NIE mo
ż
na posłu
ż
y
ć
si
ę
symbolem
%10
, poniewa
ż
przez
system zostanie to zrozumiane jako parametr pierwszy, do którego zostanie doklejone 0, czyli dla
wywołania:
Skrypt.bat Ala Ola 4 5 6 7 8 9 10 11
parametry b
ę
d
ą
interpretowane w nast
ę
puj
ą
cy sposób
%1 = Ala
%10 = Ala0
Aby móc korzysta
ć
z kolejnych parametrów nale
ż
y u
ż
y
ć
polecenia
shift
, które przesuwa kolejno
ść
argumentów o jeden, tzn. parametr
%1
staje si
ę
parametrem
%0
, parametr
%2
staje si
ę
%1
itd.,
natomiast niedost
ę
pny wcze
ś
niej parametr dziesi
ą
ty staje si
ę
parametrem
%9
(poprzednia warto
ść
parametru
%0
zostanie „skasowana”).
Przykład
@echo off
echo %0
shift
echo %0
shift
echo %0
Po wywołaniu skryptu poleceniem
Skrypt.bat Ala Ola Ela
wy
ś
wietli si
ę
nast
ę
puj
ą
cy wynik:
Skrypt.bat
Ala
II. Programowanie wsadowe DOS/Windows
5
Ola
7. Instrukcja warunkowa
if
W programach wsadowych mo
ż
na u
ż
ywa
ć
instrukcji warunkowej
if
, której ogólna zasada sprowadza
si
ę
do sprawdzenia okre
ś
lonego warunku logicznego i przy jego spełnieniu wykonania dowolnej
instrukcji.
if [not] errorlevel numer instrukcja
(Nawiasy [] oznaczaj
ą
cz
ęść
opcjonaln
ą
.)
Ta posta
ć
instrukcji
if
wykona instrukcj
ę
instrukcja
je
ż
eli kod wyj
ś
ciowy z poprzedniego
programu
(errorlevel
) [nie] jest mniejszy ni
ż
numer.
Przykład
copy nie_ma_tego_pliku.txt plik2.txt
if errorlevel 1 echo Nie udało si
ę
skopiowa
ć
if [not] ci
ą
g1==ci
ą
g2 instrukcja
Wykonanie instrukcji
instrukcja
, je
ż
eli ci
ą
g znaków
ci
ą
g1
[nie] jest równy ci
ą
gowi
ci
ą
g2
.
Aby ustrzec si
ę
przed bł
ę
dami najlepiej jest porównywa
ć
ci
ą
gi znaków wzi
ę
te w cudzysłów. Umo
ż
liwi
to porównywanie pustego ci
ą
gu znaków (dwa cudzysłowy obok siebie) oraz ci
ą
gów znaków ze
spacjami. Je
ż
eli jeden z ci
ą
gów znaków jest parametrem wej
ś
ciowym, to mo
ż
e (ale nie musi) by
ć
wzi
ę
ty w cudzysłów, wówczas ci
ą
g znaków b
ę
dzie w "podwójnym cudzysłowie". Aby si
ę
przed tym
ustrzec, nale
ż
y odwoływa
ć
si
ę
do parametru poprzez
%~1
(znak tylda ~) – wi
ę
cej na ten temat w
dalszej cz
ęś
ci instrukcji.
Przykład
if "%~1"=="kopiuj" goto FCOPY
if "%~1"=="przesun" goto FMOVE
goto EXIT
:FCOPY
copy KAT1 KAT2
goto EXIT
:FMOVE
move KAT1 KAT2
:EXIT
if [not] exist nazwa_pliku instrukcja
Wykonanie instrukcji
instrukcja
je
ż
eli [nie] istnieje plik:
nazwa_pliku
.
Ć
wiczenia do wykonania
1. W katalogu, w którym utworzyłe
ś
skrypt
a.bat
, utwórz skrypt o nazwie
b.bat
2. Skrypt musi by
ć
wywoływany z jednym parametrem. Je
ż
eli uruchomiono skrypt bez podania
parametru, wówczas skrypt ma wy
ś
wietli
ć
ostrze
ż
enie i zako
ń
czy
ć
działanie.
II. Programowanie wsadowe DOS/Windows
6
3. W zale
ż
no
ś
ci od warto
ś
ci tego argumentu skrypt ma wykona
ć
nast
ę
puj
ą
ce działania:
dla
a
– wypisa
ć
na ekranie zawarto
ść
bie
żą
cego katalogu
dla
b
– otworzy
ć
w domy
ś
lnej przegl
ą
darce stron
ę
wydziału elektrycznego
dla c – zapisa
ć
do pliku o nazwie 000.txt</I> bie
żą
c
ą
dat
ę
i godzin
ę
4. W przypadku, gdy argument nie jest równy
ż
adnemu z powy
ż
szych, skrypt ma wy
ś
wietli
ć
odpowiedni komunikat o bł
ę
dzie i po naci
ś
ni
ę
ciu dowolnego klawisza skrypt ma zako
ń
czy
ć
działanie.
8. Instrukcja
for
FOR [opcja] [%% | %]x IN (zbiór) DO polecenie
Instrukcja
for
powtarza komend
ę
dla ka
ż
dej pozycji w zadanym zbiorze, przypisuj
ą
c danej zmiennej
x
kolejne warto
ś
ci z tego zbioru. W ten sposób umo
ż
liwia ona np. uruchomienie okre
ś
lonego
polecenia dla ka
ż
dego pliku znajduj
ą
cego si
ę
w zbiorze.
Zmienna
x
(mo
ż
e to by
ć
oczywi
ś
cie inna nazwa) jest zmienn
ą
steruj
ą
c
ą
. W przypadku, gdy komenda
for
jest wpisywana w linii polece
ń
, to nazwa zmiennej musi by
ć
poprzedzona jednym znakiem
%
. W
przypadku, gdy komenda ta znajduje si
ę
w pliku wsadowym, wymagane jest poprzedzenie jej
%%
.
FOR %I IN (C:\*.*) DO @echo %I
To polecenie wy
ś
wietli list
ę
plików (tylko plików) o dowolnej nazwie z katalogu głównego
c:\
. Prosz
ę
zauwa
ż
y
ć
znak
@
przed poleceniem
echo
: bez tego znaczka za ka
ż
dym razem pojawiałoby si
ę
wykonywane polecenie, a nast
ę
pnie wynik tego poleceni. Znak po prostu
@
eliminuje wy
ś
wietlanie
polecenia.
Skrypt zawieraj
ą
cy t
ę
instrukcj
ę
mógłby wygl
ą
da
ć
tak:
@echo of
FOR %%I IN (C:\*.*) DO echo %%I
echo on
W tym przypadku nale
ż
y zwróci
ć
uwag
ę
na fakt poprzedzenia zmiennej
I
dwoma znakami procent.
Ponadto przed poleceniem
echo
nie ma znaku
@
, poniewa
ż
wy
ś
wietlanie polecenia zostało
wył
ą
czone wcze
ś
niej poleceniem
echo off
.
FOR /D %I IN (C:\*.*) DO @echo %I
Przeł
ą
cznik /D powoduje,
ż
e zamiast plików wyszukiwane s
ą
katalogi.
FOR /R "%USERPROFILE%\Menu Start" %I IN (*.*) DO @echo %I
Przeł
ą
cznik
/R
powoduje,
ż
e wyszukiwanie plików (brak przeł
ą
cznika
/D
) jest rozpoczynane od
katalogu
"%USERPROFILE%\Menu Start"
i kontynuowane we wszystkich podkatalogach.
Zmienna
ś
rodowiskowa
%USERPROFILE%
okre
ś
la
ś
cie
ż
k
ę
dost
ę
pu do katalogu z profilem
u
ż
ytkownika, mo
ż
e by
ć
rozwini
ę
ta do
C:\Documents and Settings\user
. Dodanie
\Menu Start
spowodowało,
ż
e
ś
cie
ż
ka startowa wygl
ą
da nast
ę
puj
ą
co
C:\Documents and
Settings\user\Menu start
. Poniewa
ż
w nazwie katalogu
Menu start
jest spacja,
dlatego konieczne jest wzi
ę
cie
ś
cie
ż
ki w cudzysłów.
II. Programowanie wsadowe DOS/Windows
7
Instrukcja
FOR
umo
ż
liwia ponadto traktowanie zbioru jako zbioru liczb całkowitych (przeł
ą
cznik
/L
)
oraz przetwarzanie danych z pliku (przeł
ą
cznik
/F
). Zainteresowanych odsyłam do pliku pomocy dla
instrukcji
FOR
.
9. Zaawansowane odwoływanie si
ę
do parametrów wywoływania
skryptu.
Je
ż
eli parametrem wywołania skryptu
%1
jest nazwa pliku, a program na tej podstawie musi okre
ś
li
ć
nazw
ę
katalogu, "czyst
ą
" nazw
ę
pliku i oddzielnie rozszerzeniem pliku, wówczas nale
ż
y posłu
ż
y
ć
si
ę
nast
ę
puj
ą
c
ą
składni
ą
:
%~1
- rozwija %I usuwaj
ą
c wszystkie obejmuj
ą
ce cudzysłowy (")
%~f1
- rozwija %I do pełnej nazwy
ś
cie
ż
ki
%~d1
- rozwija %I tylko do litery dysku
%~p1
- rozwija %I tylko do
ś
cie
ż
ki
%~n1
- rozwija %I tylko do nazwy pliku
%~x1
- rozwija %I tylko do rozszerzenia pliku
Charakterystyczny jest tutaj znak ~ (tylda), który usuwa cudzysłowy.
Przykład
@echo off
if not exist "%~1" goto end
echo copy %1 "%~d1%~p1%~n1.bak"
:end
echo on
Ć
wiczenia do wykonania
1.
W katalogu, w którym utworzyłe
ś
skrypt
a.bat
, utwórz skrypt o nazwie c
.bat
2. Skrypt ma utworzy
ć
w katalogu bie
żą
cym plik o nazwie
wynik.log
, do którego zapisze
bie
żą
c
ą
godzin
ę
3. Skrypt ma wyszuka
ć
wszystkie pliki o rozszerzeniu
txt
znajduj
ą
ce si
ę
w katalogu bie
żą
cym i
jego podkatalogach.
4. Dla ka
ż
dego znalezionego pliku skrypt ma wykona
ć
nast
ę
puj
ą
ce trzy rzeczy:
a) wypisa
ć
nazw
ę
pliku wraz ze
ś
cie
ż
k
ą
dost
ę
pu na ekranie
b) dopisa
ć
nazw
ę
pliku wraz ze
ś
cie
ż
k
ą
dost
ę
pu do utworzonego wcze
ś
niej pliku
wynik.log
c) skopiowa
ć
plik do tego samego katalogu pod t
ą
sam
ą
nazw
ę
, ale z innym
rozszerzeniem:
bak