使用Notepad++编辑bat脚本,会很清晰。

 

BAT批处理文件语法之常用命令和参数

常用命令  

echo、@、call、pause、rem(小技巧:用::代替rem)是批处理文件最常用的几个命令,我们就从他们开始学起。  

==== 注 ===========  
首先, @ 不是一个命令, 而是DOS 批处理的一个特殊标记符, 仅用于屏蔽命令行回显. 下面是DOS命令行或批处理中可能会见到的一些特殊标记符:  
CR(0D) 命令行结束符  
Escape(1B) ANSI转义字符引导符  
Space(20) 常用的参数界定符  
Tab(09) ; = 不常用的参数界定符  
+ COPY命令文件连接符  
* ? 文件通配符  
“” 字符串界定符  
| 命令管道符  
< > >> 文件重定向符  
@ 命令行回显屏蔽符  
/ 参数开关引导符  
: 批处理标签引导符  
% 批处理变量引导符  

其次, :: 确实可以起到rem 的注释作用, 而且更简洁有效; 但有两点需要注意:  
第一, 除了 :: 之外, 任何以 :开头的字符行, 在批处理中都被视作标号, 而直接忽略其后的所有内容, 只是为了与正常的标号相区别, 建议使用 goto 所无法识别的标号, 即在 :后紧跟一个非字母数字的一个特殊符号.  
第二, 与rem 不同的是, ::后的字符行在执行时不会回显, 无论是否用echo on打开命令行回显状态, 因为命令解释器不认为他是一个有效的命令行, 就此点来看, rem 在某些场合下将比 :: 更为适用; 另外, rem 可以用于 config.sys 文件中.  
=====================  

echo 表示显示此命令后的字符  
echo off 表示在此语句后所有运行的命令都不显示命令行本身  
@与echo off相象,但它是加在每个命令行的最前面,表示运行时不显示这一行的命令行(只能影响当前行)。  
call 调用另一个批处理文件(如果不用call而直接调用别的批处理文件,那么执行完那个批处理文件后将无法返回当前文件并执行当前文件的后续命令)。  
pause 运行此句会暂停批处理的执行并在屏幕上显示Press any key to continue…的提示,等待用户按任意键后继续  
rem 表示此命令后的字符为解释行(注释),不执行,只是给自己今后参考用的(相当于程序中的注释)。  
==== 注 =====  
此处的描述较为混乱, 不如直接引用个命令的命令行帮助更为条理  

————————-  
ECHO  

当程序运行时,显示或隐藏批处理程序中的正文。也可用于允许或禁止命令的回显。  

在运行批处理程序时,MS-DOS一般在屏幕上显示(回显)批处理程序中的命令。  
使用ECHO命令可关闭此功能。  

语法  

ECHO [ON|OFF]  

若要用echo命令显示一条命令,可用下述语法:  

echo [message]  

参数  

ON|OFF  
指定是否允许命令的回显。若要显示当前的ECHO的设置,可使用不带参数的ECHO  
命令。  

message  
指定让MS-DOS在屏幕上显示的正文。  

——————-  

CALL  

从一个批处理程序中调用另一个批处理程序,而不会引起第一个批处理的中止。  

语法  

CALL [drive:][path]filename [batch-parameters]  

参数  

[drive:][path]filename  
指定要调用的批处理程序的名字及其存放处。文件名必须用.BAT作扩展名。  


batch-parameters  
指定批处理程序所需的命令行信息。  

——————————-  

PAUSE  

暂停批处理程序的执行并显示一条消息,提示用户按任意键继续执行。只能在批处  
理程序中使用该命令。  

语法  

PAUSE  


REM  

在批处理文件或CONFIG.SYS中加入注解。也可用REM命令来屏蔽命令(在CONFIG.SYS  
中也可以用分号 ; 代替REM命令,但在批处理文件中则不能替代)。  

语法  

REM [string]  

参数  

string  
指定要屏蔽的命令或要包含的注解。  
=======================  

例1:用edit编辑a.bat文件,输入下列内容后存盘为c:\a.bat,执行该批处理文件后可实现:将根目录中所有文件写入 a.txt中,启动UCDOS,进入WPS等功能。  

  批处理文件的内容为:         命令注释:  

    @echo off           不显示后续命令行及当前命令行  
    dir c:*.* >a.txt       将c盘文件列表写入a.txt  
    call c:\ucdos\ucdos.bat    调用ucdos  
    echo 你好            显示”你好”  
    pause              暂停,等待按键继续  
    rem 准备运行wps         注释:准备运行wps  
    cd ucdos            进入ucdos目录  
    wps               运行wps    

批处理文件的参数  

批处理文件还可以像C语言的函数一样使用参数(相当于DOS命令的命令行参数),这需要用到一个参数表示符”%”。  

%[1-9]表示参数,参数是指在运行批处理文件时在文件名后加的以空格(或者Tab)分隔的字符串。变量可以从%0到%9,%0表示批处理命令本身,其它参数字符串用%1到%9顺序表示。  

例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 参数, 可以以第一参数为基准返复移动起始指针.