批处理命令 - 勿忧无虑
一.常用命令
echo、@、call、rem、pause 、goto、set是批处理文件最常用的几个命令。
echo 命令:
打开回显或关闭请求回显功能,或显示消息。如果没有任何参数,echo 命令将显示当前回显设置。
语法
echo [{on|off}] [message] Sample:
@echo off / echo hello world
在实际应用中我们会把这条命令和重定向符号(也称为管道符号,一般用> >> ^)结合来实现输入一 些命令到特定的文件中。
@命令符:
@与echo off功能相似,但它是加在其他命令行的最前面,表示运行时不显示命令行本身。
举例:
—————————————————————————————————-
@echo off
@echo Now initializing the program,please wait a minite…
@format X: /q/u/autoset //format命令不可以使用/y参数,但可以使用autoset这个 //参数,效果和y是一样的
—————————————————————————————————-
call命令:
call命令用于从一个批处理程序调用另一个批处理程序,而不终止父批处理程序。
call命令提示接受用作调用目标的标签。如果在脚本或批处理文件外使用call命令,则其不会在命令行起作用。
语法:
call [[Drive:][Path] FileName [Bathparameters]] [:labe] [Arguments]]
参数:
[Drive:][Path] FileName 指定要调用的批处理程序的位置和名称。FileName参数必须有.bat或.cmd扩展名。
Batchparameters 指定批处理程序所需的任何命令行信息,包括命令行选项、文件名、批处理参数(即从%0到%9)或变量(例如,%baud%)。
:Label 指定批处理程序要跳转到的标签。使用带有该参数的call命令,可以创建新的批处理文件上下文,并将控制权交给指定标签后的语句。首先遇到该处理文件的末尾时(在跳转到标签后),控制权将交还给call语句后的语句。第二次遇到批处理文件的末尾时,将推出批处理脚本。
Arguments 对于以:Label开始的批处理程序,指定要传递给其新实例的所有命令行信息,包括命令行选项、文件名、批处理参数(即从%1到%9)或变量(例如,%baud%)。
举例: 要从其他批处理程序运行checknew.bat程序,请在父批处理程序中输入以下命令:
—————————————————————————————————-
call checknew
—————————————————————————————————-
如果父批处理程序接受两个批处理参数并且希望将这些参数传递给checknew.bat,则可以在父批处理程序中使用以下命令:
—————————————————————————————————-
call checknew %1 %2
—————————————————————————————————-
也可以在批处理中调用的命令行命令前加call,这样在运行完这条命令后,会继续运行批处理任务。
rem 命令:
注释命令,类似于在C语言中的/*——–*/,它并不会被执行,只是起一个注释的作用,便于别人阅读 和你自己日后修改。
:: 也具有rem的功能
Rem Message
Sample:@Rem Here is the description.
pause 命令:
暂停命令。
运行 Pause 命令时,将显示下面的消息:
Press any key to continue. . .(或:请按任意键继续. . .)
Sample:
@echo off
:begin
copy G:*.* d:\back
echo 请插入另一张光盘…
pause
goto begin
在这个例子中,驱动器 G 中磁盘上的所有文件均复制到d:\back中。显示的注释提示您将另一张光盘 盘放入驱动器 G 时,pause 命令会使程序挂起,以便您更换光盘,然后按任意键继续处理。
start 命令:
调用外部程序,所有的DOS命令和命令行程序都可以由start命令来调用。
如:start calc.exe即可打开Windows的计算器。
常用参数:
MIN 开始时窗口最小化
SEPARATE 在分开的空间内开始 16 位 Windows 程序
HIGH 在 HIGH 优先级类别开始应用程序
REALTIME 在 REALTIME 优先级类别开始应用程序
WAIT 启动应用程序并等候它结束
parameters 这些为传送到命令/程序的参数
执行的应用程序是 32-位 GUI 应用程序时,CMD.EXE 不等应用程序终止就返回命令提示。如果在命令 脚本内执行,该新行为则不会发生。
goto 命令:
跳转命令。程序指针跳转到指定的标签,从标签后的第一条命令开始继续执行批处理程序。
语法: goto label
参数: label 指定所要转向的批处理程序中的行。
Sample:
if {%1}=={} goto noparms
if {%2}=={} goto noparms(如果这里的if、%1、%2你不明白的话,先跳过去,后面会有详细的解释 。)
@Rem check parameters if null show usage
:noparms
echo Usage: monitor.bat ServerIP PortNumber
goto end
标签的名字可以随便起,但是最好是有意义的字母啦,字母前加个:用来表示这个字母是标签,goto 命令就是根据这个:来寻找下一步跳到到那里。最好有一些说明这样你别人看起来才会理解你的意图啊。
set 命令:
显示、设置或删除变量。
显示变量:set 或 set s 前者显示批处理当前已定义的所有变量及其值,后者显示所有以s开头的变量及值。
设置变量:set aa=abcd 此句命令便可向变量aa赋值abcd。如果变量aa已被定义,则aa的值被修改为abcd;若aa尚未定义,则此句命令即可定义新的变量aa,同时为变量aa赋予初始值abcd。
删除变量:set aa= 此句命令即可删除变量aa。若变量aa已被定义,则删除变量aa;若aa尚未定义,则此句命令没实质意义。
需要说明的是,批处理中的变量是不区分类型的,不需要像C语言中的变量那样还要区分int、float、char等。比如执行set aa=345后,变量aa的值既可以被视为数字345,也可以被视为字符串345。
set命令具有扩展功能,如用作交互输入、字符串处理、数值计算等,属于高级命令范畴。
二.高级命令
if、choice、for等命令是批处理文件中比较高级的命令
if命令:
if命令用于在批处理程序中执行条件处理
语法:
if [not] errorlevel Number Command [else Expression]
if [not] Strting==String2 Command [else Expression]
if [not] exist FileName Command [else Expression}
如果启用了命令扩展,可以使用以下语法:
if [/i] String1 Compare0p String2 command [else Expression]
if cmdextversion Nuber Command [else Expression]
参数:
not :指定只有当条件为假时才执行该命令
errorlevel Number :只有当由cmd.exe运行的前一个程序返回等于或大于Number的退出码时,才能指定真条件。
Command :指定只有满足前面的条件时才执行的命令。
String1==String2 :只有当String和String2相同时才能指定真条件。这些值可以是文字字符串或批处理变量(例如%1)。对于文字字符串,不需要使用问号。
exist FileName :如果FileName存在,则指定真条件。
Compareop: 指定3个字母的比较运算符。表1列出了Compareop的有效值。
运 算 符 描 述 运 算 符 描 述
EQU 等于 LEQ 小于或等于
NEQ 不等于 GTR 大于
LSS 小于 GEQ 大于或等于
/i :强制字符串比较忽略大小写。可以在if的String1==String2格上使用/i。这些比较是通用的。因为如果String1和String2全部由数字组成,则字符串将转化为数字并执行比较。
cmdxtversion Number :只有与cmd.exe的“命令扩展”功能相关的内部版本号等于或大于Number时,才指定真条件。第一版本是1。当命令扩展的功能有重大增强时,则在此号码上加1。禁用命令扩展时(默认情况下命令扩展为启用),cmdextversion条件不为真。
defined Variable :如果定义了Variable,则指定条件为真。
Expression :指定将传递给else子句中的命令行命令和任何参数。
举例: 例1:要在找不到文件product.dat时显示找不到数据文件的消息,则输入:
if not exist product .dat echo Cannot find data file
例2:如果在格式化驱动器A中的磁盘期间发生错误,则以下命令将显示错误消息。
—————————————————————————————————-
:begin
@echo off
format a:/s
if not errorlevel 1 goto end
echo An error occurred during formatting.
:end echo End of batch program.
—————————————————————————————————-
如果没发生错误,不会出现错误消息
常用判断语句:
1、判断驱动器、文件或文件夹是否存在,用 if exist 语句;
2、判断某两个字符串是否相等,用 if “字符串1″==”字符串2” 语句;
3、判断某两个数值是否相等,用 if 数值1 equ 数值2 语句;
4、判断某个变量是否已经被赋值,用 if defined str 语句;
choice命令:
使用choice命令,在批处理程序中,通过显示提示信息并暂停批处理程序,用户可以从一组选项键中进行选择。
语法:
choice [/c [Choices]] [/n] [/cs] [/t Timeout /d Choice] [/m Text]
参数:
/c Choices 指定用户选项键。显示时,选项键由逗号分隔,出现在中括号([])中,后面跟着问号。如果未指定“/c Choices ”,默认情况下,Choice显示使用[Y,N]。
/n 隐藏用户选项键。如果使用此命令行选项,将在提示符之前出现消息正文,选项仍处于启用状态。
/cs 指定用户选项键必须区分大小写。默认情况下,用户选项键不区分大小写。
/t Timeout /d Choice 指定在默认为指定键之前choice暂停指定的秒数。
表2描述了/t命令行选项的值。
值 描 述
Timeout 要暂停的秒数。可接受的值介于0~9 999。如果使用0,choice在默认为指定键之前不暂停
/d Choice 指定Timeout秒数之后的默认选择。使用的字符必须在由/c Choice指定的选择集中。如果使用此命令行选项,还必须同时指定/t Timeout
指定要在提示符之前显示的文字。如果使用包括命令行选项字符(即“/”)作为提示符之前的一部分文字,必须用引号将该文字引起来。如果未指定任何文字,choice将只显示提示符。
举例:
—————————————————————————————————-
@echo off
choice /C dme /m “defrag,mem,end”
if errorlevel 3 goto end //应先判断数值最高的错误码
if errorlevel 2 goto mem
if errotlevel 1 goto defrag
:defrag
c:\dos\defrag
goto den
:end echo good bye
—————————————————————————————————-
此文件运行后,将显示:
defrag,men,end[D,M,E]?用户可选择d m e
然后if语句将做出判断,c表示执行标号为end的程序段,程序结束。
for命令:
for命令用于对一组文件中的每个文件运行指定的命令
语法:
for [%Variable | %%Variable ] in (Set) do Command [CommandLineoptions]
参数:
[%Variable | %%Variable ] :必需参数,代表可替换的参数。使用%Variable通过命令提示符执行for命令。使用%%Variable在批处理文件中执行for命令。变量要区分大小写,并且必须用Alpha值表示,例如%A、%B或%C。
(set) :必需参数,指定要用指定命令处理的一个或多个文件、目录、数值范围以及文本字符串。需要括号。
Command :必需参数,指定要对包括在指定的(Set)中每个文件、目录、数值范围以及文本字符串所执行的命令。
CommandLineOptions :指定要与所指定命令一起使用的任何命令行选项。 循环命令只要条件符合,它将多次执行同一命令,同时for的循环里面还可以套用for再进行循环。
举例:
for %%c in (*.bat*.txt)
do type %%c
含义:如果以.bat或.txt结尾的文件,则显示文件的内容。
三.符号的使用
1、@
一般在它之后紧跟一条命令或一条语句,则此命令或语句本身在执行的时候不会显示在屏幕上。
请把下面的代码保存为test.cmd文件,然后运行,比较一下两条echo语句在屏幕上的输出差异:
echo a
@pause
@echo b
@pause
执行结果如下:
C:\Documents and Settings\JM\桌面>echo a
a
请按任意键继续…
请按任意键继续…
2、%、%%
百分号用在不同的场合,有不同的含义:
① 当百分号成对出现,并且其间包含非特殊字符时,一般做变量引用处理,比如:%var%、%str%。
把以下代码保存为批处理文件,运行后观察屏幕显示结果:
@echo off
set str=abc
echo 变量 str 的值是: %str%
pause
在屏幕上将显示这样的结果:
变量 str 的值是: abc
按任意键继续…
另外,百分号作为变量引用还有一种特殊形式,那就是对形式参数的引用,此时,单个百分号后面紧跟0~9这10个数字,如%0、%1,其中,%0为脚本本身的名称,%1至%9为第二至九个参数…最多支持%0~%9,%10以后就是变量引用了,即%15为%1的值接上5。
请看演示代码:
@echo off
if defined str goto next
set str=
set /p str=请把文件拉到本窗口后回车:
call “%~0” %str%
pause
exit
:next
cls
echo 本批处理文件完整路径为:”%~0″
echo 拖到本窗口的文件完整路径为:”%~1″
goto :eof
② 出现在 set /a 语句中时,表示两数相除取余数,也就是所谓的模运算,它在命令行窗口和批处理文件中的写法略有差异:
在命令行窗口中,只需要单个的%,在批处理文件中,需要连续两个百分号,写成%%。
例如:
在命令行窗口中,运行 set /a num=4%2 ,则结果将显示0,因为4除以2的余数为0;
如果保存为批处理文件,则此语句将略有改变:
@echo off
set /a num=4%%2
echo 4除以2的余数为 %num%
pause
③ 转义符号:如果要显示%本身时,需要在前面用%来转义。
例如:
@echo off
echo 一个百分号:%%
echo 两个百分号:%%%%
echo 三个百分号:%%%%%%
pause
3、:、::
① 以:打头的单个的:表示该行是一个标签,它之后的内容是一个标签段,如:test,则表示:test之下的内容是标签段,而test是这个标签段的名,可以用 goto test 、goto :test 跳转到该标签段或用 call :test 调用该子过程;而连续两个冒号打头表示该行内容为注释内容,实际上,:: 是个无效的标签名,:加上空格同样可以起到注释的作用,此时,::的功能和注释命令rem相同;但是,rem 注释语句中的某些命令符号如重定向符号和管道符号还是会执行,而如果用::来注释的时候,与::同处一行的所有命令或符号直接被命令解释器忽略掉,无形中提高了注释的兼容性和整个程序的执行效率,并且在众多的命令语句中更显得醒目,所以,注释语句推荐使用::的格式。
② 在 set 语句中:和~同时使用时,: 起到截取字符串的功能。假设 set str=abcde,那么,set var=%str:~0,1% 表示截取字符串abcde的第一个字符;和=同时使用时,起到替换字符串的功能。假设:set str=abc:de,那么,set var=%str:a=1% 则表示把字符串abc:de中的a替换为1,set var=%str::=2% 则表示把字符串abc:de中的:替换为2;
4、~
① 用在 set 语句中,和:同时使用时,起到截取字符串的功能,请参考上一条的解释;
② 用在 set /a 语句中时,它是一元运算符号,表示将操作数字按位取反,例如,set /a num=~1的执行结果是-2,set /a num=~0的结果是-1
③ 用在for语句中,表示增强for的功能,能够提取到更多的信息。例如:在批处理文件的for语句中:%%~i表示去掉第一对外侧引号,%%~zi表示获取文件的大小(以字节为单位),%%~ni表示获取文件名,%%~xi表示获取扩展名(带点号)……它们可以组合使用,如%%~nxi表示获取文件名和后缀名。
5、>、>>
一般而言,>表示用新内容覆盖原文件内容,>>表示向原文件追加内容,此时,它们以重定向符号的身份出现;如果用在 set /a 语句中,则>表示分组,>>表示逻辑移位; 6、|
一般而言,它以管道符号的身份出现,表示把在它之前的命令或语句的执行结果作为在它之后的命令或语句的处理对象,简而言之,就是把它之前的输出作为它之后的输入,例如:echo abcd|findstr “b”,表示把echo abcd的执行结果,作为findstr “b” 的执行对象,也就是在字符串abcd中查找b字符;如果test.txt中有abcd字符串,则该语句与 findstr “b” test.txt 具有同样的效果;
7、^
一般而言,^以转义字符的身份出现。因为在 cmd环境中,有些字符具备特殊功能,如>、>>表示重定向,|表示管道,&、&&、||表示语句连接……它们都有特定的功能,如果需要把它们作为字符输出的话,echo >、echo | ……之类的写法就会出错——cmd解释器会把它们作为具有特殊功能的字符对待,而不会作为普通字符处理,这个时候,就需要对这些特殊字符做转义处理:在每个特殊字符前加上转义字符^,因此,要输出这些特殊字符,就需要用 echo ^>、echo ^|、echo ^|^|、echo ^^……之类的格式来处理; 8、&
一般而言,&表示两条命令或语句同时执行的意思。如 echo a&echo b,将在屏幕上同时显示a和b字符。当几条语句含义近似或作用相同且没有先后的顺序之别时,启用&符号连接这些语句将会增加程序的可读性;
9、&&、||
这是一对含义截然相反的命令符,&&表示如果它之前的语句成功执行,将执行它之后的语句,而||则表示如果它之前的语句执行失败,将执行它之后的语句;在某些场合,它们能替代 if……else…… 语句;
例如:
@echo off
md test&&echo 成功创建文件夹test||echo 创建文件夹test失败
pause
效果等同于如下代码:
@echo off
md test
if “%errorlevel%”==”0” (echo 成功创建文件夹test) else echo 创建文件夹test失败
pause
10、()
小括号对经常出现在for语句和if语句中,还有一些特定场合;在for和if语句中属于语句格式的要求,例如:
① for %%i in (语句1) do (语句2):在这条语句中,语句1必须用括号对包围,而语句2的括号对则可视情况予以抛弃或保留:如果语句2是单条语句或用&、& &、||等连接符号连接的多条语句,括号对可以抛弃,如果语句2是有逻辑先后关系的多条语句集合,则必须保留括号对,并且,多条语句必须断行书写;例如:
@echo off
for %%i in (a b c) do echo %%i&echo ——–
pause
也可以改写为:
@echo off
for %%i in (a b c) do (
echo %%i
&echo ——–
)
pause
② if 条件 (语句1) else (语句2):如果没有else部分,则语句1的括号对可有可无;如果有else部分,则语句1中的括号对必须保留,此时,语句2中的括号对保留与否,和上一点类似。例如:
@echo off
if exist test.txt echo 当前目录下有test.txt
pause
@echo off
if exist test.txt (echo 当前目录下有test.txt) else echo 当前目录下没有test.txt
pause
@echo off
if exist test.txt (echo 当前目录下有test.txt) else (
echo 当前目录下没有test.txt
pause
cls
echo 即将创建test.txt文件
cd.>test.txt&&echo 成功创建test.txt
)
pause
③ 特定场合下使用括号对,不但可以使代码逻辑清晰,增强可读性,还可能会减少代码量。比如用echo语句构造多行文本内容的时候:
@echo off
(
echo 第一行
echo 第二行
echo 第三行
)>test.txt
start test.txt
如果不使用括号对的话,则需要使用如下代码:
@echo off
echo 第一行>test.txt
echo 第二行>>test.txt
echo 第三行>>test.txt
start test.txt
11、+、-、*、/
在 set /a 语句中,这些符号的含义分别为:加、减、乘、除。例如:set /a num=1+2-3*4/5。需要注意的是,这些运算符号遵循数学运算中的优先级顺序:先乘除后加减,有括号的先算括号,并且,直接忽略小数点,因此,刚才那个算式的结果是1而不是0或0.6。
另外,有可能会在代码中看到这样的写法:set /a num+=1、set /a num-=1、set /a num*=1 和 set /a num/=1,这些表示累加、累减、累乘、累除,步长都是1,展开后的完整写法为:set /a num=num+1、set /a num=num-1、set /a num=num*1 和 set /a num=num/1(set /a 语句中,变量引用可以忽略百分号对或感叹号对,set /a num=%num%+1 与 set /a num=num+1 等同)
12、equ、neq、lss、leq、gtr、geq 这几个命令符是if语句中常用到的数值比较符号,取自英文的关键字母,具体的含义为:
命令符号 含义 英文解释
EQU 等于 equal
NEQ 不等于 not equal
LSS 少于 less than
LEQ 少于或等于 less than or equal
GTR 大于 greater than
GEQ 大于或等于 greater than or equal
四.常用示例
1.获取用户输入后赋值:
set /p 参数=请输入值:
echo %参数%
2.获取当前目录名:
a:
for %%i in (“%cd%”) do set aa=%%~ni
echo %aa%
b:
call :CurDIR “%cd%”
pause
goto :eof
:CurDIR
echo %~nx1
3.路径相关:
%~d0 当前盘符
%~dp0 当前盘符和路径
%~f0 当前批处理全路径
%~sdp0 当前盘符和路径短文件名格式
%cd% 当前CMD所在目录
4.for参数:
%~fI -将%I扩充到一个完全合格的路径名
%~dI -仅将%I扩充到一个驱动器号
%~pI -仅将%I扩充到一个路径
%~nI -仅将%I扩充到一个文件名
%~xI -仅将%I扩充到一个文件延伸名
%~sI -扩充的路径只含有短名
%~aI -将%I扩充到文件的文件内容
%~tI -将%I扩充到文件的日期/时间
%~zI -将%I扩充到文件的大小
%~$PATH:I -查找列在路径环境变数的目录,并将%I扩充
%~dpI -仅将%I扩充到一个驱动器号和路径
%~nxI -仅将%I扩充到一个文件名和延伸名
%~fsI -仅将%I扩充到一个带有短名的完整路径名
%~dp$PATH:i -查找列在路径环境变数的目录,并将%I扩充
%~ftzaI -将%I扩充到类似输出线路的DIR