bat 学习

上一篇 / 下一篇  2008-03-22 12:18:49 / 个人分类:批处理

查看( 10 ) / 评论( 0 )
echo、@、call、pause、rem(小技巧:用::代替rem)是批处理文件最常用的几个命令,我们就从他们开始学起。 我爱贵溪4BL*sMsM
==== 注 ===========
U^G_RWH1k C0首先, @ 不是一个命令, 而是DOS 批处理的一个特殊标记符, 仅用于屏蔽命令行回显. 下面是DOS命令行或批处理中可能会见到的一些特殊标记符: 我爱贵溪4L6C;I&z;c$\!ZFM Z
CR(0D) 命令行结束符 我爱贵溪 T*V X+KiP
Escape(1B) ANSI转义字符引导符 我爱贵溪uup(I4o/N
Space(20) 常用的参数界定符
n&y;z+Z s AWS0Tab(09) ; = 不常用的参数界定符 我爱贵溪+@ c e#J&T6L'lC.Vq
+ COPY命令文件连接符
l+vad,_,Q0* ? 文件通配符
)_%fc'sc| C qT0"" 字符串界定符
4? A B#a t5W,G0| 命令管道符 我爱贵溪0nT n3jNS
< > >> 文件重定向符 我爱贵溪1]B8t!}c?G K`;C
@ 命令行回显屏蔽符
l.OCJo5W}F0/ 参数开关引导符
xSG;t[8TM0: 批处理标签引导符 我爱贵溪_;|*v @1v}RN.R
% 批处理变量引导符 我爱贵溪9Z0JO5D U~i'y$kz]
其次, :: 确实可以起到rem 的注释作用, 而且更简洁有效; 但有两点需要注意:
5nvm"EQP0第一, 除了 :: 之外, 任何以 :开头的字符行, 在批处理中都被视作标号, 而直接忽略其后的所有内容, 只是为了与正常的标号相区别, 建议使用 goto 所无法识别的标号, 即在 :后紧跟一个非字母数字的一个特殊符号.
'[bd1YGk k2X0第二, 与rem 不同的是, ::后的字符行在执行时不会回显, 无论是否用echo on打开命令行回显状态, 因为命令解释器不认为他是一个有效的命令行, 就此点来看, rem 在某些场合下将比 :: 更为适用; 另外, rem 可以用于 config.sys 文件中. 我爱贵溪pF"TUA$Y1[A(k6p-n
===================== 我爱贵溪?FI-Q8qI
echo 表示显示此命令后的字符
x.E/V%C1kmc0echo off 表示在此语句后所有运行的命令都不显示命令行本身
Pi GF)@:_0@与echo off相象,但它是加在每个命令行的最前面,表示运行时不显示这一行的命令行(只能影响当前行)。
4HK.F+J^v6o0call 调用另一个批处理文件(如果不用call而直接调用别的批处理文件,那么执行完那个批处理文件后将无法返回当前文件并执行当前文件的后续命令)。 我爱贵溪e|0z W5SU2{p
pause 运行此句会暂停批处理的执行并在屏幕上显示Press any key to continue...的提示,等待用户按任意键后继续 我爱贵溪!`WLtUg
rem 表示此命令后的字符为解释行(注释),不执行,只是给自己今后参考用的(相当于程序中的注释)。
-G3^)yh~#Q.N!j#_wf0==== 注 =====
L_.L]3DnX)g h0此处的描述较为混乱, 不如直接引用个命令的命令行帮助更为条理
(~ k\-d ^$O0------------------------- 我爱贵溪%@ }-SyG6S)S7T?4D
ECHO 我爱贵溪I5M-b8ZJ {+|\1v-U v
当程序运行时,显示或隐藏批处理程序中的正文。也可用于允许或禁止命令的回显。 我爱贵溪p%~zL7AB
在运行批处理程序时,MS-DOS一般在屏幕上显示(回显)批处理程序中的命令。
:UUL{k[0使用ECHO命令可关闭此功能。 我爱贵溪l#F#uL9B-wk
语法
u C gk*^])s$xg0ECHO [ON|OFF] 我爱贵溪5m|;\"A7I2o|3}4k6_
若要用echo命令显示一条命令,可用下述语法:
x3z+kiJ(Yl0echo [message] 我爱贵溪XJ&c SY,n!o
参数
4vDSoFPe0ON|OFF 我爱贵溪C2W5Dk9A)p4| K1D[
指定是否允许命令的回显。若要显示当前的ECHO的设置,可使用不带参数的ECHO 我爱贵溪:]C4Z0i Y!Df
命令。 我爱贵溪/_Cydf&E_wUE
message
0r;IL(Wq&V P]0指定让MS-DOS在屏幕上显示的正文。
Ou-nmB I o0------------------- 我爱贵溪(r%{-n;CV"t
CALL 我爱贵溪O*E.M6t7b_G;T
从一个批处理程序中调用另一个批处理程序,而不会引起第一个批处理的中止。
l{ x#J@0M0语法 我爱贵溪4wN8vM"xX~CXss
CALL [drive:][path]filename [batch-parameters]
ap6y.A0Bv-|Y0参数 我爱贵溪1C~4t*D:~%]
[drive:][path]filename
%y^b E2?Ak~l8z0n{0指定要调用的批处理程序的名字及其存放处。文件名必须用.BAT作扩展名。
vz h0Aw*y)I'Pb]0
6P7z3t#N*hI6?vE;zv(J0batch-parameters
,b5X)~$_Ju{M0指定批处理程序所需的命令行信息。 我爱贵溪"Q_|2v2T[
------------------------------- 我爱贵溪)F}!^+H'mUk'SwL/`7x
PAUSE 我爱贵溪;f H"Y_7E ^
暂停批处理程序的执行并显示一条消息,提示用户按任意键继续执行。只能在批处 我爱贵溪vR \/k@'LOj
理程序中使用该命令。
'Y z5Rh"f?S0语法
Ib2ThsI1u"^)\Q0PAUSE 我爱贵溪 iBI5D&_(H8k

dy#W"i,zV'S9A%a6d0REM
k]c"c6BbX/m0在批处理文件或CONFIG.SYS中加入注解。也可用REM命令来屏蔽命令(在CONFIG.SYS 我爱贵溪 \r8pkN4z7k
中也可以用分号 ; 代替REM命令,但在批处理文件中则不能替代)。
!Jo5Q~dF0语法 我爱贵溪^} Pz \6U)R"I
REM [string]
UiJ k$~YJ@)xw_0参数
t+F%b(F?U;u0string 我爱贵溪1x+C%] g/\ Q;PI\ @$_
指定要屏蔽的命令或要包含的注解。
)sdJUtm*k0=======================
BlH]0F J$V0例1:用edit编辑a.bat文件,输入下列内容后存盘为c:\a.bat,执行该批处理文件后可实现:将根目录中所有文件写入 a.txt中,启动UCDOS,进入WPS等功能。
3s zBC_v0批处理文件的内容为: 命令注释: 我爱贵溪 H7z"U;e)]
@echo off 不显示后续命令行及当前命令行
6Rhc NOz6B&J0dir c:\*.* >a.txt 将c盘文件列表写入a.txt 我爱贵溪F2~*nnVEN*ez-W
call c:\ucdos\ucdos.bat 调用ucdos 我爱贵溪x ttUeD0l$~
echo 你好 显示"你好"
&J"l]-PD&p8L8l0pause 暂停,等待按键继续 我爱贵溪$i_/PM+fC]p/U
rem 准备运行wps 注释:准备运行wps 我爱贵溪2m,h%NP@6wC
cd ucdos 进入ucdos目录
@^B9fB]_5^"`;F0wps 运行wps 我爱贵溪VG:H.g!tWA0n&D"D
批处理文件的参数
l!x\%Or-R0批处理文件还可以像C语言的函数一样使用参数(相当于DOS命令的命令行参数),这需要用到一个参数表示符"%"。
,{ E9F[,^&L0%[1-9]表示参数,参数是指在运行批处理文件时在文件名后加的以空格(或者Tab)分隔的字符串。变量可以从%0到%9,%0表示批处理命令本身,其它参数字符串用%1到%9顺序表示。
_gr:H(D nu0例2:C:根目录下有一批处理文件名为f.bat,内容为: 我爱贵溪Jw%f9hy |
@echo off 我爱贵溪'L| q hU`[4Q
format %1
c(Ce7Xj9J4T7Q k;y0如果执行C:\>f a: 我爱贵溪)G#VGD+M-j n
那么在执行f.bat时,%1就表示a:,这样format %1就相当于format a:,于是上面的命令运行时实际执行的是format a: 我爱贵溪r.u5F4S4J7j:t @*gb
例3:C:根目录下一批处理文件名为t.bat,内容为:
s(C!h kD0@echo off 我爱贵溪I I'{t;E)rm!khQ
type %1 我爱贵溪p$Qu XUph
type %2 我爱贵溪)C ^!C3g'jdS,f:^
那么运行C:\>t a.txt b.txt
.u:A}uI/cY b0%1 : 表示a.txt 我爱贵溪!m5M)i-G[S-v.O5Q
%2 : 表示b.txt
D?2d*Q#z5l%]xD|0于是上面的命令将顺序地显示a.txt和b.txt文件的内容。 我爱贵溪,Y^j&?q|U6WI
==== 注 =============== 我爱贵溪5h"lQwT(igEz p
参数在批处理中也作为变量处理, 所以同样使用百分号作为引导符, 其后跟0-9中的一个数字构成参数引用符. 引用符和参数之间 (例如上文中的 %1 与 a: ) 的关系类似于变量指针与变量值的关系. 当我们要引用第十一个或更多个参数时, 就必须移动DOS 的参数起始指针. shift 命令正充当了这个移动指针的角色, 它将参数的起始指针移动到下一个参数, 类似C 语言中的指针操作. 图示如下:
E'oj\A0初始状态, cmd 为命令名, 可以用 %0 引用 我爱贵溪{;?*dt{8U,`;v%Go'F
cmd arg1 arg2 arg3 arg4 arg5 arg6 arg7 arg8 arg9 arg10 我爱贵溪 PH Z6x/~JT
^ ^ ^ ^ ^ ^ ^ ^ ^ ^ 我爱贵溪(^:nP/A'[ y
| | | | | | | | | | 我爱贵溪*ogO Gk Bc6@
%0 %1 %2 %3 %4 %5 %6 %7 %8 %9
%?$n`A\C8I0经过1次shift后, cmd 将无法被引用
,c4ucRufqm0cmd arg1 arg2 arg3 arg4 arg5 arg6 arg7 arg8 arg9 arg10
af"O}pzL*SN:p2^F0^ ^ ^ ^ ^ ^ ^ ^ ^ ^
T+l w&j"N8j!A0| | | | | | | | | |
mY1Z cX%U/Kw0l7C\0%0 %1 %2 %3 %4 %5 %6 %7 %8 %9
\u/]+?&p5EX0经过2次shift后, arg1也被废弃, %9指向为空, 没有引用意义 我爱贵溪7j0Z9?+iO1|i NY aN
cmd arg1 arg2 arg3 arg4 arg5 arg6 arg7 arg8 arg9 arg10
/s Y qj[w{7w0^ ^ ^ ^ ^ ^ ^ ^ ^
-d c{*brz[E0| | | | | | | | |
wM-\(S;Ei A eA t0%0 %1 %2 %3 %4 %5 %6 %7 %8 我爱贵溪 qD%?M0O/A a
遗憾的是, win9x 和DOS下均不支持 shift 的逆操作. 只有在 nt 内核命令行环境下, shift 才支持 /n 参数, 可以以第一参数为基准返复移动起始指针.
Kr hW.t$x0================= 我爱贵溪HUMi\'C0pk
特殊命令
7g%~u+d(OX3ds0我爱贵溪3a"G'o5o|;{(m4OZ7_4b]
if goto choice for是批处理文件中比较高级的命令,如果这几个你用得很熟练,你就是批处理文件的专家啦。 我爱贵溪f\l PXZ w%B!n

c i ~@m0一、if 是条件语句,用来判断是否符合规定的条件,从而决定执行不同的命令。 有三种格式:
%`Koas {(_01、if [not] "参数" == "字符串" 待执行的命令 我爱贵溪3s"in&D?@
参数如果等于(not表示不等,下同)指定的字符串,则条件成立,运行命令,否则运行下一句。
+dg"^J8X1as7w Q-b(D0例:if "%1"=="a" format a:
1X6z"GKyLn4`0====
-J6c[hF7SU'w"]ST0if 的命令行帮助中关于此点的描述为: 我爱贵溪1Vb }$J U
IF [NOT] string1==string2 command
gV;X sY0在此有以下几点需要注意: 我爱贵溪nm'eg4dk
1. 包含字符串的双引号不是语法所必须的, 而只是习惯上使用的一种"防空"字符 我爱贵溪z A _\[
2. string1 未必是参数, 它也可以是环境变量, 循环变量以及其他字符串常量或变量
A3D2Z-X2oZ8}(H03. command 不是语法所必须的, string2 后跟一个空格就可以构成一个有效的命令行 我爱贵溪 P"F ` QgHpF:u
============================= 我爱贵溪W/u2mk9A9P0oVa
2、if [not] exist [路径\]文件名 待执行的命令 我爱贵溪[{ SR~L5U
如果有指定的文件,则条件成立,运行命令,否则运行下一句。
UW} an.o_7J:W0如: if exist c:\config.sys type c:\config.sys 我爱贵溪*B K&pfY2ly
表示如果存在c:\config.sys文件,则显示它的内容。
$lW3J6d.m$AIJ0****** 注 ******** 我爱贵溪h-bH8Y `7c
也可以使用以下的用法:
(bQ'~'Dk0if exist command
@1~\J^)IN/n~0device 是指DOS系统中已加载的设备, 在win98下通常有:
^1a,Up/q0\(~hh,Q0AUX, PRN, CON, NUL
+ty#P\n0COM1, COM2, COM3, COM4 我爱贵溪#XI O0]-nT
LPT1, LPT2, LPT3, LPT4
m3~ZQS#w x*}HjU0XMSXXXX0, EMMXXXX0
U.WWBF aq0A: B: C: ...,
hT*Wl~I x0CLOCK$, CONFIG$, DblBuff$, IFS$HLP$ 我爱贵溪 Xn+ov,Y7~
具体的内容会因硬软件环境的不同而略有差异, 使用这些设备名称时, 需要保证以下三点: 我爱贵溪N+Snt cm+wVr
1. 该设备确实存在(由软件虚拟的设备除外) 我爱贵溪 B ?q"hB4e8eH
2. 该设备驱动程序已加载(aux, prn等标准设备由系统缺省定义) 我爱贵溪8fQ4d-g#C2tu(p
3. 该设备已准备好(主要是指a: b: ..., com1..., lpt1...等)
Ys*gx| ~%hZ$zF1S0可通过命令 mem/d | find "device" /i 来检阅你的系统中所加载的设备 我爱贵溪od/i+e%x n1[
另外, 在DOS系统中, 设备也被认为是一种特殊的文件, 而文件也可以称作字符设备; 因为设备(device)与文件都是使用句柄(handle)来管理的, 句柄就是名字, 类似于文件名, 只不过句柄不是应用于磁盘管理, 而是应用于内存管理而已, 所谓设备加载也即指在内存中为其分配可引用的句柄.
7G%Ua Le j3Ja.[s0==================================
v[z!G1bhZ03、if errorlevel <数字> 待执行的命令 我爱贵溪5r'b)]K(i^8M6FM
很多DOS程序在运行结束后会返回一个数字值用来表示程序运行的结果(或者状态),通过if errorlevel命令可以判断程序的返回值,根据不同的返回值来决定执行不同的命令(返回值必须按照从大到小的顺序排列)。如果返回值等于指定的数字,则条件成立,运行命令,否则运行下一句。 我爱贵溪:x~1` H.Q!A!ml#]
如if errorlevel 2 goto x2 我爱贵溪8g.iL:k Q
==== 注 ===========
K#N'E0hU3A0返回值从大到小的顺序排列不是必须的, 而只是执行命令为 goto 时的习惯用法, 当使用 set 作为执行命令时, 通常会从小到大顺序排列, 比如需将返回码置入环境变量, 就需使用以下的顺序形式: 我爱贵溪c-di:g"h)X#W F
if errorlevel 1 set el=1
c#M7p~j3{h w A0if errorlevel 2 set el=2 我爱贵溪/@6fP}2i WaI
if errorlevel 3 set el=3 我爱贵溪V7u[ ]8FV
if errorlevel 4 set el=4 我爱贵溪IUO3n%_8j.a oP
if errorlevel 5 set el=5
o'e0_"b Ev ^O0... 我爱贵溪V+JO7Xpi
当然, 也可以使用以下循环来替代, 原理是一致的:
B$Ed0f\O(x-^YZ0for %%e in (1 2 3 4 5 6 7 8...) do if errorlevel %%e set el=%%e
6l^4m0P+s7DB/MG0更高效简洁的用法, 可以参考我写的另一篇关于获取 errorlevel 的文章 我爱贵溪6[2w:Mj*E/L9u
出现此种现象的原因是, if errorlevel 比较返回码的判断条件并非等于, 而是大于等于. 由于 goto 的跳转特性, 由小到大排序会导致在较小的返回码处就跳出; 而由于 set命令的 "重复" 赋值特性, 由大到小排序会导致较小的返回码 "覆盖" 较大的返回码.
:^jf8A_ v0另外, 虽然 if errorlevel=<数字> command 也是有效的命令行, 但也只是 command.com 解释命令行时将 = 作为命令行切分符而忽略掉罢了
i1\F7r6bkE0=========================== 我爱贵溪q6vCD\#c'@

Ts"CM@*Yq0二、goto 批处理文件运行到这里将跳到goto所指定的标号(标号即label,标号用:后跟标准字符串来定义)处,goto语句一般与if配合使用,根据不同的条件来执行不同的命令组。
5i |P0} MXV0如: 我爱贵溪T(L c? `9u
goto end
${cM,A$Y |w:I@Zq0:end
&~ ~`8@Ng s0echo this is the end
%lw2b)a/[ } ubV0标号用":字符串"来定义,标号所在行不被执行。
])?P4G@E0==== willsort 编注 我爱贵溪:]}]5oL
label 常被译为 "标签" , 但是这并不具有广泛的约定性.
dg`x.NF-p@Ui0goto 与 : 联用可实现执行中途的跳转, 再结合 if 可实现执行过程的条件分支, 多个 if 即可实现命令的分组, 类似 C 中 switch case 结构或者 Basic 中的 select case 结构, 大规模且结构化的命令分组即可实现高级语言中的函数功能. 以下是批处理和C/Basic在语法结构上的对照:
3uh&m~h*geZ sb0Batch C / Basic 我爱贵溪m1ovc%Fv6B"Vm0l
goto&: goto&: 我爱贵溪N s ]0YwC
goto&:&if if{}&else{} / if&elseif&endif 我爱贵溪#M6]Td2S#n0W#F
goto&:&if... switch&case / select case 我爱贵溪ro;H(tYtO
goto&:&if&set&envar... function() / function(),sub()
-SC8XG(M6B%dh0==================================
:r(M!r5m"e0iRKv0三、choice 使用此命令可以让用户输入一个字符(用于选择),从而根据用户的选择返回不同的errorlevel,然后于if errorlevel配合,根据用户的选择运行不同的命令。 我爱贵溪.o$Oic eN5?
注意:choice命令为DOS或者Windows系统提供的外部命令,不同版本的choice命令语法会稍有不同,请用choice /?查看用法。
yZ6Xa}0choice的命令语法(该语法为Windows 2003中choice命令的语法,其它版本的choice的命令语法与此大同小异): 我爱贵溪G [9ke)~0|z
CHOICE [/C choices] [/N] [/CS] [/T timeout /D choice] [/M text] 我爱贵溪vQ:Wwx4CB;?
描述:
[4e"V]c*U:QYwE.F0该工具允许用户从选择列表选择一个项目并返回所选项目的索引。
V@-xV3So0参数列表:
2KW&c/Jr N,? a0/C choices 指定要创建的选项列表。默认列表是 "YN"。
O(klH7KU0/N 在提示符中隐藏选项列表。提示前面的消息得到显示, 我爱贵溪Q-t+P$ivR3G_.@;N7]I
选项依旧处于启用状态。 我爱贵溪k*r(N"EY7Ap[ t
/CS 允许选择分大小写的选项。在默认情况下,这个工具
FaQ]SX#W^Z0是不分大小写的。 我爱贵溪m:U_CJ
/T timeout 做出默认选择之前,暂停的秒数。可接受的值是从 0 我爱贵溪;mAw5c_&}&R:w|
到 9999。如果指定了 0,就不会有暂停,默认选项 我爱贵溪+p5HY2R8b+@*`~(Z
会得到选择。 我爱贵溪4| c/Px0Q E-]
/D choice 在 nnnn 秒之后指定默认选项。字符必须在用 /C 选 我爱贵溪| Az8B*q9x{"M
项指定的一组选择中; 同时,必须用 /T 指定 nnnn。 我爱贵溪uZbowjG'z8wG:SD
/M text 指定提示之前要显示的消息。如果没有指定,工具只
6h0YCAj\)C*J2U0显示提示。
x"nNin/cIY0/? 显示帮助消息。 我爱贵溪!a|+G5i?e;w8V-eR
注意:
3gI3\*o#Pr,b0ERRORLEVEL 环境变量被设置为从选择集选择的键索引。列出的第一个选
*~l~i~YR wa0择返回 1,第二个选择返回 2,等等。如果用户按的键不是有效的选择,
/aF/_4P;y.sX0该工具会发出警告响声。如果该工具检测到错误状态,它会返回 255 的 我爱贵溪A6T5R.GC%gBO
ERRORLEVEL 值。如果用户按 Ctrl+Break 或 Ctrl+C 键,该工具会返回 0 我爱贵溪'y3K+k$^,\ u/X8c
的 ERRORLEVEL 值。在一个批程序中使用 ERRORLEVEL 参数时,将参数降
pl R#WT.cO Z0序排列。
fZ6Wi(t0示例:
yVX!l4]A0CHOICE /?
)I\(W3zG/`G0CHOICE /C YNC /M "确认请按 Y,否请按 N,或者取消请按 C。"
2z(I\)v?+f p0CHOICE /T 10 /C ync /CS /D y 我爱贵溪e$E"b l-N+}$W F
CHOICE /C ab /M "选项 1 请选择 a,选项 2 请选择 b。"
l*\*Q/Yi[/vt8]j.|.w0CHOICE /C ab /N /M "选项 1 请选择 a,选项 2 请选择 b。"
TmKC6U@0==== willsort 编注 =============================== 我爱贵溪&x8i!]4rJ*zn'J
我列出win98下choice的用法帮助, 已资区分 我爱贵溪Vlg J7h!h
Waits for the user to choose one of a set of choices. 我爱贵溪\ I0b)q'A^1Go;rZ S,R
等待用户选择一组待选字符中的一个 我爱贵溪mGL[+c1G1Pl
CHOICE [/C[:]choices] [/N] [/S] [/T[:]c,nn] [text] 我爱贵溪S0_;[+G9C/H
/C[:]choices Specifies allowable keys. Default is YN 我爱贵溪)x!U$vu@d-K3t
指定允许的按键(待选字符), 默认为YN
5h(jAOw8kS0/N Do not display choices and ? at end of prompt string.
4K-ETL`8@.W2@/G}0不显示提示字符串中的问号和待选字符 我爱贵溪3g'E1MpH?2p'~S
/S Treat choice keys as case sensitive. 我爱贵溪(d|8fK(?&J
处理待选字符时大小写敏感 我爱贵溪djK*Q'Y/a
/T[:]c,nn Default choice to c after nn seconds
m$z%p2`M0在 nn 秒后默认选择 c 我爱贵溪/VpC(R]b/k
text Prompt string to display
vMfI"y+c$Q I0要显示的提示字符串
4z;qB9a%q0ERRORLEVEL is set to offset of key user presses in choices. 我爱贵溪#U%xlR-@5A]@y
ERRORLEVEL 被设置为用户键入的字符在待选字符中的偏移值 我爱贵溪1?oP,c"g
如果我运行命令:CHOICE /C YNC /M "确认请按 Y,否请按 N,或者取消请按 C。" 我爱贵溪}TEp/T^$P u
屏幕上会显示:
Cq#Mx(EP~0确认请按 Y,否请按 N,或者取消请按 C。 [Y,N,C]?
ham9nZ;L0
QO+]HS\S$A0例:test.bat的内容如下(注意,用if errorlevel判断返回值时,要按返回值从高到低排列):
%uGkPp+WJ0@echo off
E&K~&w'_2lSq0choice /C dme /M "defrag,mem,end"
.n#I9cUC j+F/_5Y/tN0if errorlevel 3 goto end
`S_q C0if errorlevel 2 goto mem 我爱贵溪6ej4J,[7N oa
if errorlevel 1 goto defrag 我爱贵溪`lzt0s
:defrag
e-kGV5N0c:\dos\defrag
X5of/gU ]3V)ap0cr0goto end 我爱贵溪PXh\7h
:mem
7f_8p#~:hL0mem 我爱贵溪C-NZ.W&G W
goto end
9MAR-IC0:end
*B7FIi \W2E0echo good bye 我爱贵溪*R2v8_[$z{AJC2n
此批处理运行后,将显示"defrag,mem,end[D,M,E]?" ,用户可选择d m e ,然后if语句根据用户的选择作出判断,d表示执行标号为defrag的程序段,m表示执行标号为mem的程序段,e表示执行标号为end的程序段,每个程序段最后都以goto end将程序跳到end标号处,然后程序将显示good bye,批处理运行结束。
+I'A(^+[(nA\^3[0四、for 循环命令,只要条件符合,它将多次执行同一命令。
&V f9?9hY;~x(F:k0语法: 我爱贵溪1AP9r3` L+k2n o3nF rs
对一组文件中的每一个文件执行某个特定命令。 我爱贵溪| pIPe6j
FOR %%variable IN (set) DO command [command-parameters]
8R6@Z*\ Lk0%%variable 指定一个单一字母可替换的参数。 我爱贵溪#^+HA ^ ];ONYV
(set) 指定一个或一组文件。可以使用通配符。
1p5CENa0command 指定对每个文件执行的命令。 我爱贵溪L oe5X*ZL4_,pc(P
command-parameters
*F.f;g)S9YNZO0为特定命令指定参数或命令行开关。
3N0voG1f#bU*v|/{brBC0例如一个批处理文件中有一行: 我爱贵溪pm[x I&DCM+m
for %%c in (*.bat *.txt) do type %%c 我爱贵溪uP7EMu.W#U0e
则该命令行会显示当前目录下所有以bat和txt为扩展名的文件的内容。 我爱贵溪J)^*bX7wJ1i!@ a
==== willsort 编注 ===================================================== 我爱贵溪.KsmD.rE
需要指出的是, 当()中的字符串并非单个或多个文件名时, 它将单纯被当作字符串替换, 这个特性再加上()中可以嵌入多个字符串的特性, 很明显 for 可以被看作一种遍历型循环. 我爱贵溪 od!wgt Nw$d$wr
当然, 在 nt/2000/xp/2003 系列的命令行环境中, for 被赋予了更多的特性, 使之可以分析命令输出或者文件中的字符串, 也有很多开关被用于扩展了文件替换功能. 我爱贵溪3_ a&d;[*Zy(J
======================================================================== 我爱贵溪7X|9c-kk8w
批处理示例
/Vq(yJk@+s\*v&p(l01. IF-EXIST 我爱贵溪XNG$OCh-c
1) 首先用记事本在C:\建立一个test1.bat批处理文件,文件内容如下:
^W)Upx%L$h*P0@echo off
)dj"Vi\)m+L&~^0IF EXIST \AUTOEXEC.BAT TYPE \AUTOEXEC.BAT
2\8^._5DFf+S o0IF NOT EXIST \AUTOEXEC.BAT ECHO \AUTOEXEC.BAT does not exist 我爱贵溪 g&Yngm9I3| Rs
然后运行它: 我爱贵溪EfSQ%QTx
C:\>TEST1.BAT 我爱贵溪9L.l5N\Aw[B'S B
如果C:\存在AUTOEXEC.BAT文件,那么它的内容就会被显示出来,如果不存在,批处理就会提示你该文件不存在。 我爱贵溪4[ mH9R}O
2) 接着再建立一个test2.bat文件,内容如下: 我爱贵溪,|.F$P8R@U+q.k
@ECHO OFF 我爱贵溪fKQ9jV?eq
IF EXIST \%1 TYPE \%1 我爱贵溪L"r!U z5m"Q
IF NOT EXIST \%1 ECHO \%1 does not exist
*LfSQ C0执行:
!isO)]]+eU0C:\>TEST2 AUTOEXEC.BAT
$}F)v%GLnX0该命令运行结果同上。 我爱贵溪BOdYNOw/Jfv
说明:
J+F~R2{Y hE"{0(1) IF EXIST 是用来测试文件是否存在的,格式为
4^J,Qr#Iy-x0IF EXIST [路径+文件名] 命令 我爱贵溪 o7E?Li
(2) test2.bat文件中的%1是参数,DOS允许传递9个批参数信息给批处理文件,分别为%1~%9(%0表示test2命令本身) ,这有点象编程中的实参和形参的关系,%1是形参,AUTOEXEC.BAT是实参。
z8`[5l;Z0==== willsort 编注 ===================================================== 我爱贵溪k"L3lO"Y8ek5H!v
DOS没有 "允许传递9个批参数信息" 的限制, 参数的个数只会受到命令行长度和所调用命令处理能力的限制. 但是, 我们在批处理程序中, 在同一时刻只能同时引用10个参数, 因为 DOS只给出了 %0~%9这十个参数引用符.
vjf"Kj9[F0======================================================================== 我爱贵溪n Gc}P
3) 更进一步的,建立一个名为TEST3.BAT的文件,内容如下: 我爱贵溪)@_(Mj&V#vS
@echo off
X^Pci3](J.`i&e0IF "%1" == "A" ECHO XIAO 我爱贵溪X;_ jS;T9]
IF "%2" == "B" ECHO TIAN
p?+g9oI0IF "%3" == "C" ECHO XIN
2v.oy9X%uN0如果运行:
-r;lC'[$S;i e3W,G0C:\>TEST3 A B C 我爱贵溪jweFt*B U^\
屏幕上会显示:
AK)Y;{7}1z0XIAO 我爱贵溪VV0lL5{_+[
TIAN
+fmf h(M9Yp&AC f0XIN
6_ a$NdD(e[8UIG0如果运行: 我爱贵溪h7ENDA T
C:\>TEST3 A B
wt5P9WM Wh b0H\0屏幕上会显示
Z,c%}LQ/d3kl,s0XIAO 我爱贵溪5V1DU0V+j2[/[ k MW
TIAN
*d/zc0M;l0在这个命令执行过程中,DOS会将一个空字符串指定给参数%3。
Ewpi%s3q#Q+?,D'p02、IF-ERRORLEVEL 我爱贵溪$K#N!C sg/S/E
建立TEST4.BAT,内容如下:
e?iT&M1Q1{0@ECHO OFF
V7T d2f;y0z!P0XCOPY C:\AUTOEXEC.BAT D:\
TRL/agL@0IF ERRORLEVEL 1 ECHO 文件拷贝失败 我爱贵溪,fHI],n*m0x%H
IF ERRORLEVEL 0 ECHO 成功拷贝文件
eL)[1cTq hS0然后执行文件: 我爱贵溪 c@!a1C'H
C:\>TEST4
|5~[%sbl0如果文件拷贝成功,屏幕就会显示"成功拷贝文件",否则就会显示"文件拷贝失败"。 我爱贵溪iA"opL4m(oP(]
IF ERRORLEVEL 是用来测试它的上一个DOS命令的返回值的,注意只是上一个命令的返回值,而且返回值必须依照从大到小次序顺序判断。 我爱贵溪xGD0nq:}7wy
因此下面的批处理文件是错误的:
J!r1cd|0@ECHO OFF 我爱贵溪&b:z)H'O Nu1MW K
XCOPY C:\AUTOEXEC.BAT D:\
2tC:Q.I-n-h0IF ERRORLEVEL 0 ECHO 成功拷贝文件 我爱贵溪z%bB2DIGp X
IF ERRORLEVEL 1 ECHO 未找到拷贝文件 我爱贵溪n*I!U Q8Zy"qva
IF ERRORLEVEL 2 ECHO 用户通过ctrl-c中止拷贝操作
'j'llf ~a0IF ERRORLEVEL 3 ECHO 预置错误阻止文件拷贝操作
FdH(v"mv?a r0IF ERRORLEVEL 4 ECHO 拷贝过程中写盘错误 我爱贵溪a1m f V&F UO
无论拷贝是否成功,后面的:
L)]0Q^"d D2T0未找到拷贝文件
)\4WZ3B\%A;}vv[o0用户通过ctrl-c中止拷贝操作 我爱贵溪3nXg!P,YP LQ b{
预置错误阻止文件拷贝操作 我爱贵溪z7D;p RMP
拷贝过程中写盘错误
t+d/u+S g/P0都将显示出来。
U{}(W8K!u c;B0以下就是几个常用命令的返回值及其代表的意义:
2eD4Mxy \:J5c0backup
6{[^3u,i8C;\1jd6zw)J00 备份成功 我爱贵溪NQ ?~b2w
1 未找到备份文件
Feg&u'fFXA;F02 文件共享冲突阻止备份完成
h*zPT%M jKe03 用户用ctrl-c中止备份 我爱贵溪?:incPiGd'Q
4 由于致命的错误使备份操作中止 我爱贵溪 C-w8DbLdQ)gBL%fU PHF
diskcomp 我爱贵溪:^+kN@1P/iP'J
0 盘比较相同 我爱贵溪3Sz)~T AN{
1 盘比较不同 我爱贵溪8zykI%pZ _ [
2 用户通过ctrl-c中止比较操作 我爱贵溪r5hE*suR
3 由于致命的错误使比较操作中止
:@!nD7| o|2]xl04 预置错误中止比较
^#a J e)['{Z0diskcopy
'Q1B boF#pO `7T6w00 盘拷贝操作成功 我爱贵溪]y)?*@\
1 非致命盘读/写错 我爱贵溪;v[k7m~]W9v
2 用户通过ctrl-c结束拷贝操作
.T v7n a$a03 因致命的处理错误使盘拷贝中止
8s m"A|Ix04 预置错误阻止拷贝操作
#Dx ~1q(_)sp7FXT0format
/?p U(] ^00 格式化成功
2xWfF'W8_ j[:O1v03 用户

TAG: bat 学习

我来说两句

(可选)

关于作者