2023年11月26日发(作者:)

CMD基础教程

BAT批处理基础教程

DOS批处理⾼级教程精选合编--教程⽬录

第⼀章批处理基础

第⼀节常⽤批处理内部命令简介

1REM ::

2ECHO @

3PAUSE

4ERRORLEVEL

5TITLE

6COLOR

7mode 配置系统设备

8GOTO :

9FIND

10START

11assoc ftype

12pushd popd

13CALL

14shift

15IF

16setlocal 与变量延迟

第⼆节常⽤特殊符号

1@ 命令⾏回显屏蔽符

2% 批处理变量引导符

3> 重定向符

4>> 重定向符

5<>&<& 重定向符

6| 命令管道符

7^ 转义字符

8& 组合命令

9&& 组合命令

10|| 组合命令

11"" 字符串界定符

12, 逗号

13; 分号

14() 括号

15! 感叹号

第⼆章FOR命令详解

⼀、参数/d

⼆、参数/R

三、参数/L

四、参数/F

第三章FOR命令中的变量

⼀、~I - 删除任何引号("),扩展%I

⼆、%~fI - %I 扩展到⼀个完全合格的路径名

三、%~dI - 仅将%I 扩展到⼀个驱动器号

四、%~pI - 仅将%I 扩展到⼀个路径

五、%~nI - 仅将%I 扩展到⼀个⽂件名

六、%~xI - 仅将%I 扩展到⼀个⽂件扩展名

七、%~sI - 扩展的路径只含有短名

⼋、%~aI - %I 扩展到⽂件的⽂件属性

九、%~tI - %I 扩展到⽂件的⽇期/时间

⼗、%~zI - %I 扩展到⽂件的⼤⼩

⼗⼀、%~$PATH:I

第四章批处理中的变量

⼀、系统变量

⼆、⾃定义变量

第五章set命令详解

⼀、⽤set命令设置⾃定义变量

⼆、⽤set命令进⾏简单计算

三、⽤set命令进⾏字符串处理

1、字符串替换

2、字符串截取

第六章if命令讲解

第⼀种⽤法:IF [NOT] ERRORLEVEL number command

第⼆种⽤法:IF [NOT] string1==string2 command

第三种⽤法:IF [NOT] EXIST filename command

⼆、if…else…条件语句

三、循环语句

四、⼦程序

五、⽤ftp命令实现⾃动下载

六、⽤7-ZIP实现命令⾏压缩和解压功能

七、调⽤VBScript程序

⼋、将批处理转化为可执⾏⽂件

九、时间延迟

⼗、模拟进度条

第⼀章批处理基础

第⼀节常⽤批处理内部命令简介

批处理定义:顾名思义,批处理⽂件是将⼀系列命令按⼀定的顺序集合为⼀个可执⾏的⽂本⽂件,其扩展名为BA T或者

CMD。这些命令统称批处理命令。/doc/

⼩知识:可以在键盘上按下Ctrl+C组合键来强⾏终⽌⼀个批处理的执⾏过程。

了解了⼤概意思后,我们正式开始学习.先看⼀个简单的例⼦!

@echo off

echo "欢迎来到⾮常BA T!"

pause

把上⾯的3条命令保存为⽂件或者然后执⾏,

他就会在屏幕上显⽰以下⼆⾏话:

欢迎来到⾮常BAT!

请按任意键继续. . .

这就是⼀个简单批处理⽂件了,这个批处理⽂件⼀共就⽤了2条命令"echo" "pause" 还有⼀个特殊符号"@"

从上⾯这个简单的批处理中,我们可以发现其实批处理就是运⽤⼀些含有特殊意义的符号和⼀些完成指定功能的命令组合⽽成,

那么在批处理中有多少这样的特殊符号和功能命令呢?我们现在就来仔细了解⼀下⼀些最常⽤的!

(以下内容来源⽹络,请各位仔细阅读,好进⼊下节的实例说明)

======================================================

批处理的常见命令(未列举的命令还⽐较多,请查阅帮助信息)

1REM ::

2ECHO @

3PAUSE

4ERRORLEVEL

5TITLE

6COLOR

7mode 配置系统设备

8GOTO :

9FIND

10START

11assoc ftype

12pushd popd

13CALL

14shift

15IF

16setlocal 与变量延迟

介绍命令

1REM ::

REM为注释命令,⼀般⽤来给程序加上注解,该命令后的内容不被执⾏,但能回显。

其次, :: 也可以起到rem 的注释作⽤, ⽽且更简洁有效; 但有两点需要注意:

第⼀, 任何以冒号:开头的字符⾏, 在批处理中都被视作标号, ⽽直接忽略其后的所有内容。有效标号:冒号后紧跟⼀个以字母数

字开头的字符串,goto语句可以识别。

⽆效标号:冒号后紧跟⼀个⾮字母数字的⼀个特殊符号,goto⽆法识别的标号,可以起到注释作⽤,所以:: 常被⽤作注释符

号,其实:+ 也可起注释作⽤。

第⼆, rem 不同的是, ::后的字符⾏在执⾏时不会回显, ⽆论是否⽤echo on打开命令⾏回显状态, 因为命令解释器不认为他是⼀

个有效的命令⾏, 就此点来看, rem 在某些场合下将⽐:: 更为适⽤; 另外, rem 可以⽤于 ⽂件中。

2ECHO @

打开回显或关闭回显功能,或显⽰消息。如果没有任何参数,echo 命令将显⽰当前回显设

置。

@字符放在命令前将关闭该命令回显,⽆论此时echo是否为打开状态。

语法:

echo [{ on|off }] [message]

echo. #此⽤法将显⽰⼀空⾏,相当于回车,⾮常有⽤。

执⾏echo off将关闭回显,它后⾯的所有命令都不显⽰命令本⾝,只显⽰执⾏后的结果,除⾮执⾏echo on命令。

执⾏@echo off不但关闭以后命令的回显,连echo off命令本⾝也不显⽰了。

通常以@echo off作为批处理程序的⾸⾏。

⼀般⽤ECHO MESSAGE来显⽰⼀个特定的消息。

例:

@Echo off

Echo hello

Pause

运⾏显⽰:hello

3PAUSE

PAUSE,玩游戏的⼈都知道,暂停的意思

在这⾥就是停⽌系统命令的执⾏并显⽰下⾯的内容。

例:

PAUSE

运⾏显⽰:

请按任意键继续. . .

要显⽰其他提⽰语,可以这样⽤:

Echo 其他提⽰语& pause > nul

4errorlevel

程序返回码

echo %errorlevel%

每个命令运⾏结束,可以⽤这个命令⾏格式查看返回码

⽤于判断刚才的命令是否执⾏成功

默认值为0,⼀般命令执⾏出错会设errorlevel 1

5title

设置cmd窗⼝的标题

title 新标题#可以看到cmd窗⼝的标题栏变了

6COLOR

设置默认的控制台前景和背景颜⾊。

COLOR [attr]

attr 指定控制台输出的颜⾊属性

颜⾊属性由两个⼗六进制数字指定-- 第⼀个为背景,第⼆个则为前景。每个数字可以为以下任何值之⼀:

0 = ⿊⾊8 = 灰⾊

1 = 蓝⾊9 = 淡蓝⾊

2 = 绿⾊ A = 淡绿⾊

3 = 湖蓝⾊ B = 淡浅绿⾊

4 = 红⾊ C = 淡红⾊

5 = 紫⾊ D = 淡紫⾊

6 = 黄⾊ E = 淡黄⾊

7 = ⽩⾊ F = 亮⽩⾊

如果没有给定任何参数,该命令会将颜⾊还原到 启动时

的颜⾊。这个值来⾃当前控制台窗⼝、/T 开关或

DefaultColor 注册表值。

如果⽤相同的前景和背景颜⾊来执⾏COLOR 命令,COLOR 命令

会将ERRORLEVEL 设置为1

例如: "COLOR fc" 在亮⽩⾊上产⽣亮红⾊

7mode 配置系统设备

配置系统设备。

串⾏⼝:MODE COMm[:] [BAUD=b] [PARITY=p] [DATA=d] [STOP=s]

[to=on|off] [xon=on|off] [odsr=on|off]

[octs=on|off] [dtr=on|off|hs]

[rts=on|off|hs|tg] [idsr=on|off]

设备状态: MODE [device] [/STA TUS]

打印重定向:MODE LPTn[:]=COMm[:]

选定代码页:MODE CON[:] CP SELECT=yyy

代码页状态:MODE CON[:] CP [/STATUS]

显⽰模式:MODE CON[:] [COLS=c] [LINES=n]

击键率:MODE CON[:] [RA TE=r DELAY=d]

例:

mode con cols=113 lines=15 & color 9f

此命令设置DOS窗⼝⼤⼩:15⾏,113

8GOTO :

GOTO会点编程的朋友就会知道这是跳转的意思。

在批处理中允许以“:XXX”来构建⼀个标号,然后⽤GOTO XXX跳转到标号:XXX处,然后执⾏标号后的命令。

例:

if {%1}=={} goto noparms

if "%2"=="" goto noparms

标签的名字可以随便起,但是最好是有意义的字符串啦,前加个冒号⽤来表⽰这个字符串是标签,goto命令就是根据这个冒号

:)来寻找下⼀步跳到到那⾥。最好有⼀些说明这样你别⼈看起来才会理解你的意图啊。

例:

@echo off

FIND [/V] [/C] [/N] [/i] [/OFF[LINE]] "string" [[drive:][path]filename[ ...]] /V 显⽰所有未包含指定字符串的⾏。

/C 仅显⽰包含字符串的⾏数。

/N 显⽰⾏号。

/I 搜索字符串时忽略⼤⼩写。

/OFF[LINE] 不要跳过具有脱机属性集的⽂件。

"string" 指定要搜索的⽂字串,

[drive:][path]filename

指定要搜索的⽂件。

如果没有指定路径,FIND 将搜索键⼊的或者由另⼀命令产⽣的⽂字。Find常和type命令结合使⽤

Type [drive:][path]filename | find "string" [>tmpfile] #挑选包含string的⾏Type [drive:][path]filename | find /v "string" #剔除⽂件

中包含string的⾏Type [drive:][path]filename | find /c #显⽰⽂件⾏数

以上⽤法将去除find命令⾃带的提⽰语(⽂件名提⽰)

例:

@echo off

echo 111 >

echo 222 >>

find "111"

del

pause

运⾏显⽰如下:

----------

111

请按任意键继续. . .

例:

@echo off

echo 111 >

例:start explorer d:

调⽤图形界⾯打开D

11assoc ftype

⽂件关联

assoc 设置'⽂件扩展名'关联,关联到'⽂件类型'

ftype 设置'⽂件类型'关联,关联到'执⾏程序和参数'

当你双击⼀个.txt⽂件时,windows并不是根据.txt直接判断⽤ 打开

⽽是先判断.txt属于txtfile '⽂件类型'

再调⽤txtfile 关联的命令⾏txtfile=%SystemRoot% %1

可以在"⽂件夹选项""⽂件类型"⾥修改这2种关联

assoc #显⽰所有'⽂件扩展名'关联

assoc .txt #显⽰.txt代表的'⽂件类型',结果显⽰.txt=txtfile

assoc .doc #显⽰.doc代表的'⽂件类型',结果显⽰.doc=nt.8

assoc .exe #显⽰.exe代表的'⽂件类型',结果显⽰.exe=exefile

ftype #显⽰所有'⽂件类型'关联

ftype exefile #显⽰exefile类型关联的命令⾏,结果显⽰exefile="%1" %*

assoc .txt=nt.8

设置.txtword类型的⽂档,可以看到.txt⽂件的图标都变了

assoc .txt=txtfile

恢复.txt的正确关联

ftype exefile="%1" %*

恢复exefile 的正确关联

如果该关联已经被破坏,可以运⾏/doc/ ,再输⼊这条命令

12pushd popd

切换当前⽬录

@echo off

c: & cd & md mp3 #C: 建⽴mp3 ⽂件夹

md d:mp4 #D: 建⽴mp4 ⽂件夹

cd /d d:mp4 #更改当前⽬录为d:mp4

pushd c:mp3 #保存当前⽬录,并切换当前⽬录为c:mp3

popd #恢复当前⽬录为刚才保存的d:mp4

⼀般⽤处不⼤,在当前⽬录名不确定时,会有点帮助。(dos编程中很有⽤)

13CALL

CALL命令可以在批处理执⾏过程中调⽤另⼀个批处理,当另⼀个批处理执⾏完后,再继续执⾏原来的批处理

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

调⽤的其它批处理程序。filename 参数必须具有.bat .cmd 扩展名。

CALL :label arguments

调⽤本⽂件内命令段,相当于⼦程序。被调⽤的命令段以标签:label开头

以命令goto :eof结尾。

另外,批脚本⽂本参数参照(%0%1、等等)已如下改变:

批脚本⾥的%* 指出所有的参数(%1 %2 %3 %4 %5 ...)

批参数(%n)的替代已被增强。您可以使⽤以下语法:(看不明⽩的直接运⾏后⾯的例⼦)%~1 - 删除引号("),扩充%1

%~f1 - %1 扩充到⼀个完全合格的路径名

%~d1 - 仅将%1 扩充到⼀个驱动器号

%~p1 - 仅将%1 扩充到⼀个路径

%~n1 - 仅将%1 扩充到⼀个⽂件名

%~x1 - 仅将%1 扩充到⼀个⽂件扩展名

%~s1 - 扩充的路径指含有短名

%~a1 - %1 扩充到⽂件属性

%~t1 - %1 扩充到⽂件的⽇期/时间

%~z1 - %1 扩充到⽂件的⼤⼩

%~$PATH : 1 - 查找列在PATH 环境变量的⽬录,并将%1

扩充到找到的第⼀个完全合格的名称。如果环境

变量名未被定义,或者没有找到⽂件,此组合键会

扩充到空字符串

可以组合修定符来取得多重结果:

%~dp1 - 只将%1 扩展到驱动器号和路径

%~nx1 - 只将%1 扩展到⽂件名和扩展名

%~dp$PATH:1 - 在列在PATH 环境变量中的⽬录⾥查找%1

并扩展到找到的第⼀个⽂件的驱动器号和路径。

%~ftza1 - %1 扩展到类似DIR 的输出⾏。

在上⾯的例⼦中,%1 PATH 可以被其他有效数值替换。

%~ 语法被⼀个有效参数号码终⽌。%~ 修定符不能跟%*使⽤

注意:参数扩充时不理会参数所代表的⽂件是否真实存在,均以当前⽬录进⾏扩展

要理解上⾯的知识,下⾯的例⼦很关键。

例:

@echo off

Echo 产⽣⼀个临时⽂件>

Rem 下⾏先保存当前⽬录,再将c:windows设为当前⽬录

pushd c:windows

Call :sub

Rem 下⾏恢复前次的当前⽬录

Popd

Call :sub

pause

Del

:sub

Echo 删除引号:%~1

Echo 扩充到路径:%~f1

Echo 扩充到⼀个驱动器号:%~d1

Echo 扩充到⼀个路径:%~p1

Echo 扩充到⼀个⽂件名:%~n1

Echo 扩充到⼀个⽂件扩展名:%~x1

Echo 扩充的路径指含有短名:%~s1

Echo 扩充到⽂件属性:%~a1

Echo 扩充到⽂件的⽇期/时间:%~t1

Echo 扩充到⽂件的⼤⼩:%~z1

Echo 扩展到驱动器号和路径:%~dp1

Echo 扩展到⽂件名和扩展名:%~nx1

Echo 扩展到类似DIR 的输出⾏:%~ftza1

Echo.

Goto :eof

14shift

更改批处理⽂件中可替换参数的位置。

SHIFT [/n]

如果命令扩展名被启⽤,SHIFT 命令⽀持/n 命令⾏开关;该命令⾏开关告诉

命令从第n 个参数开始移位;n 介于零和⼋之间。例如:

SHIFT /2

会将%3 移位到%2,将%4 移位到%3,等等;并且不影响%0 %1

15IF

IF 条件判断语句,语法格式如下:

IF [NOT] ERRORLEVEL number command

IF [NOT] string1==string2 command

IF [NOT] EXIST filename command

下⾯逐⼀介绍,更详细的分析请看后⾯章节。

(1) IF [NOT] ERRORLEVEL number command

IF ERRORLEVEL这个句⼦必须放在某⼀个命令的后⾯,执⾏命令后由IF ERRORLEVEL 来判断命令的返回值。

Number的数字取值范围0~255,判断时值的排列顺序应该由⼤到⼩。返回的值⼤于等于指定的值时,条件成⽴

例:

@echo off

dir c:

rem退出代码为>=1就跳⾄标题1处执⾏,>=0就跳⾄标题0处执⾏

IF ERRORLEVEL 1 goto 1

IF ERRORLEVEL 0 goto 0

Rem 上⾯的两⾏不可交换位置,否则失败了也显⽰成功。

:0

echo 命令执⾏成功!

Rem 程序执⾏完毕跳⾄标题exit处退出

goto exit

:1

echo 命令执⾏失败!

Rem 程序执⾏完毕跳⾄标题exit处退出

goto exit

:exit

pause

运⾏显⽰:命令执⾏成功!

(2) IF [NOT] string1==string2 command

string1string2都为字符的数据,英⽂内字符的⼤⼩写将看作不同,这个条件中的等于号必须是两个(绝对相等的意思)

条件相等后即执⾏后⾯的command

这个批处理⼤家可以放在C盘和D盘分别执⾏,看看效果

16setlocal 与变量延迟

本条内容引⽤[英雄出品]的批处理教程:

要想进阶,变量延迟是必过的⼀关!所以这⼀部分希望你能认真看。

为了更好的说明问题,我们先引⼊⼀个例⼦。

1:

@echo off

set a=4

set a=5 & echo %a%

pause

结果:4

解说:为什么是4⽽不是5呢?在echo之前明明已经把变量a的值改成5了?

让我们先了解⼀下批处理运⾏命令的机制:

批处理读取命令时是按⾏读取的(另外例如for命令等,其后⽤⼀对圆括号闭合的所有语句也当作⼀⾏),在

处理之前要完成必要的预处理⼯作,这其中就包括对该⾏命令中的变量赋值。我们现在分析⼀下例1,批处理

在运⾏到这句“set a=5 & echo %a%”之前,先把这⼀句整句读取并做了预处理——对变量a赋了值,那么%a%当然就是4了!

(没有为什么,批处理就是这样做的。)

⽽为了能够感知环境变量的动态变化,批处理设计了变量延迟。简单来说,在读取了⼀条完整的语句之后,不

⽴即对该⾏的变量赋值,⽽会在某个单条语句执⾏之前再进⾏赋值,也就是说延迟了对变量的赋值。

那么如何开启变量延迟呢?变量延迟⼜需要注意什么呢?举个例⼦说明⼀下:

2:

@echo off

setlocal enabledelayedexpansion

set a=4

set a=5 & echo !a!

pause

结果:5

解说:启动了变量延迟,得到了正确答案。变量延迟的启动语句是“setlocal enabledelayedexpansion”,并且变量要⽤⼀对叹

“!!”括起来(注意要⽤英⽂的叹号),否则就没有变量延迟的效果。

分析⼀下例2,⾸先“setlocal enabledelayedexpansion”开启变量延迟,然后“set a=4”先给变量a赋值为

4“set a=5 & echo !a!”这句是给变量a赋值为5并输出(由于启动了变量延迟,所以批处理能够感知到动态变化,即不是先给

该⾏变量赋值,⽽是在运⾏过程中给变量赋值,因此此时a的值就是5了)。

再举⼀个例⼦巩固⼀下。

3:

@echo off

setlocal enabledelayedexpansion

for /l %%i in (1,1,5) do (

set a=%%i

echo !a!

)

pause

结果:

1

2

3

4

5

解说:本例开启了变量延迟并⽤“!!”将变量扩起来,因此得到我们预期的结果。如果不⽤变量延迟会出现什

么结果呢?结果是这样的:

ECHO 处于关闭状态。

ECHO 处于关闭状态。

ECHO 处于关闭状态。

ECHO 处于关闭状态。

ECHO 处于关闭状态。

即没有感知到for语句中的动态变化。

第⼆节常⽤特殊符号

1@ 命令⾏回显屏蔽符

2% 批处理变量引导符

3> 重定向符

4>> 重定向符

5<>&<& 重定向符

6| 命令管道符

7^ 转义字符

CR(0D) 命令⾏结束符

Escape(1B) ANSI转义字符引导符

Space(20) 常⽤的参数界定符

Tab(09) ; = 不常⽤的参数界定符

+ COPY命令⽂件连接符

* ? ⽂件通配符

/ 参数开关引导符

: 批处理标签引导符

废话少说,开讲了

1@ 命令⾏回显屏蔽符

这个字符在批处理中的意思是关闭当前⾏的回显。我们从前⼏课知道

ECHO OFF可以关闭掉整个批处理命令的回显,但不能关掉ECHO OFF这个命令,现在我们在ECHO OFF这个命令前加个

@,就可以达到所有命令均不回显的要求

2% 批处理变量引导符

这个百分号严格来说是算不上命令的,它只是批处理中的参数⽽已(多个%⼀起使⽤的情况除外,以后还将详细介绍)。

引⽤变量⽤%var%,调⽤程序外部参数⽤%1%9等等

%0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %*为命令⾏传递给批处理的参数

%0 批处理⽂件本⾝,包括完整的路径和扩展名

%1 第⼀个参数

%9 第九个参数

%* 从第⼀个参数开始的所有参数

参数%0具有特殊的功能,可以调⽤批处理⾃⾝,以达到批处理本⾝循环的⽬的,也可以复制⽂件⾃⾝等等。

例:最简单的复制⽂件⾃⾝的⽅法

copy %0 d:

3> 重定向符

输出重定向命令

这个字符的意思是传递并且覆盖,他所起的作⽤是将运⾏的结果传递到后⾯的范围(后边可以是⽂件,也可以是默认的系统控

制台)

NT系列命令⾏中,重定向的作⽤范围由整个命令⾏转变为单个命令语句,受到了命令分隔符&,&&,||和语句块的制约限制。

⽐如:

使⽤命令:echo hello >将建⽴⽂件,内容为”hello “(注意⾏尾有⼀空格)

使⽤命令:echo hello>将建⽴⽂件,内容为”hello“(注意⾏尾没有空格)

4>> 重定向符

输出重定向命令

这个符号的作⽤和>有点类似,但他们的区别是>>是传递并在⽂件的末尾追加,⽽>是覆盖⽤法同上

同样拿做例⼦

使⽤命令:

echo hello >

echo world >>

这时候 内容如下:

hello

world

5<>&<& 重定向符

这三个命令也是管道命令,但它们⼀般不常⽤,你只需要知道⼀下就ok了,当然如果想仔细研究的话,可以⾃⼰查⼀下资

料。(本⼈已查过,⽹上也查不到相关资料)

<,输⼊重定向命令,从⽂件中读⼊命令输⼊,⽽不是从键盘中读⼊。

@echo off

echo 2005-05-01>

date

del

这样就可以不等待输⼊直接修改当前⽇期

>&,将⼀个句柄的输出写⼊到另⼀个句柄的输⼊中。

<&,刚好和>&相反,从⼀个句柄读取输⼊并将其写⼊到另⼀个句柄输出中。

常⽤句柄:012,未定义句柄:3—9

1>nul 表⽰禁⽌输出正确的信息

2>nul 表⽰禁⽌输出错误信息。

其中的12都是代表某个数据流输⼊输出的地址(NT CMD 称之为句柄,MSDOS称之为设备)。

句柄0:标准输⼊stdin,键盘输⼊

句柄1:标准输出stdout,输出到命令提⽰符窗⼝(console,代码为CON

句柄2:标准错误stderr,输出到命令提⽰符窗⼝(console,代码为CON

其中的stdin可被<重定向,stdout可被>>>重定向,⽽stderrDOS下不可直接重定向,只有通过ctty或其它命令将系统控制

权转交给其它设备的⽅式,来间接完成。

6| 命令管道符

格式:第⼀条命令| 第⼆条命令[| 第三条命令...]

将第⼀条命令的结果作为第⼆条命令的参数来使⽤,记得在unix中这种⽅式很常见。

例如:

dir c:|find "txt"

以上命令是:查找C所有,并发现TXT字符串。

FIND的功能请⽤FIND /? ⾃⾏查看

在不使format的⾃动格式化参数时,我是这样来⾃动格式化A盘的

echo y|format a: /s /q /v:system

⽤过format的都知道,再格盘时要输⼊y来确认是否格盘,这个命令前加上echo y并⽤|字符来将echo y的结果传给format命令

从⽽达到⾃动输⼊y的⽬的

(这条命令有危害性,测试时请慎重)

7^ 转义字符

^是对特殊符号<,>,&的前导字符,在命令中他将以上3个符号的特殊功能去掉,仅仅只把他们当成符号⽽不使⽤他们的特殊意

义。

⽐如

echo test ^>

结果则是:test >

他没有追加在⾥,呵呵。只是显⽰了出来

另外,此转义字符还可以⽤作续⾏符号。

举个简单的例⼦:

@echo off

echo 英雄^

^

^

男⼈

pause

不⽤多说,⾃⼰试⼀下就明⽩了。

8& 组合命令

语法:第⼀条命令& 第⼆条命令[& 第三条命令...]

&&&||为组合命令,顾名思义,就是可以把多个命令组合起来当⼀个命令来执⾏。这在批处理脚本⾥是允许的,⽽且⽤的

⾮常⼴泛。因为批处理认⾏不认命令数⽬。

这个符号允许在⼀⾏中使⽤2个以上不同的命令,当第⼀个命令执⾏失败了,也不影响后边的命令执⾏。

这⾥&两边的命令是顺序执⾏的,从前往后执⾏。

⽐如:

dir z: & dir y: & dir c:

以上命令会连续显⽰z,y,c盘的内容,不理会该盘是否存在

9&& 组合命令

语法:第⼀条命令&& 第⼆条命令[&& 第三条命令...]

⽤这种⽅法可以同时执⾏多条命令,当碰到执⾏出错的命令后将不执⾏后⾯的命令,如果⼀直没有出错则⼀直执⾏完所有命令

这个命令和上边的类似,但区别是,第⼀个命令失败时,后边的命令也不会执⾏

dir z: && dir y: && dir c:

10|| 组合命令

语法:第⼀条命令|| 第⼆条命令[|| 第三条命令...]

⽤这种⽅法可以同时执⾏多条命令,当⼀条命令失败后才执⾏第⼆条命令,当碰到执⾏正确的命令后将不执⾏后⾯的命令,如

果没有出现正确的命令则⼀直执⾏完所有命令;

提⽰:组合命令和重定向命令⼀起使⽤必须注意优先级

管道命令的优先级⾼于重定向命令,重定向命令的优先级⾼于组合命令

问题:把C盘和D盘的⽂件和⽂件夹列出到⽂件中。你将如何来搞定这道题?有朋友说,这还不是很easy的问题吗?同时

执⾏两个dir,然后把得到的结果>⾥就ok了嘛,看例:

dir c: && dir d: >

仔细研究⼀下这句执⾏后的结果,看看是否能达到题⽬的要求!错了!这样执⾏后⾥只有D盘的信息!为什么?就因为这

&&命令和>命令不能同时出现⼀个句⼦⾥(批处理把⼀⾏看成⼀个句⼦)!!组合命令&&的优先级没有管道命令>的优先级

⾼(⾃⼰总结的,不妥的地⽅请指正)!所以这句在执⾏时将本⾏分成这两部分:dir c:dir d: > ,⽽并不是如你想的这

两部分:dir c: && dir d:> 。要使⽤组合命令&&达到题⽬的要求,必须得这么写:

dir c: > && dir d: >>

这样,依据优先级⾼低,DOS将把这句话分成以下两部分:dir c: > dir d: >> 。例⼗⼋中的⼏句的差别⽐较特殊,

值得好好研究体会⼀下。

当然这⾥还可以利⽤&命令(⾃⼰想⼀下道理哦):

dir c: > & dir d: >>

11"" 字符串界定符

双引号允许在字符串中包含空格,进⼊⼀个特殊⽬录可以⽤如下⽅法

cd "program files"

cd progra~1

cd pro*

以上三种⽅法都可以进⼊program files这个⽬录

12, 逗号

逗号相当于空格,在某些情况下“,”可以⽤来当做空格使

⽐如

dir,c:

13; 分号

分号,当命令相同时,可以将不同⽬标⽤;来隔离,但执⾏效果不变,如执⾏过程中发⽣错误,则只返回错误报告,但程序仍

会执⾏。(有⼈说不会继续执⾏,其实测试⼀下就知道了)⽐如:

dir c:;d:;e:;z:

以上命令相当于

dir c:

dir d:

dir e:

dir f:

如果其中z盘不存在,运⾏显⽰:系统找不到指定的路径。然后终⽌命令的执⾏。

例:dir c:;d:;e:

以上命令相当于

dir c:

dir d:

dir e:

其中⽂件e:不存在,但e盘存在,有错误提⽰,但命令仍会执⾏。

为什么?如果⽬标路径不存在,则终⽌执⾏;如果路径存在,⽂件不存在,则继续执⾏。就说这些了!各位有什么意见请回贴!

有什么疑问请到BAT交流区发贴!下⼀节改进!

14() 括号

⼩括号在批处理编程中有特殊的作⽤,左右括号必须成对使⽤,括号中可以包括多⾏命令,这些命令将被看成⼀个整体,视为

⼀条命令⾏。

括号在for语句和if语句中常见,⽤来嵌套使⽤循环或条件语句,其实括号()也可以单独使⽤,请看例⼦。

例:

命令:echo 1 & echo 2 & echo 3

可以写成:

(

echo 1

echo 2

echo 3

)

上⾯两种写法效果⼀样,这两种写法都被视为是⼀条命令⾏。

注意:这种多条命令被视为⼀条命令⾏时,如果其中有变量,就涉及到变量延迟的问题。15! 感叹号

没啥说的,在变量延迟问题中,⽤来表⽰变量,即%var%应该表⽰为!var!,请看前⾯的setlocal 命令介绍。

累了,换换思维,有兴趣的可以学⼀段古⽂化:《三字经》第⼀节,可谓⼈⼈皆知。

【原⽂】

(rén) (zhī) (chū),性(xìng) (běn) (shàn)

(xìng) (xiāng) (jìn),习(xí) (xiāng) (yuǎn)

(gǒu) (bú) (jiào),性(xìng) (nǎi) (qiān)

(jiào) (zhī) (dào),贵(guì) (yǐ) (zhuān)

【字词义解释】

(1) 之:的。

(2) 初:初⽣;刚开始的时候。

(3) 性:本性;天性。

(4) 本:本来。

(5) 善:善良、好的。

(6) 相:相当。

(7) 近:接近。

(8) 习:学习、后天的习惯。

(9) 远:差别⼤。

(10) 苟:如果。

(11) 教:教导。

(12) 乃:就会。

(13) 迁:改变。

(14) 道:⽅法。

(15) 贵:注重。

(16) 专:专⼼。

【译⽂参考】

⼈刚⽣下来的时候,本性中有善的⼀⾯。这时候善良的本性,⼤致都很相近,没有多⼤的差别。等到长⼤以后,因各⼈的环境

不同,所学习的也不同;在好的环境⼈就会变好,在不好的环境⼈就容易学坏,于是性情开始有了差别。假如在这个时候,不

给他适当的教导,学了种种不良的习惯,他原本善良的本性,就会渐渐变坏;⽽教导的⽅法,最重要的就是必须专⼼⼀致,不

可边做边停,才能使他有完整的学习。

DOS批处理⾼级教程精选合编|第⼆章FOR命令详解

看了看第⼀节的东西,发现那些简单的命令都有详细解释,实在想不出什么更好的东西来解释他们,就直接来⼀个"FOR命令详

"在其中运⽤这些东西来解释吧!

FOR之前呢,咋先告诉各位新⼿朋友,如果你有什么命令不懂,直接在CMD下⾯输⼊: name /? 这样的格式来看系统给出的帮助

⽂件,⽐如for /? 就会把FOR命令的帮助全部显⽰出来!当然许多菜鸟同志都看不懂....所以才会有那么多批处理⽂章俺也照顾

菜鸟,FOR 命令⽤我⾃⼰的⽅式说明下!

正式开始:

FOR这条命令基本上都被⽤来处理⽂本,我们这次除了要说他处理⽂本的作⽤外还要讲他的其他⼀些好⽤的功能!

看看他的基本格式(这⾥我引⽤的是批处理中的格式,直接在命令⾏只需要⼀个%)

FOR 参数%%变量名IN (相关⽂件或命令) DO 执⾏的命令

参数:FOR4个参数/d /l /r /f 他们的作⽤我在下⾯⽤例⼦解释

%%变量名:这个变量名可以是单个的⼩写a-z或者⼤写A-Z,他们区分⼤⼩写哦~, FOR会把每个读取到的值给他!

IN:命令的格式,照写就是了!

(相关⽂件或命令) :FOR要把什么东西读取然后赋值给变量,不懂的话看下⾯的例⼦

do:命令的格式,照写就是了!

执⾏的命令:对每个变量的值要执⾏什么操作就写在这.

看不懂我的这些说明,可以在CMD输⼊for /?看系统提供的帮助!我这⾥也给出来吧,⼤家对照

FOR %%variable IN (set) DO command [command-parameters]

%%variable 指定⼀个单⼀字母可替换的参数。

(set) 指定⼀个或⼀组⽂件。可以使⽤通配符。

command 指定对每个⽂件执⾏的命令。

command-parameters

为特定命令指定参数或命令⾏开关。

现在开始讲每个参数的意思/doc/

⼀、参数/d

FOR /D %variable IN (set) DO command [command-parameters]

如果集中包含通配符,则指定与⽬录名匹配,⽽不与⽂件

名匹配。

如果Set (也就是我上⾯写的"相关⽂件或命令") 包含通配符(* ?),将对与Set 相匹配的每个⽬录(⽽不是指定⽬录中的⽂

件组)执⾏指定的Command

这个参数主要⽤于⽬录搜索,不会搜索⽂件,看这样的例⼦

@echo off

for /d %%i in (c:*) do echo %%i

pause

运⾏会把C盘根⽬录下的全部⽬录名字打印出来,⽽⽂件名字⼀个也不显⽰!

在来⼀个,⽐如我们要把当前路径下⽂件夹的名字只有1-3个字母的打出来

@echo off

for /d %%i in () do echo %%i

pause

这样的话如果你当前⽬录下有⽬录名字只有1-3个字母的,就会显⽰出来,没有就不显⽰了

这⾥解释下*号和?号的作⽤,*号表⽰任意N个字符,?号只表⽰任意⼀个字符

知道作⽤了,给⼤家个思考题⽬!

@echo off

for /d %%i in (window?) do echo %%i

pause

保存到C盘下执⾏,会显⽰什么呢?⾃⼰看吧! 显⽰:windows

/D参数只能显⽰当前⽬录下的⽬录名字,这个⼤家要注意!

⼆、参数/R

FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]

检查以[drive:]path 为根的⽬录树,指向每个⽬录中的

FOR 语句。如果在/R 后没有指定⽬录,则使⽤当前

⽬录。如果集仅为⼀个单点(.)字符,则枚举该⽬录树。

递归

上⾯我们知道,/D只能显⽰当前路径下的⽬录名字,那么现在这个/R也是和⽬录有关,他能⼲

嘛呢?放⼼他⽐/D强⼤多了!

他可以把当前或者你指定路径下的⽂件名字全部读取,注意是⽂件名字,有什么⽤看例⼦!

请注意2点:

1set中的⽂件名如果含有通配符(?或*),则列举/R参数指定的⽬录及其下⾯的所⽤⼦⽬录中与set相符合的所有⽂件,⽆相

符⽂件的⽬录则不列举。

2、相反,如果set中为具体⽂件名,不含通配符,则枚举该⽬录树(即列举该⽬录及其下⾯的所有⼦⽬录),⽽不管set中的

指定⽂件是否存在。这与前⾯所说的单点(.)枚举⽬录树是⼀个道理,单点代表当前⽬录,也可视为⼀个⽂件。

例:

@echo off

for /r c: %%i in (*.exe) do echo %%i

pause

咱们把这个BAT保存到D盘随便哪⾥然后执⾏,我会就会看到,他把C盘根⽬录,和每个⽬录的⼦⽬录下⾯全部的EXE⽂件都列出

来了

例:

@echo off

for /r %%i in (*.exe) do @echo %%i

pause

参数不⼀样了吧!这个命令前⾯没加那个C:也就是搜索路径,这样他就会以当前⽬录为搜索路径,⽐如你这个BA T你把他放在

d:test⽬录下执⾏,那么他就会把D:test⽬录和他下⾯的⼦⽬录的全部EXE⽂件列出来

例:

@echo off

for /r c: %%i in () do echo %%i

pause

运⾏本例发现枚举了c盘所有⽬录,为了只列举存在的⽬录,可改成下⾯这样:

@echo off

for /r c: %%i in () do if exist %%i echo %%i

pause

⽤这条命令搜索⽂件真不错。。。。。。

这个参数⼤家应该理解了吧!还是满好玩的命令!

三、参数/L

FOR /L %variable IN (start,step,end) DO command [command-parameters]

该集表⽰以增量形式从开始到结束的⼀个数字序列。

因此,(1,1,5) 将产⽣序列1 2 3 4 5(5,-1,1) 将产⽣

序列(5 4 3 2 1)

使⽤迭代变量设置起始值(Start#),然后逐步执⾏⼀组范围的值,直到该值超过所设置的终⽌值(End#)/L 将通过对Start#

End# 进⾏⽐较来执⾏迭代变量。如果Start# ⼩于End#,就会执⾏该命令。如果迭代变量超过End#,则命令解释程序退出此

循环。还可以使⽤负的Step# 以递减数值的⽅式逐步执⾏此范围内的值。例如,(1,1,5) ⽣成序列 1 2 3 4 5,⽽(5,-1,1) 则⽣成

序列(5 4 3 2 1)。语法是:

看着这说明有点晕吧!咱们看例⼦就不晕了!

@echo off