例2:C:根目录下有一批处理文件名为f.bat,内容为: 
@echo off 
format %1 

如果执行C:\>f a: 
那么在执行f.bat时,%1就表示a:,这样format %1就相当于format a:,于是上面的命令运行时实际执行的是format a: 

例3:C:根目录下一批处理文件名为t.bat,内容为: 
@echo off 
type %1 
type %2 

那么运行C:\>t a.txt b.txt 
%1 : 表示a.txt 
%2 : 表示b.txt 
于是上面的命令将顺序地显示a.txt和b.txt文件的内容。 

==== 注 =============== 
参数在批处理中也作为变量处理, 所以同样使用百分号作为引导符, 其后跟0-9中的一个数字构成参数引用符. 引用符和参数之间 (例如上文中的 %1 与 a: ) 的关系类似于变量指针与变量值的关系. 当我们要引用第十一个或更多个参数时, 就必须移动DOS 的参数起始指针. shift 命令正充当了这个移动指针的角色, 它将参数的起始指针移动到下一个参数, 类似C 语言中的指针操作. 图示如下: 

初始状态, cmd 为命令名, 可以用 %0 引用 
cmd arg1 arg2 arg3 arg4 arg5 arg6 arg7 arg8 arg9 arg10 
^ ^ ^ ^ ^ ^ ^ ^ ^ ^ 
| | | | | | | | | | 
%0 %1 %2 %3 %4 %5 %6 %7 %8 %9 

经过1次shift后, cmd 将无法被引用 
cmd arg1 arg2 arg3 arg4 arg5 arg6 arg7 arg8 arg9 arg10 
^ ^ ^ ^ ^ ^ ^ ^ ^ ^ 
| | | | | | | | | | 
%0 %1 %2 %3 %4 %5 %6 %7 %8 %9 

经过2次shift后, arg1也被废弃, %9指向为空, 没有引用意义 
cmd arg1 arg2 arg3 arg4 arg5 arg6 arg7 arg8 arg9 arg10 
^ ^ ^ ^ ^ ^ ^ ^ ^ 
| | | | | | | | | 
%0 %1 %2 %3 %4 %5 %6 %7 %8 

遗憾的是, win9x 和DOS下均不支持 shift 的逆操作. 只有在 nt 内核命令行环境下, shift 才支持 /n 参数, 可以以第一参数为基准返复移动起始指针. 
================= 

特殊命令 


if goto choice for是批处理文件中比较高级的命令,如果这几个你用得很熟练,你就是批处理文件的专家啦。 


一、if 是条件语句,用来判断是否符合规定的条件,从而决定执行不同的命令。 有三种格式: 

1、if [not] "参数" == "字符串" 待执行的命令 

参数如果等于(not表示不等,下同)指定的字符串,则条件成立,运行命令,否则运行下一句。 

例:if "%1"=="a" format a: 

==== 

if 的命令行帮助中关于此点的描述为: 
IF [NOT] string1==string2 command 
在此有以下几点需要注意: 
1. 包含字符串的双引号不是语法所必须的, 而只是习惯上使用的一种"防空"字符 
2. string1 未必是参数, 它也可以是环境变量, 循环变量以及其他字符串常量或变量 
3. command 不是语法所必须的, string2 后跟一个空格就可以构成一个有效的命令行 
============================= 

2、if [not] exist [路径\]文件名 待执行的命令 
如果有指定的文件,则条件成立,运行命令,否则运行下一句。 

如: if exist c:\config.sys type c:\config.sys 
表示如果存在c:\config.sys文件,则显示它的内容。 

****** 注 ******** 
也可以使用以下的用法: 
if exist command 
device 是指DOS系统中已加载的设备, 在win98下通常有: 
AUX, PRN, CON, NUL 
COM1, COM2, COM3, COM4 
LPT1, LPT2, LPT3, LPT4 
XMSXXXX0, EMMXXXX0 
A: B: C: ..., 
CLOCK$, CONFIG$, DblBuff$, IFS$HLP$ 
具体的内容会因硬软件环境的不同而略有差异, 使用这些设备名称时, 需要保证以下三点: 
1. 该设备确实存在(由软件虚拟的设备除外) 
2. 该设备驱动程序已加载(aux, prn等标准设备由系统缺省定义) 
3. 该设备已准备好(主要是指a: b: ..., com1..., lpt1...等) 
可通过命令 mem/d | find "device" /i 来检阅你的系统中所加载的设备 
另外, 在DOS系统中, 设备也被认为是一种特殊的文件, 而文件也可以称作字符设备; 因为设备(device)与文件都是使用句柄(handle)来管理的, 句柄就是名字, 类似于文件名, 只不过句柄不是应用于磁盘管理, 而是应用于内存管理而已, 所谓设备加载也即指在内存中为其分配可引用的句柄. 
================================== 

3、if errorlevel <数字> 待执行的命令 

很多DOS程序在运行结束后会返回一个数字值用来表示程序运行的结果(或者状态),通过if errorlevel命令可以判断程序的返回值,根据不同的返回值来决定执行不同的命令(返回值必须按照从大到小的顺序排列)。如果返回值等于指定的数字,则条件成立,运行命令,否则运行下一句。 

如if errorlevel 2 goto x2 

==== 注 =========== 
返回值从大到小的顺序排列不是必须的, 而只是执行命令为 goto 时的习惯用法, 当使用 set 作为执行命令时, 通常会从小到大顺序排列, 比如需将返回码置入环境变量, 就需使用以下的顺序形式: 

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 

更高效简洁的用法, 可以参考我写的另一篇关于获取 errorlevel 的文章 

出现此种现象的原因是, if errorlevel 比较返回码的判断条件并非等于, 而是大于等于. 由于 goto 的跳转特性, 由小到大排序会导致在较小的返回码处就跳出; 而由于 set命令的 "重复" 赋值特性, 由大到小排序会导致较小的返回码 "覆盖" 较大的返回码. 

另外, 虽然 if errorlevel=<数字> command 也是有效的命令行, 但也只是 command.com 解释命令行时将 = 作为命令行切分符而忽略掉罢了 
posted on 2010-01-18 21:57  oKmAn.Org  阅读(210)  评论(0编辑  收藏  举报