if 的命令行帮助中关于此点的描述?
IF [NOT] string1==string2 command
在此有以下几炚w要注?
1. 包含字符串的双引号不是语法所必须? 而只是习惯上使用的一U?防空"字符
2. string1 未必是参? 它也可以是环境变? 循环变量以及其他字符串常量或变量
3. command 不是语法所必须? string2 后跟一个空格就可以构成一个有效的命o?
================================================================
2、if [not] exist [路径\]文g?待执行的命o
如果有指定的文gQ则条g成立Q运行命令,否则q行下一句?
? if exist c:\config.sys type c:\config.sys
表示如果存在c:\config.sys文gQ则昄它的内容?
****** willsort ~注 ********
也可以用以下的用法:
if exist <device> command
device 是指DOSpȝ中已加蝲的设? 在win98下通常?
AUX, PRN, CON, NUL
COM1, COM2, COM3, COM4
LPT1, LPT2, LPT3, LPT4
XMSXXXX0, EMMXXXX0
A: B: C: ...,
CLOCK$, CONFIG$, DblBuff$, IFS$HLP$
具体的内容会因硬软g环境的不同而略有差? 使用q些讑֤名称? 需要保证以下三?
1. 该设备确实存?pY件虚拟的讑֤除外)
2. 该设备驱动程序已加蝲(aux, prn{标准设备由pȝ~省定义)
3. 该设备已准备?主要是指a: b: ..., com1..., lpt1...{?
可通过命o mem/d | find "device" /i 来检阅你的系l中所加蝲的设?
另外, 在DOSpȝ? 讑֤也被认ؓ是一U特D的文g, 而文件也可以UC字符讑֤; 因ؓ讑֤(device)与文仉是用句?handle)来管理的, 句柄是名字, cM于文件名, 只不q句柄不是应用于盘理, 而是应用于内存管理而已, 所谓设备加载也x在内存中为其分配可引用的句柄.
================================================================
3、if errorlevel <数字> 待执行的命o
很多DOSE序在运行结束后会返回一个数字值用来表C程序运行的l果(或者状?Q通过if errorlevel命o可以判断E序的返回|Ҏ(gu)不同的返回值来军_执行不同的命?q回值必L照从大到的序排列)。如果返回值等于指定的数字Q则条g成立Q运行命令,否则q行下一句?
如if errorlevel 2 goto x2
==== willsort ~注 ====================================================
q回g大到的序排列不是必须? 而只是执行命令ؓ goto 时的习惯用法, 当?set 作ؓ执行命o? 通常会从到大顺序排? 比如需返回码|入环境变量, 需使用以下的顺序Ş?
if errorlevel 1 set el=1
if errorlevel 2 set el=2
if errorlevel 3 set el=3
if errorlevel 4 set el=4
if errorlevel 5 set el=5
...
当然, 也可以用以下@环来替代, 原理是一致的:
for %%e in (1 2 3 4 5 6 7 8...) do if errorlevel %%e set el=%%e
更高效简z的用法, 可以参考我写的另一关于获?errorlevel 的文?
出现此种现象的原因是, if errorlevel 比较q回码的判断条gq{于, 而是大于{于. ׃ goto 的蟩转特? 由小到大排序会导致在较小的返回码处就跛_; 而由?set命o?"重复" 赋值特? 由大到小排序会导致较?yu)的q回?"覆盖" 较大的返回码.
另外, 虽然 if errorlevel=<数字> command 也是有效的命令行, 但也只是 command.com 解释命o行时?= 作ؓ命o行切分符而忽略掉|了
================================================================
二、goto 批处理文件运行到q里蟩到goto所指定的标?标号即labelQ标L:后跟标准字符串来定义)处,goto语句一般与if配合使用Q根据不同的条g来执行不同的命ol?
?
goto end
:end
echo this is the end
标号?#8220;:字符?#8221;来定义,标号所在行不被执行?
==== willsort ~注 ====================================================
label 常被译ؓ "标签" , 但是qƈ不具有广泛的U定?
goto <label> ?:<label> 联用可实现执行中途的跌{, 再结?if 可实现执行过E的条g分支, 多个 if 卛_实现命o的分l? cM C ?switch case l构或?Basic 中的 select case l构, 大规模且l构化的命o分组卛_实现高语言中的函数功能. 以下是批处理和C/Basic在语法结构上的对?
Batch C / Basic
goto&: goto&:
goto&:&if if{}&else{} / if&elseif&endif
goto&:&if... switch&case / select case
goto&:&if&set&envar... function() / function(),sub()
================================================================
三、choice 使用此命令可以让用户输入一个字W(用于选择Q,从而根据用L选择q回不同的errorlevelQ然后于if errorlevel配合Q根据用L选择q行不同的命令?
注意Qchoice命o为DOS或者Windowspȝ提供的外部命令,不同版本的choice命o语法会稍有不同,Lchoice /?查看用法?
choice的命令语法(该语法ؓWindows 2003中choice命o的语法,其它版本的choice的命令语法与此大同小异)Q?
CHOICE [/C choices] [/N] [/CS] [/T timeout /D choice] [/M text]
描述:
该工具允许用户从选择列表选择一个项目ƈq回所选项目的索引?
参数列表:
/C choices 指定要创建的选项列表。默认列表是 "YN"?
/N 在提C符中隐藏选项列表。提C前面的消息得到昄Q?
选项依旧处于启用状态?
/CS 允许选择分大写的选项。在默认情况下,q个工具
是不分大写的?
/T timeout 做出默认选择之前Q暂停的U数。可接受的值是?0
?9999。如果指定了 0Q就不会有暂停,默认选项
会得到选择?
/D choice ?nnnn U之后指定默认选项。字W必d?/C ?
Ҏ(gu)定的一l选择? 同时Q必ȝ /T 指定 nnnn?
/M text 指定提示之前要显C的消息。如果没有指定,工具?
昄提示?
/? 昄帮助消息?
注意:
ERRORLEVEL 环境变量被设|ؓ从选择集选择的键索引。列出的W一个?
择返?1Q第二个选择q回 2Q等{。如果用h的键不是有效的选择Q?
该工具会发出警告响声。如果该工具到错误状态,它会q回 255 ?
ERRORLEVEL 倹{如果用h Ctrl+Break ?Ctrl+C 键,该工具会q回 0
?ERRORLEVEL 倹{在一个批E序中?ERRORLEVEL 参数Ӟ参数降
序排列?
CZ:
CHOICE /?
CHOICE /C YNC /M "认h YQ否h NQ或者取消请?C?
CHOICE /T 10 /C ync /CS /D y
CHOICE /C ab /M "选项 1 请选择 aQ选项 2 请选择 b?
CHOICE /C ab /N /M "选项 1 请选择 aQ选项 2 请选择 b?
==== willsort ~注 ====================================================
我列出win98下choice的用法帮? 已资区分
Waits for the user to choose one of a set of choices.
{待用户选择一l待选字W中的一?
CHOICE [/C[:]choices] [/N] [/S] [/T[:]c,nn] [text]
/C[:]choices Specifies allowable keys. Default is YN
指定允许的按?待选字W?, 默认为YN
/N Do not display choices and ? at end of prompt string.
不显C提C字W串中的问号和待选字W?
/S Treat choice keys as case sensitive.
处理待选字W时大小写敏?
/T[:]c,nn Default choice to c after nn seconds
?nn U后默认选择 c
text Prompt string to display
要显C的提示字符?
ERRORLEVEL is set to offset of key user presses in choices.
ERRORLEVEL 被设|ؓ用户键入的字W在待选字W中的偏Ud?
================================================================
如果我运行命令:CHOICE /C YNC /M "认h YQ否h NQ或者取消请?C?
屏幕上会昄Q?
认h YQ否h NQ或者取消请?C?[Y,N,C]?
例:test.bat的内容如下(注意Q用if errorlevel判断q回值时Q要按返回g高到低排列):
@echo off
choice /C dme /M "defrag,mem,end"
if errorlevel 3 goto end
if errorlevel 2 goto mem
if errorlevel 1 goto defrag
:defrag
c:\dos\defrag
goto end
:mem
mem
goto end
:end
echo good bye
此批处理q行后,显C?#8220;defrag,mem,end[D,M,E]?” Q用户可选择d m e Q然后if语句Ҏ(gu)用户的选择作出判断Qd表示执行标号为defrag的程序段Qm表示执行标号为mem的程序段Qe表示执行标号为end的程序段Q每个程序段最后都以goto end程序蟩到end标号处,然后E序显Cgood byeQ批处理q行l束?
四、for 循环命oQ只要条件符合,它将多次执行同一命o?
语法Q?
对一l文件中的每一个文件执行某个特定命令?
FOR %%variable IN (set) DO command [command-parameters]
%%variable 指定一个单一字母可替换的参数?
(set) 指定一个或一l文件。可以用通配W?
command 指定Ҏ(gu)个文件执行的命o?
command-parameters
为特定命令指定参数或命o行开兟?
例如一个批处理文g中有一?
for %%c in (*.bat *.txt) do type %%c
则该命o行会昄当前目录下所有以bat和txt为扩展名的文件的内容?
==== willsort ~注 ====================================================
需要指出的? ?)中的字符串ƈ非单个或多个文g名时, 它将单纯被当作字W串替换, q个Ҏ(gu)再加上()中可以嵌入多个字W串的特? 很明?for 可以被看作一U遍历型循环.
当然, ?nt/2000/xp/2003 pd的命令行环境? for 被赋予了更多的特? 使之可以分析命o输出或者文件中的字W串, 也有很多开兌用于扩展了文件替换功?
===============================================================Q?
批处理示?
1. IF-EXIST
1) 首先用记事本在C:\建立一个test1.bat批处理文Ӟ文g内容如下Q?
@echo off
IF EXIST \AUTOEXEC.BAT TYPE \AUTOEXEC.BAT
IF NOT EXIST \AUTOEXEC.BAT ECHO \AUTOEXEC.BAT does not exist
然后q行它:
C:\>TEST1.BAT
如果C:\存在AUTOEXEC.BAT文gQ那么它的内容就会被昄出来Q如果不存在Q批处理׃提示你该文g不存在?
2) 接着再徏立一个test2.bat文gQ内容如下:
@ECHO OFF
IF EXIST \%1 TYPE \%1
IF NOT EXIST \%1 ECHO \%1 does not exist
执行:
C:\>TEST2 AUTOEXEC.BAT
该命令运行结果同上?
说明Q?
(1) IF EXIST 是用来测试文件是否存在的Q格式ؓ
IF EXIST [路径+文g名] 命o
(2) test2.bat文g中的%1是参敎ͼDOS允许传?个批参数信息l批处理文gQ分别ؓ%1~%9(%0表示test2命o本n) Q这有点象编E中的实参和形参的关p,%1是Ş参,AUTOEXEC.BAT是实参?
==== willsort ~注 ====================================================
DOS没有 "允许传?个批参数信息" 的限? 参数的个数只会受到命令行长度和所调用命o处理能力的限? 但是, 我们在批处理E序? 在同一时刻只能同时引用10个参? 因ؓ DOS只给Z %0~%9q十个参数引用符.
================================================================
3) 更进一步的Q徏立一个名为TEST3.BAT的文Ӟ内容如下Q?
@echo off
IF "%1" == "A" ECHO XIAO
IF "%2" == "B" ECHO TIAN
IF "%3" == "C" ECHO XIN
如果q行Q?
C:\>TEST3 A B C
屏幕上会昄:
XIAO
TIAN
XIN
如果q行Q?
C:\>TEST3 A B
屏幕上会昄
XIAO
TIAN
在这个命令执行过E中QDOS会将一个空字符串指定给参数%3?
2、IF-ERRORLEVEL
建立TEST4.BATQ内容如下:
@ECHO OFF
XCOPY C:\AUTOEXEC.BAT D:\
IF ERRORLEVEL 1 ECHO 文g拯p|
IF ERRORLEVEL 0 ECHO 成功拯文g
然后执行文g:
C:\>TEST4
如果文g拯成功Q屏q就会显C?#8220;成功拯文g”Q否则就会显C?#8220;文g拯p|”?
IF ERRORLEVEL 是用来测试它的上一个DOS命o的返回值的Q注意只是上一个命令的q回|而且q回值必M照从大到次序顺序判断?
因此下面的批处理文g是错误的Q?
@ECHO OFF
XCOPY C:\AUTOEXEC.BAT D:\
IF ERRORLEVEL 0 ECHO 成功拯文g
IF ERRORLEVEL 1 ECHO 未找到拷贝文?
IF ERRORLEVEL 2 ECHO 用户通过ctrl-c中止拯操作
IF ERRORLEVEL 3 ECHO 预置错误L文g拯操作
IF ERRORLEVEL 4 ECHO 拯q程中写盘错?
无论拯是否成功Q后面的Q?
未找到拷贝文?
用户通过ctrl-c中止拯操作
预置错误L文g拯操作
拯q程中写盘错?
都将昄出来?
以下是几个常用命o的返回值及其代表的意义Q?
backup
0 备䆾成功
1 未找到备份文?
2 文g׃n冲突L备䆾完成
3 用户用ctrl-c中止备䆾
4 ׃致命的错误备䆾操作中止
diskcomp
0 盘比较相?
1 盘比较不?
2 用户通过ctrl-c中止比较操作
3 ׃致命的错误比较操作中止
4 预置错误中止比较
diskcopy
0 盘拷贝操作成?
1 非致命盘?写错
2 用户通过ctrl-cl束拯操作
3 因致命的处理错误使盘拯中止
4 预置错误L拯操作
format
0 格式化成?
3 用户通过ctrl-c中止格式化处?
4 因致命的处理错误使格式化中止
5 在提C?#8220;proceed with formatQy/nQ?”下用户键入nl束
xcopy
0 成功拯文g
1 未找到拷贝文?
2 用户通过ctrl-c中止拯操作
4 预置错误L文g拯操作
5 拯q程中写盘错?
==== willsort ~注 ====================================================
chkdsk
0 未找到错?
255 扑ֈ一个或多个错误
choice
0 用户按下ctrl+c/break
1 用户按下W一个键
255 到命o行中的错误条?
其它 用户按下的有效字W在列表中的位置
defrag
0 片压羃成功
1 出现内部错误
2 盘上没有空。要q行DEFRAGQ至要有一个空?
3 用户用Ctrl+C退ZDEFRAG
4 出现一般性错?
5 DEFRAG在读时遇到错误
6 DEFRAG在写时遇到错误
7 分配I间有错
8 内存?
9 没有_I间来压~磁盘碎?
deltree
0 成功地删除一个目?
diskcomp
0 两盘相同
1 发现不同
2 按CTRL+C l止了比?
3 出现严重错误
4 出现初始化错?
find
0 查找成功且至找C一个匹配的字符?
1 查找成功但没扑ֈ匚w的字W串
2 查找中出C错误
keyb
0 键盘定义文g装入成功
1 使用了非法的键盘代码Q字W集或语?
2 键盘定义文g坏或未找?
4 键盘、监视器通讯时出?
5 要求的字W集未准备好
move
0 成功地移动了指定的文?
1 发生了错?
msav /N
86 查到了病?
replace
0 REPLACE成功地替换或加入了文?
1 MS-DOS版本和REPLACE不兼?
2 REPLACE找不到源文g
3 REPLACE找不到源路径或目标\?
5 不能存取要替换的文g
8 内存不够无法执行REPLACE
11 命o行句法错?
restore
0 RESTORE成功地恢复了文g
1 RESTORE找不到要恢复的文?
3 用户按CTRL+Cl止恢复q程
4 RESTORE因错误而终?
scandisk
0 ScanDisk在它查的驱动器上未检到M错误
1 ׃命o行的语法不对Q不能运行ScanDisk
2 ׃内存用尽或发生内部错误,ScanDisk意外l止
3 用户让ScanDisk中途退?
4 q行盘面扫描Ӟ用户军_提前退?
254 ScanDisk扑ֈ盘故障q已全部校正
255 ScanDisk扑ֈ盘故障Q但未能全部校正
setver
0 SETVER成功地完成了d
1 用户指定了一个无效的命o开?
2 用户指定了一个非法的文g?
3 没有_的系l内存来q行命o
4 用户指定了一个非法的版本h?
5 SETVER在版本表中未扑ֈ指定的项
6 SETVER未找到SETVER.EXE文g
7 用户指定了一个非法的驱动?
8 用户指定了太多的命o行参?
9 SETVER到丢失了命令行参数
10 在读SETVER.EXE文gӞSETVER到发生错误
11 SETVER.EXE文g损坏
12 指定的SETVER.EXE文g不支持版本表
13 版本表中没有_的空间存放新的项
14 在写SETVER.EXE文g时SETVER到发生错误
================================================================
3、IF STRING1 == STRING2
建立TEST5.BATQ文件内容如下:
@echo off
IF "%1" == "A" FORMAT A:
执行Q?
C:\>TEST5 A
屏幕上就出现是否A:盘格式化的内宏V?
注意Qؓ了防止参CؓI的情况Q一般会字W串用双引号Q或者其它符P注意不能使用保留W号Q括h?
如:if [%1]==[A] 或?if %1*==A*
5、GOTO
建立TEST6.BATQ文件内容如下:
@ECHO OFF
IF EXIST C:\AUTOEXEC.BAT GOTO _COPY
GOTO _DONE
:_COPY
COPY C:\AUTOEXEC.BAT D:\
:_DONE
注意Q?
(1) 标号前是ASCII字符的冒?:"Q冒号与标号之间不能有空根{?
(2) 标号的命名规则与文g名的命名规则相同?
(3) DOS支持最长八位字W的标号Q当无法区别两个标号Ӟ蟩转至最q的一个标受?
==== willsort ~注 ====================================================
1)标号也称作标{?label)
2)标签不能以大多数的非字母数字字符开? 而文件名中则可以使用很多
3)当无法区别两个标{时, 蟩转至位置最靠前的标{?
================================================================
6、FOR
建立C:\TEST7.BATQ文件内容如下:
@ECHO OFF
FOR %%C IN (*.BAT *.TXT *.SYS) DO TYPE %%C
q行Q?
C:\>TEST7
执行以后Q屏q上会将C:盘根目录下所有以BAT、TXT、SYS为扩展名的文件内Ҏ(gu)C出来(不包括隐藏文Ӟ?nbsp;
FOR %variable IN (set) DO command [command-parameters]
%variable 指定一个单一字母可替换的参数?br> (set) 指定一个或一l文件。可以用通配W?br> command 指定Ҏ(gu)个文件执行的命o?br> command-parameters
为特定命令指定参数或命o行开兟?/p>
在批处理E序中?FOR 命oӞ指定变量请?%%variable
而不要用 %variable。变量名U是区分大小写的Q所?%i 不同?%I.
如果命o扩展被启用,下列额外?FOR 命o格式会受?br>支持:
FOR /D %variable IN (set) DO command [command-parameters]
如果集中包含通配W,则指定与目录名匹配,而不与文?br> 名匹配?/p>
FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]
查以 [drive:]path 为根的目录树Q指向每个目录中?br> FOR 语句。如果在 /R 后没有指定目录,则用当?br> 目录。如果集仅ؓ一个单?.)字符Q则枚D该目录树?/p>
FOR /L %variable IN (start,step,end) DO command [command-parameters]
该集表示以增量Ş式从开始到l束的一个数字序列?br> 因此Q?1,1,5) 生序?1 2 3 4 5Q?5,-1,1) ?br> 序列 (5 4 3 2 1)?/p>
FOR /F ["options"] %variable IN (file-set) DO command [command-parameters]
FOR /F ["options"] %variable IN ("string") DO command [command-parameters]
FOR /F ["options"] %variable IN ('command') DO command [command-parameters]
或者,如果?usebackq 选项:
FOR /F ["options"] %variable IN (file-set) DO command [command-parameters]
FOR /F ["options"] %variable IN ("string") DO command [command-parameters]
FOR /F ["options"] %variable IN ('command') DO command [command-parameters]
filenameset Z个或多个文g名。l到 filenameset 中的
下一个文件之前,每䆾文g都已被打开、读取ƈl过处理?br> 处理包括d文gQ将其分成一行行的文字,然后每?br> 解析成零或更多的W号。然后用已找到的W号字符串变量?br> 调用 For 循环。以默认方式Q?F 通过每个文g的每一行中分开
的第一个空白符受蟩q空白行。?zhn)可通过指定可?"options"
参数替代默认解析操作。这个带引号的字W串包括一个或多个
指定不同解析选项的关键字。这些关键字?
eol=c - 指一个行注释字符的结?׃?
skip=n - 指在文g开始时忽略的行数?br> delims=xxx - 指分隔符集。这个替换了I格和蟩格键?br> 默认分隔W集?br> tokens=x,y,m-n - 指每行的哪一个符可传递到每个q代
?for 本n。这会导致额外变量名U的分配。m-n
格式Z个范围。通过 nth W号指定 mth。如?br> W号字符串中的最后一个字W星P
那么额外的变量将在最后一个符可析之?br> 分配q接受行的保留文本?br> usebackq - 指定新语法已在下cL况中使用:
在作为命令执行一个后引号的字W串q且一个单
引号字符为文字字W串命oq允许在 filenameset
中用双引号扩v文g名称?/p>
某些范例可能有助:
FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k
会分?myfile.txt 中的每一行,忽略以分h头的那些行,?br> 每行中的W二个和W三个符号传递给 for 函数体,用逗号??br> I格分隔W号。请注意Q此 for 函数体的语句引用 %i ?br> 获得W二个符P引用 %j 来获得第三个W号Q引?%k
来获得第三个W号后的所有剩余符受对于带有空格的文g
名,(zhn)需要用双引号将文g名括h。ؓ了用q种方式来
用双引号Q还需要?usebackq 选项Q否则,双引号会
被理解成是用作定义某个要分析的字W串的?/p>
%i ?for 语句中显式声明,%j ?%k 是通过
tokens= 选项隐式声明的。可以通过 tokens= 一?br> 指定最?26 个符P只要不试囑֣明一个高于字?"z" ?br> "Z" 的变量。请CQFOR 变量是单一字母、分大小写和全局的变量;
而且Q不能同时用超q?52 个?/p>
q可以在盔R字符串上使用 FOR /F 分析逻辑Q方法是Q?br> 用单引号括号之间的 filenameset 括v来。这P该字W?br> 串会被当作一个文件中的一个单一输入行进行解析?/p>
最后,可以?FOR /F 命o来分析命令的输出。方法是Q将
括号之间?filenameset 变成一个反括字W串。该字符串会
被当作命令行Q传递到一个子 CMD.EXEQ其输出会被捕获?br> 内存中,q被当作文g分析。如以下例子所C?
FOR /F "usebackq delims==" %i IN (`set`) DO @echo %i
会枚丑ֽ前环境中的环境变量名U?/p>
另外QFOR 变量参照的替换已被增强。?zhn)现在可以使用下?br>选项语法:
%~I - 删除M引号(")Q扩?%I
%~fI - ?%I 扩展C个完全合格的路径?br> %~dI - 仅将 %I 扩展C个驱动器?br> %~pI - 仅将 %I 扩展C个\?br> %~nI - 仅将 %I 扩展C个文件名
%~xI - 仅将 %I 扩展C个文件扩展名
%~sI - 扩展的\径只含有短名
%~aI - ?%I 扩展到文件的文g属?br> %~tI - ?%I 扩展到文件的日期/旉
%~zI - ?%I 扩展到文件的大小
%~$PATH:I - 查找列在路径环境变量的目录,q将 %I 扩展
到找到的W一个完全合格的名称。如果环境变量名
未被定义Q或者没有找到文Ӟ此组合键会扩展到
I字W串
可以l合修饰W来得到多重l果:
%~dpI - 仅将 %I 扩展C个驱动器号和路径
%~nxI - 仅将 %I 扩展C个文件名和扩展名
%~fsI - 仅将 %I 扩展C个带有短名的完整路径?br> %~dp$PATH:I - 搜烦列在路径环境变量的目录,q将 %I 扩展
到找到的W一个驱动器号和路径?br> %~ftzaI - ?%I 扩展到类D出线路的 DIR
在以上例子中Q?I ?PATH 可用其他有效数gѝ?~ 语法
用一个有效的 FOR 变量名终止。选取cM %I 的大写变量名
比较易读Q而且避免与不分大写的组合键h?/p>