You are on page 1of 9

Ba caách xêy dûång möåt chûúng

trònh batch
Ngön ngûä taåo chûúng trònh lö (batch file) coá nhiïìu
haån chïë. Baâi naây chó caách duâng cöng cuå haån chïë naây
àïí giaãi quyïët möåt vêën àïì rùæc röëi nhû thïë naâo.

öi àaä duâng 3 caách àïí giaãi quyïët möåt vêën àïì DOS röëi rùæm laâ
viïët möåt chûúng trònh chaåy theo lö (batch file) coá thïí lûu cùæt
vaâ khöi phuåc laåi jöåt hû muåc con möåt caách tûå àöång, giöëng caách
thûác cuãa daãi àaánh dêëu trang khi gêåp laåi saádh vaâ ài laâm viïåc
khaác.

Àiïìu gay cêën laâ "daãi àaánh dêëu àiïån tûã" cêìn xaác lêåp möåt biïën
möi
trûúâng trong möåt chûúng trònh lö theo möåt giaá trõ àûúåc hiïín thõ búãi
möåt lïånh DOS nhûng DOS khöng cung cêëp caách thûác àïí laâm àiïìu
naây (xem baâi ài keâm "Nhêån thûác möi trûúâng" coá giaãi thñch ngùæn
goån vïì àùåc tñnh DOS quan troång naây).

Sau àêy laâ möåt vñ duå àún giaãn. Chûúng trònh lö TEST.BAT xaác lêåp
FILENAME nhû laâ thöng söë cho möåt tïn file àûúåc àaánh vaâo taåi
dêëu nhùæc DOS :

SET FILENAME=%1

Khi baån àaánh vaâo doâng lïånh sau àêy :

TEST.BAT LETTER.TXT

DOS thûåc hiïån TEST.BAT giöëng nhû laâ:

SET FILENAME=LETTER.TXT

Nhûng xaác lêåp möåt biïën theo möåt giaá trõ maâ lïånh DOS hiïín thõ
bùçng caách naâo ? Chùèng haån chuáng ta muöën TEST.BAT bao göìm
lïånh CD àïí thïí hiïån thû muåc hiïån thúâi. Muåc àñch cuãa chuáng ta laâ
àùåt thû muåc naây vaâo trong möåt biïën coá tïn laâ CURDIR. Noái caách
khaác, chuáng ta muöën coá möåt lïånh maâ logic cuãa noá laâ :

SET CURDIR=(kïët xuêët tûâ lïånh CD)

Àaáng tiïëc, DOS khöng coá lïånh naâo sûã duång logic naây. Ngön ngûä
lêåp trònh lö seä khöng cho pheáp baån gaán kïët xuêët nhû vêåy trûåc
tiïëp
vaâo möåt biïën, baån chó coá thïí giaán tiïëp laâm viïåc naây.

Àïí xûã trñ tònh caãnh naây, töi àaä tòm ra 3 phûúng phaáp - khöng coá
phûúng phaáp naâo thêåt hoaân thiïån. Chuáng cuâng chó ra möåt kïët
quaã,
nhûng möîi phûúng phaáp coá nhûäng àiïím maånh laâm cho noá töët hún
trong nhûäng cöng viïåc cuå thïí.

Phûúng phaáp 1 : Chûúng trònh lö thûá cêëp Giaãi phaáp chung nhêët laâ
chaåy möåt chûúng trònh thûá cêëp xaác lêåp biïën möi trûúâng vaâ traã
vïì
chûúng trònh lö chñnh. Àïí hiïíu àiïìu naây roä hún, chuáng ta lûúát qua
vò duå "daãi àaánh dêëu saách".

Chûúng trònh lö chñnh cuãa töi laâ MARK.BAT nhúá thû muåc hiïån
thúâi bêët kyâ luác naâo àaánh vaâo MARK. Sau àoá, khi úã trong thû
muåc
khaác, nïëu àaánh MARK\ thò MARK.BAT traã vïì thû muåc ban àêìu.

Trong phiïn baãn 1 MARK1.BAT cuãa chûúng trònh lö naây, töi xaác
lêåp thû muåc hiïån thúâi bùçng caách chuyïín kïët xuêët cuãa lïånh CD
cho
SETIT.BAT, SETIT.BAT chûáa doâng lïånh :

SET CURDIR=

SETIT.BAT laâ baãn sao cuãa möåt tïåp trúå giuáp thûúâng trûåc goåi laâ
SETIT.DAT àûúåc taåo búãi möåt chûúng trònh soaån thaão vùn baãn vaâ
lûu trong cuâng möåt thû muåc con BAT vaâ MARK1.BAT.

SETIT.BAT khöng kïët thuác bùçng kyá tûå "carrigage return". Nïëu
khaác ài, kïët xuêët àûúåc àõnh võ seä thïm vaâo SETIT.BAT nhû laâ
möåt doâng lïånh tiïëp theo vaâ SETIT.BAT seä khöng chaåy. Con
àûúâng dïî nhêët àïí taåo möåt chûúng trònh lö ngùæn nhû thïë laâ bùçng
lïånh COPYCON. Taåi dêëu nhùæc cuãa DOS, haäy àaánh vaâo doâng lïånh
tiïëp theo :

COPY CON SETIT.BAT

Sau àoá àaánh vaâo :

SET CURDIR=

Thay vò nhêën Enter taåi cuöëi doâng, haäy nhêën Ctrl - Z, sau àoá laâ
Enter.

Àêy laâ caác doâng lïånh cuãa MARK1.BAT

COPY C:\BAT\SETIT.DAT
C:\BAT\SETIT.BAT
CD>>C:\BAT\SETIT.BAT
CALL C:\BAT\SETIT. BAT
DEL C:\BAT\ SETIT. BAT

Doâng lïånh àêìu tiïn sao SETIT. DAT thaânh SETIT. BAT. Lyá do
töìn taåi cuãa SETIT. DAT àún giaãn laâ cêìn möåt SETIT. BAT seä dêìn
dêìn chûáa möåt àöëng caác löå trònh thû muåc khöng cêìn thiïët.

Doâng lïånh thûá 2 hûúáng dêîn kïët xuêët tûâ lïånh CD vaâo cuöëi cuãa
file
SETIT. BAT, nhúâ sûã duång dêëu >>. SETIT. BAT bêy giúâ tham
chiïëu túái thû muåc con töi muöën giöëng nhû laâ:

SET CURDIR=C:\123\FILES.

Doâng lïånh thûá 3 goåi SETIT. BAT ra, noá seä xaác lêåp giaá trõ cuãa
CURDIR vaâ traã vïì cho MARK.BAT. Cuöëi cuâng, doâng lïånh thûá 4
xoáa SETIT. BAT, noá seä khöng cêìn thiïët nûäa.

Bêy giúâ, chuáng ta àaä coá möåt caách xaác lêåp CURDIR, chuáng ta coá
thïí viïët möåt vaâi doâng lïånh nûäa àïí traã vïì C:\123\FILES khi chuáng
ta àaánh vaâo MARK\:

ECHO OFF
IF "%1"="GOTO SETDIR
IF "%1"="\"CD%CURDIR%
GOTOEND
:SETDIR
COPY C:\BAT\=SETIT.DAT C:\BAT\SETIT.BAT
CD>>C:\BAT\SETIT.BAT
CALL C:\BAT\SETIT.BAT
DEL C:\BAT\SETIT.BAT
:END

Thoaåt nhòn, viïåc duâng file trúå giuáp thûúâng trûåc SETIT.DAT coá thïí
giöëng nhû laâ con àûúâng voâng vo àïí taåo ra SETIT. BAT. Taåi sao
khöng àïí cho MARK1.BAT taåo ra SETIT. BAT vúái cuâng lïånh
ECHO ? Giaãi phaáp nhû vêåy seä loaåi boã sûå cêìn thiïët töìn taåi
SETIT.DAT. Lïånh sau àêy seä laâm àiïìu àoá :

ECHO SET CURDIR=SETIT.BAT

Nhûng caách tiïëp cêån naây coá möåt sai lêìm nghiïm troång vò khi àoá
SETIT. BAT seä luön luön kïët thuác bùçng möåt kyá tûå "carriage
return". Sûå àõnh võ nhû vêåy kïët xuêët cuãa CD vaâo SETIT. BAT seä
laâ nhû sau :

SET CURDIR=
C:\123\FILES

Khi baån goåi SETIT.BAT sau àoá noá xaác lêåp giaá trõ CURDIR thaânh
röíng, cho baån möåt löîi "File not found" taåi doâng lïånh böí sung vaâ vïì
laåi MARK1.BAT, cöng viïåc khöng hoaân thaânh.

MARK1.BAT coá caác lúåi àiïím laâ àún giaãn vaâ chaåy nhanh. Khuyïët
àiïím cuãa noá laâ baån phaãi duâng file phuå SETIT.DAT. Nïëu baån
chuyïín giao caác chûúng trònh lö cuãa baån trong nhoám baån beâ, thò
rêët coá thïí coá ai àoá nhêån àûúåc baãn sao cuãa MARK.BAT maâ khöng
coá file höí trúå ài keâm. Àöìng thúâi, chûúng trònh lö phaãi chûáa caác löå
trònh cuãa caác file MARK1.BAT.

Phûúng phaáp 2 : Chûúng trònh lö àún nhêët.

Trong phiïn baãn 2 vúái tïn laâ MARK2.BAT, SETIT. BAT trúã
thaânh möåt àoaån trònh úã cuöëi MARK2.BAT. Nghôa laâ doâng cuöëi
cuãa MARK2.BAT laâ

SET CURDIR =

Nhû trûúâng húåp MARK1.BAT, doâng lïånh naây khöng àûúåc kïët
thuác búãi möåt kyá tûå "carriage return".

Nïëu baån duâng EDIT.COM ài keâm theo DOS àïí soaån thaão thò haäy
nhêën töí húåp Ctrl+P vaâ Ctrl+Z taåi cuöëi doâng lïånh cuöëi cuâng àïí
loaåi
boã "carriage return".

MARK2.BAT tûå sao cheáp thaânh chûúng trònh lö thûá cêëp, hûúáng
dûä liïåu tûâ lïånh CD vaâo baãn sao vaâ chaåy baãn sao naây. Sau àêy laâ
nhûäng cêu lïånh chuã yïëu :

ECHO OFF
%GOSET%
IF"%1"=""GOGO SETDIR
IF"%1"="\"CD%CURDIR%
GOTO:END
:SETDIR
COPY C:\BAT\MARK2.BAT
C:\BAT\MARK2A.BAT
SET GOSET=GOTO DIRSET
CD>>C:\BAT\MARK2A.BAT
CALL C:\BAT\MARK2A.BAT
DEL C:\BAT\MARK2A.BAT
SET GOSET=
:END
REM>C:\END.BAT
C:\END
:DIRSET
SET CURDIR=

Giaã sûã chuáng ta chaåy MARK2.BAT lûúåt àêìu. Doâng lïånh thûá 2
göìm coá möåt biïën möi trûúâng GOSET daânh àïí cho baãn sao cuãa
MARK2.BAT laâ MARK2A.BAT sûã duång. Do biïën coân chûa coá
giaá trõ, MARK2.BAT thêëy noá röíng thò boã qua noá vaâ nhaãy àïën
àoaån
SETDIR. Taåi àoá, MARK2.BAT tûå sao ra thaânh MARK2.BAT vaâ
xaác lêåp GOSET thaânh GOTO DIRSET. Sau àoá, noá àõnh hûúáng kïët
xuêët cuãa lïånh CD vaâo MARK2A.BAT. Doâng lïånh cuöëi cuâng cuãa
MARK2A.BAT thay àöíi thaânh:

SET CURDIR=C:123\FILES

MARK2.BAT sau àoá goåi MARK2A.BAT. Khi MARK2A.BAT


àuång doâng lïånh thûá 2, noá xem xeát biïën laâ GOTO DIRSET thò nhaãy
túái àoaån :DIRSET, úã àoá noá xaác lêåp giaá trõ CURDIR búãi lïånh SET
àaä àûúåc böí sung. MARK2A.BAT sau àoá traã vïì MARK2.BAT.
Chûúng trònh naây xoáa MARK2A.BAT vaâ êìn àõnh laåi giaá trõ
GOSET. Cuöëi cuâng, MARK2.BAT thûåc hiïån möåt àoaån trònh nhoã
tïn laâ :END àïí trúã vïì DOS.

Bònh thûúâng thò chûúng trònh lö kïët thuác nhúâ chaåy àoaån trònh
:END. Do doâng lïånh cuöëi cuâng cuãa MARK2.BAT phaãi xaác lêåp giaá
trõ CURDIR, nhûng chuáng ta phaãi kïët thuác chûúng trònh lö tûâ bïn
trong. MARK2.BAT àõnh hûúáng kïët xuêët cuãa lïånh REM vaâo möåt
file tröëng coá tïn laâ END.BAT vaâ chaåy END.BAT. Noá seä khöng
laâm gò caã vaâ àûa baån trúã vïì DOS.

MARK2.BAT luön àùåt END.BAT vaâo thû muåc göëc, nïëu khöng thò
seä phaãi coá nhûäng baãn sao úã khùæp àôa cûáng (nhêån xeát rùçng
END.BAT coá àöå lúán laâ 0 bytes, nghôa laâ noá khöng chiïëm chöí trïn
böå nhúá.

MARK2.BAT lúán hún MARK1.BAT. Àoá laâ möåt trong nhûäng


nhûúåc àiïím, nhûng chó nhoã hún 350 bytes thò noá khöng chiïëm bao
nhiïu böå nhúá. Àöìng thúâi MARK2.BAT àûúåc thiïët kïë kheáp kñn
hún. Tuy nhiïn nhûäng ngûúâi múái hoåc seä khöng dïî daâng theo dori
logic cuãa noá. MARK2.BAT coá lúåi àiïím laâ tûå kheáp kñn, baån coá thïí
chuyïín giao maâ khöng phaãi lo lùæng vïì viïåc ngûúâi duâng àaánh mêët
caác file phuå trúå. Cuäng nhû àöëi vúái phiïn baãn 1, baån phaãi baão
àaãm
coá chûáa PATH àêìy àuã vïì baãn thên chûúng trònh.

Phûúng phaáp 3 : Tiïëp cêån chûúng trònh COM.

MARK3.BAT giöëng nhû MARK1.BAT. Noá duâng möåt chûúng


trònh lö taách biïåt laâ SETIT.BAT àïí xaác lêåp biïën CURDIR coá giaá
trõ thû muåc hiïån thúâi. MARK3.BAT taåo SETIT. DAT coá möåt lïånh
ECHO, nhûng sau àoá sûã duång caác tiïån ñch cuãa chûúng trònh
Assembly, NOCTRL.COM àïí loaåi boã "carriage return" vaâ taåo
SETIT. BAT. Nghôa laâ baån khöng cêìn thiïët file trúå giuáp thûúâng
trûåc SETIT. DAT. NOCTRL.COM chuyïín têët caã caác maä àiïìu
khiïín, göìm caã "carriage return", thaânh kyá tûå röíng.

Àïí taåo NOCTRL.COM, haäy àaánh vaâo chûúng trònh NOCTRl.SER


bùçng möåt chûúng trònh soaån thaão vaâ lûu cêët noá. Haäy baão àaãm
rùçng
baån coá Debug trong möåt thû muåc coá trong lïånh PATH cuãa baån.
Tiïëp theo taåi dêëu nhùæc DOS, haäy àaánh doâng sau :

DEBUG<NOCTRL.SCR

DEBUG sau àoá seä taåo NOCTRL.COM tûå àöång.

MARK3.BAT thay thïë "IF NOT EXIT" vaâ lïånh COPY trong
MARK1.BAT bùçng 2 doâng lïånh nhû sau :

ECHO SET CURDIR=SETIT.DAT


NOCTRL SETIT.BAT

Doâng lïånh àêìu tiïn duâng ECHO àïí gúãi chuöíi SET CURDIR = vaâo
SETIT. DAT. Doâng lïånh tiïëp theo chaåy NOCTRL.COM, noá seä lêëy
doâng lïånh trong SETIT. DAT tûúác boã "carriage return" vaâ taåo
SETIT. BAT. Phêìn coân laåi cuãa chûúng trònh lö tûúng tûå, trûâ möåt
doâng thïm àïí xoaá fle SETIT. DAT bêëy giúâ àaä laâ thûâa.

MARK3.BAT coá möåt ûu àiïím lúán so vúái tiïìn böëi cuãa noá laâ khöng
cêìn phaãi baão àaãm noá chûáa tïn caác löå trònh cuãa caác file phuå
trúå.
Baån giûä MARK3.BAT vaâ NOCTRL.COM trong möåt thû muåc coá
trong lïånh PATH cuãa baån, thò noá seä laâm viïåc. Nhû thïë, phiïn baãn
3 coá nhiïìu cú höåi chaåy trïn nhûäng maáy khaác hún maâ khöng phaãi
thay àöíi.

Nhû laâ lúåi ñch phuå, baån coá thïí duâng NOCTRL.COM vúái bêët kyâ
chûúng trònh lö naâo, gêìn giöëng nhû möåt lïånh ngoaåi (external). Haäy
àùåt noá vaâo trong thû muåc DOS cuãa baån vaâ sûã duång noá bêët cûá
luác
naâo baån cêìn.
MARK3.BAT coá nhûúåc àiïím giöëng nhû MARK1.BAT : coá möåt
file phuå trúå (trong trûúâng húåp naây laâ NOCTRL.COM) maâ baån
phaãi chûáa keâm nïëu baån chuyïín giao ài. Àöìng thúâi, nhûäng ngûúâi
khöng kinh nghiïåm seä coá thïí khöng coá yá niïåm NOCTRL.COM
laâm gò nïëu baån khöng keâm theo taâi liïåu giaãi thñch chûác nùng cuãa
noá.

Caách naâo thò thñch húåp cho baån ?

Têët caã 3 phiïn baãn cuãa MARK.BAT xem ra nhû nhau khi chuáng
chaåy. Töëc àöå khöng phaãi laâ vêën àïì, baån coá thïí ào sûå chïnh lïåch
trang phêìn mûúâi cuãa giêëy. Möîi chûúng trònh chiïëm ñt hún möåt KB
àôa nhúá, kïí caã caác file phuå trúå. Vêåy chñnh xaác thò caái gò laâ
khaác
biïåt quan troång ? Liïåu coá lyá do naâo àoá àïí choån caái naây so vúái
caái
kia?

ÚÃ àêy coá möåt caách xem xeát : nïëu baån dûå àõnh caâi àùåt
MARK.BAT, chùèng haån trïn nûãa taá maáy tñnh thò baån nïn choån
MARK2.BAT, búãi vò noá tûå kheáp kñn. Noá khöng coá caác file phuå trúå
ài keâm nhû phiïn baãn 1 vaâ 3. Chuáng coá thïí dïî bõ mêët vaâ àùåt
nhêìm
chöí khi caác maáy tñnh àûúåc cêåp nhêåt vaâ caác file àûúåc dõch
chuyïín
túái caác maáy múái. MARK1.BAT thò dïî hiïíu hún vaâ dïî thñch ûáng
vúái nhûäng ngûúâi sûã duång khaác. Sau cuâng lûåa choån thuöåc vïì
baån.

Phan Tûå Lêåp


Dos World 1/1995

NHÊÅN THÛÁC MÖI TRÛÚÂNG


Thuêåt ngûä "möi trûúâng" coá thïí àang laâm naãn loâng nhûäng
ngûúâi sûã duång DOS múái. Àùåc biïåt khi phaãi àûúng àêìu vúái
thöng baáo "Hïët chöí möi trûúâng" àêìy bñ êín.

Möi trûúâng DOS laâ möåt khöëi nhúá daânh ra àïí lûu giûä caác
biïën vaâ caác giaá trõ chuöíi (hoùåc vùn baãn) cuãa chuáng. Möi
trûúâng maâ DOS taåo möîi lêìn baån bêåt maáy haânh àöång nhû
möåt baãng thöng baáo àiïån tûã maâ úã àoá baãn thên DOS, caác
chûúng trònh lö vaâ caác chûúng trònh khaác kiïím tra vaâ lêëy
thöng tin chûáa úã àêy.

Baån coá thïí taåo caác biïën möi trûúâng cho riïng baån tûâ caác
doâng lïånh hoùåc bïn trong chûúng trònh AUTOEXEC.BAT
cuãa baån. Nhûäng ngûúâi sûã duång DOS hiïíu caách "möi trûúâng"
hoaåt àöång coá thïí buöåc noá phuåc vuå mònh nhúâ xêy dûång caác
löå trònh tòm kiïëm taåm thúâi, thay àöíi caác chûác nùng baân phñm
àïí taåo ra caác phñm àaánh tùæt, vaâ àiïìu chónh lúán "möi trûúâng"
sao cho khöng bao giúâ gùåp phaãi thöng baáo àaä àïì cêåp úã trïn.
MARK1.BAT cû xûã nhû "àaánh dêëu trang" àiïån tûã nhúâ theo doäi thû
muåc hiïån
thúâi. Àïí thûåc hiïån noá, chó viïåc bêëm vaâo MARK1. Giaãi phaáp naây
sûã duång möåt
chûúng trònh lö taách biïåt SETIT. BAT àïí xaác lêåp biïën möi trûúâng
CURDIR
theo thû muåc hiïån thúâi.

@ECHO OFF
IF"%1"==" " GOTO SETDIR
IF"%1"=="\"CD%CURDIR%
GOTOEND
:SETDIR
IF NOT IXIST C:\BAT\SETIT.DAT GOTO MESSAGE
COPY C:\BAT\SETIT.DAT C:\BAT=SETIT.BAT
CD>>C:\BAT\SETIT.BAT
CALL C:\BAT\SETIT.BAT
DEL C:\BAT\SETIT.BAT
GOTO END
:MESSAGE
CLS
ECHO The support file SETIT.DAT was not found in the
specified directory.
ECHO To create SETIT.DAT, type COPY CON SETIT.DAT
Then type the following
ECHO line :
ECHO
ECHO SET CURDIR=
ECHO
ECHO Follow the equal sign immediately with Ctrl+Z and then
press Enter.
ECHO.
:END
End
SETIT.DAT laâ file phuå trúå cho MARK1.BAT
SET CURDIR=
End
MARK2.BAT thûåc hiïån cuâng möåt chûác nùng nhû MARK1.BAT, nhûng
noá
laåi "kheáp kñn". Giaá trõ cuãa biïën CURDIR àûúåc xaác lêåp trong doâng
lïånh
cuöëi cuãa chûúng trònh lö naây.

@ECHO OFF
%GOSET%
IF"%1"==""GOTO SETDIR
IF"%1"=="\" CD%CURDIR% GOTO:END
:SETDIR
COPY C:\BAT\MARK2.BAT C:\BAT\MARK2.BAT
SET GOSET=GOTO DIRSET
CD>>C:\BAT\MARK2A.BAT
CALL C:\BAT\MARK2A.BAT
DEL C:\BAT\MARK2A.BAT
SET GOSET=
:END
REM>C:\END.BAT
C:\END
:DIRSET
SET CURDIR=
End

MARK3.BAT giöëng nhau MARK1.BAT,


ngoaåi trûâ viïåc noá taåo ra SETIT.BAT coá
lïånh ECHO vaâ sau àoá loaåi boã "carrigage
return" bùçng chûúng trònh tiïån ñch ngön
ngûä Assembly NOCTRL.COM

@ECHO OFF
IF"%1"==""GOTO SETDIR
IF"1%1=="\"CD%CURDIR%
GOTOEND
:SETDIR
ECHO SET
CURDIR=SETIT.DAT
NOCTRL<SETIT.DATSETIT.BAT

CD>>C:\BAT\SETIT. BAT
CALL C:\BAT\ SETIT. BAT
DEL C:\BAT\SETIT.BAT
DEL C:\BAT\SETIT.DAT
GOTOEND
:END
End

NOCTRL.CSCR taåo ra NOCTRL.COM


laâ möåt tiïån ñch trúå giuáp MARK3.BAT
bùçng caách tûúác boã caác kyá tûå àiïìu khiïín
khoãi möåt file.

N NOCTRL.COM
A 100
MOV AH,3F
SUB BX, BX
MOV CX, 1
MOV DX.80
INT 21
JC 0125
MOV SI,80
MOV DL,(SI)
CMP DL,20
JNB 011F
MOV DL,20
MOV AH,2
INT 21
JMP 0100
INT 20

RCX
27
W
Q
End

Trúã vïì àêìu trang

You might also like