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
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