DOS基础知识

更新时间:2024-05-23 08:39:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

DOS批处理高级教程精选合编

第一节 常用批处理内部命令简介

批处理定义:顾名思义,批处理文件是将一系列命令按一定的顺序集合为一个可执行的文本文件,其扩展名为BAT或者CMD。这些命令统称批处理命令。

了解了大概意思后,我们正式开始学习.先看一个简单的例子 @echo off

echo \欢迎来到非常BAT!\pause

把上面的3条命令保存为文件test.bat或者test.cmd然后执行, 他就会在屏幕上显示以下二行话:

欢迎来到非常BAT! 请按任意键继续.

这就是一个简单批处理文件了,这个批处理文件一共就用了2条命令 \和\还有一个特殊符号\

从上面这个简单的批处理中,我们可以发现其实批处理就是运用一些含有特殊意义的符号和一些完成指定功能的命令组合而成,那么在批处理中有多少这样的特殊符号和功能命令呢?我们现在就来仔细了解一下

1、REM 和 ::

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

其次, :: 也可以起到rem 的注释作用, 而且更简洁有效; 但有两点需要注意: 第一, 任何以冒号:开头的字符行, 在批处理中都被视作标号, 而直接忽略其后的所有内容。

有效标号:冒号后紧跟一个以字母数字开头的字符串,goto语句可以识别。 无效标号:冒号后紧跟一个非字母数字的一个特殊符号,goto无法识别的标号,可以起到注释作用,所以 :: 常被用作注释符号,其实 :+ 也可起注释作用。

第二, 与rem 不同的是, ::后的字符行在执行时不会回显, 无论是否用echo on打开命令行回显状态, 因为命令解释器不认为他是一个有效的命令行, 就此点来看,

rem 在某些场合下将比 :: 更为适用; 另外, rem 可以用于 config.sys 文件中。行内注释格式:%注释内容% (不常用,慎用)

2、ECHO 和 @

@字符放在命令前将关闭该命令回显,无论此时echo是否为打开状态。 echo命令的作用列举如下:

(1)打开回显或关闭回显功能

格式:echo [{ on|off }]

如果想关闭“ECHO OFF”命令行自身的显示,则需要在该命令行前加上“@”。

(2)显示当前ECHO设置状态

格式:echo

(3)输出提示信息

格式:ECHO 信息内容

上述是ECHO命令常见的三种用法,也是大家熟悉和会用的,但作为DOS命令淘金者你还应该知道下面的技巧:

(4)关闭DOS命令提示符

在DOS提示符状态下键入ECHO OFF,能够关闭DOS提示符的显示,使屏幕只留下光标,直至键入ECHO ON,提示符才会重新出现。

(5)输出空行,即相当于输入一个回车

格式:ECHO.

值得注意的是命令行中的“.”要紧跟在ECHO后面中间不能有空格,否则“.”将被当作提示信息输出到屏幕。另外“.”可以用,:;”/[\\]+等任一符号替代。

命令ECHO.输出的回车,经DOS管道转向可以作为其它命令的输入,比如echo.|time即相当于在TIME命令执行后给出一个回车。所以执行时系统会在显示当前时间后,自动返回到DOS提示符状态

(6)答复命令中的提问

格式:ECHO 答复语|命令文件名

上述格式可以用于简化一些需要人机对话的命令(如:CHKDSK/F;FORMAT Drive:;del *.*)的操作,

它是通过DOS管道命令把ECHO命令输出的预置答复语作为人机对话命令

的输入。下面的例子就相当于在调用的命令出现人机对话时输入“Y”回车:

C:>ECHO Y|CHKDSK/F C:>ECHO Y|DEL A :*.*

(7)建立新文件或增加文件内容

格式:ECHO 文件内容>文件名 ECHO 文件内容>>文件名

例如:

C:>ECHO @ECHO OFF>AUTOEXEC.BAT建立自动批处理文件

C:>ECHO C:\\CPAV\\BOOTSAFE>>AUTOEXEC.BAT向自动批处理文件中追加内容C:>TYPE AUTOEXEC.BAT显示该自动批处理文件

@ECHO OFF C:\\CPAV\\BOOTSAFE

(8)向打印机输出打印内容或打印控制码

格式:ECHO 打印机控制码>PRN ECHO 打印内容>PRN

下面的例子是向M-1724打印机输入打印控制码。<Alt>156是按住Alt键在小键盘键入156,类似情况依

此类推:

C:>ECHO +156+42+116>PRN(输入下划线命令FS*t) C:>ECHO +155@>PRN(输入初始化命令ESC@) C:>ECHO.>PRN(换行)

(9)使喇叭鸣响

C:>ECHO ^G

“^G”是在dos窗口中用Ctrl+G或Alt+007输入,输入多个^G可以产生多声鸣响。使用方法是直接将其加入批处理文件中或做成批处理文件调用。这里的“^G”属于特殊符号的使用,请看本文后面的章节

3、PAUSE

PAUSE,玩游戏的人都知道,暂停的意思在这里就是停止系统命令的执行并显示下面的内容。例:

PAUSE 运行显示: 请按任意键继续. . .

要显示其他提示语,可以这样用: Echo 其他提示语 & pause > nul

4、title

设置cmd窗口的标题 title 新标题

8、GOTO 和 :

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

if {%1}=={} goto noparms if \

标签的名字可以随便起,但是最好是有意义的字符串啦,前加个冒号用来表示这个字符串是标签,goto命令就是根据这个冒号(:)来寻找下一步跳到到那里。最好有一些说明这样你别人看起来才会理解你的意图啊。 例: @echo off :start set /a var+=1 echo %var%

if %var% leq 3 GOTO start pause 运行显示: 1 2 3 4

9、find在文件中搜索字符串。

FIND [/V] [/C] [/N] [/I] [/OFF[LINE]] \[[drive:][path]filename[ ...]]

/V显示所有未包含指定字符串的行。 /C仅显示包含字符串的行数。 /N显示行号。

/I搜索字符串时忽略大小写。

/OFF[LINE] 不要跳过具有脱机属性集的文件。 \指定要搜索的文字串,

[drive:][path]filename指定要搜索的文件。

如果没有指定路径,FIND 将搜索键入的或者由另一命令产生的文字。Find常和type命令结合使用

Type [drive:][path]filename | find \挑选包含string的行 Type [drive:][path]filename | find /v \#剔除文件中包含string的行 Type [drive:][path]filename | find /c #显示文件行数 以上用法将去除find命令自带的提示语(文件名提示)

例: @echo off

echo 111 >test.txt echo 222 >>test.txt find \del test.txt pause

运行显示如下:

---------- TEST.TXT 111

请按任意键继续. . .

例: @echo off

echo 111 >test.txt echo 222 >>test.txt type test.txt|find \ del test.txt pause

运行显示如下: 111

请按任意键继续. . .

13、CALL

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

CALL command

调用一条批处理命令,和直接执行命令效果一样,特殊情况下很有用,比如变量的多级嵌套,见教程后面。在批处理编程中,可以根据一定条件生成命令字符串,用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 产生一个临时文件 > tmp.txt

Rem 下行先保存当前目录,再将c:\\windows设为当前目录 pushd c:\\windows Call :sub tmp.txt

Rem 下行恢复前次的当前目录 Popd

Call :sub tmp.txt pause Del tmp.txt exit

: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

例: set aa=123456

set cmdstr=echo a% call %cmdstr% pause

本例中如果不用call,而直接运行%cmdstr%,将显示结果a%,而不是123456

14、shift 更改批处理文件中可替换参数的位置。

SHIFT [/n]

如果命令扩展名被启用,SHIFT 命令支持/n 命令行开关;该命令行开关告诉命令从第 n 个参数开始移位;n 介于零和八之间。例如:

SHIFT /2

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

15、IF

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 RRORLEVEL 来判断命令的返回值。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

string1和string2都为字符的数据,英文内字符的大小写将看作不同,这个条件中的等于号必须是两个

(绝对相等的意思)

条件相等后即执行后面的command

检测当前变量的值做出判断,为了防止字符串中含有空格,可用以下格式 if [NOT] {string1}=={string2} command if [NOT] [string1]==[string2] command if [NOT] \

这种写法实际上将括号或引号当成字符串的一部分了,只要等号左右两边一致就行了,比如下面的写法就不行:

if {string1}==[string2] command

(3) IF [NOT] EXIST filename command EXIST filename为文件或目录存在的意思

echo off

IF EXIST autoexec.bat echo 文件存在! IF not EXIST autoexec.bat echo 文件不存在!

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

第二节 常用特殊符号

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:\\wind.bat

小技巧:添加行内注释

%注释内容%(可以用作行内注释,不能出现重定向符号和管道符号)为什么这样呢?此时“注释内容”其实被当作变量,其值是空的,故只起注释作用,不过这种用法容易出现语法错误,一般不用。

3、> 重定向符

输出重定向命令

这个字符的意思是传递并且覆盖,他所起的作用是将运行的结果传递到后面的范围(后边可以是文件,也可以是默认的系统控制台)在NT系列命令行中,重定向的作用范围由整个命令行转变为单个命令语句,受到了命令分隔符&,&&,||和语句块的制约限制。比如:

使用命令:echo hello >1.txt将建立文件1.txt,内容为”hello “(注意行尾有一空格) 使用命令:echo hello>1.txt将建立文件1.txt,内容为”hello“(注意行尾没有空格)

4、>>重定向符

输出重定向命令

这个符号的作用和>有点类似,但他们的区别是>>是传递并在文件的末尾追加,而>是覆盖用法同上同样拿1.txt做例子

使用命令: echo hello > 1.txt echo world >>1.txt

这时候1.txt 内容如下: hello world

5、<、>&、<& 重定向符

这三个命令也是管道命令,但它们一般不常用,你只需要知道一下就ok了,当然如果想仔细研究的话,

可以自己查一下资料。(本人已查过,网上也查不到相关资料) <,输入重定向命令,从文件中读入命令输入,而不是从键盘中读入。 @echo off

echo 2005-05-01>temp.txt date

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

>&,将一个句柄的输出写入到另一个句柄的输入中。

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

常用句柄:0、1、2,未定义句柄:3—9 1>nul 表示禁止输出正确的信息 2>nul 表示禁止输出错误信息。

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

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

句柄1:标准输出stdout,输出到命令提示符窗口(console,代码为CON) 句柄2:标准错误stderr,输出到命令提示符窗口(console,代码为CON) 其中的stdin可被<重定向,stdout可被>、>>重定向。

我们已经知道读取文本中的内容可以用for命令,但如果只需要读取第一行用for命令就有点麻烦。简单

的办法如下: @echo off set /p str=<%0 echo %str% pause

运行显示批处理文件自身的第一行:@echo off

6、| 命令管道符

格式:第一条命令 | 第二条命令 [| 第三条命令...]

将第一条命令的结果作为第二条命令的参数来使用,记得在unix中这种方式很常见。

例如:

dir c:\\|find \

以上命令是:查找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 ^>1.txt 结果则是:test > 1.txt

他没有追加在1.txt里,呵呵。只是显示了出来,另外,此转义字符还可以用作续行符号。 举个简单的例子:

@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盘的文件和文件夹列出到a.txt文件中。看例: dir c:\\ && dir d:\\ > a.txt

这样执行后a.txt里只有D盘的信息!为什么?因为组合命令的优先级没有重定向命令的优先级高!所以,这句在执行时将本行分成这两部分:dir c:\\和dir d:\\ > a.txt,而并不是如你想的这两部分:dir c:\\ && dir d:\\和> a.txt。要使用组合命令&&达到题目的要求,必须得这么写:dir c:\\ > a.txt && dir d:\\ >> a.txt

这样,依据优先级高低,DOS将把这句话分成以下两部分:dir c:\\ > a.txt和dir d:\\ >> a.txt。

例十八中的几句的差别比较特殊,值得好好研究体会一下。 当然这里还可以利用&命令(自己想一下道理哦): dir c:\\ > a.txt & dir d:\\ >> a.txt

11、\字符串界定符

双引号允许在字符串中包含空格,进入一个特殊目录可以用如下方法 cd \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:\\1.txt 以上命令相当于 dir c:\\ dir d:\\ dir e:\\1.txt

其中文件e:\\1.txt不存在,但e盘存在,有错误提示,但命令仍会执行。

为什么?如果目标路径不存在,则终止执行;如果路径存在,仅文件不存在,则继续执行。就说这些了!各位有什么意见请回贴!有什么疑问请到BAT交流区发贴!下一节改进!

14、() 括号

小括号在批处理编程中有特殊的作用,左右括号必须成对使用,括号中可以包括多行命令,这些命令将被看成一个整体,视为一条命令行。括号在for语句和if语句中常见,用来嵌套使用循环或条件语句,其实括号()也可以单独使用,请看

例子. 例:

命令:echo 1 & echo 2 & echo 3 可以写成: ( echo 1 echo 2 echo 3 )

上面两种写法效果一样,这两种写法都被视为是一条命令行。

注意:这种多条命令被视为一条命令行时,如果其中有变量,就涉及到变量延迟的问题。

第三节 DOS循环:for命令详解

一、基本格式

FOR %%variable IN (set) DO command [command-parameters] %%variable 指定一个单一字母表示可替换的参数。 (set) 指定一个或一组文件。可以使用通配符。 command 指定对每个文件执行的命令。 command-parameters

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

参数:FOR有4个参数 /d /l /r /f 他们的作用我在下面用例子解释 现在开始讲每个参数的意思

二、参数

/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

三、参数 /R

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

检查以 [drive:]path 为根的目录树,指向每个目录中的FOR 语句。如果在 /R 后没有指定目录,则使用当目录。如果集仅为一个单点(.)字符,则枚举该目录树。

上面我们知道,/D只能显示当前路径下的目录名字,那么现在这个/R也是和目录有关,他能干嘛呢?放心他比/D强大多了!

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

请注意2点:

1、set中的文件名如果含有通配符(?或*),则列举/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:\\也就是搜索路径,这样他就会以当前目录为搜索路径,比如这个BAT你把他放在d:\\test目录下执行,那么他就会把D:\\test目录和他下面的子目录的全部EXE文件列出来!!!

例: @echo off

for /r c:\\ %%i in (boot.ini) do echo %%i pause

运行本例发现枚举了c盘所有目录,为了只列举boot.ini存在的目录,可改成下面这样: @echo off

for /r c:\\ %%i in (boot.ini) 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

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

pause

保存执行看效果,他会打印从1 2 3 4 5 这样5个数字 (1,1,5)这个参数也就是表示从1开始每次加1直到5终止! @echo off

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

执行后是不是吓了一跳,怎么多了5个CMD窗口,呵呵!如果把那个 (1,1,5)改成 (1,1,65535)会有什么结果,我先告诉大家,会打开65535个CMD窗口....这么多你不死机算你强!

当然我们也可以把那个start cmd改成md %%i 这样就会建立指定个目录了!!!名字为1-65535

看完这个被我赋予破坏性质的参数后,我们来看最后一个参数

五、参数 /F

\\迭代及文件解析

使用文件解析来处理命令输出、字符串及文件内容。使用迭代变量定义要检查的内容或字符串,并使用各种options选项进一步修改解析方式。使用options令牌选项指定哪些令牌应该作为迭代变量传递。请注意:在没有使用令牌选项时,/F 将只检查第一个令牌。

文件解析过程包括读取输出、字符串或文件内容,将其分成独立的文本行以及再将每行解析成零个或更多个令牌。然后通过设置为令牌的迭代变量值,调用 for 循环。默认情况下,/F 传递每个文件每一行的第一个空白分隔符号,跳过空行。

详细的帮助格式为:

FOR /F [\[command-parameters]

FOR /F [\[command-parameters]

FOR /F [\[command-parameters]

带引号的字符串\包括一个或多个指定不同解析选项的关键字。这些关键字为:

eol=c - 指一个行注释字符的结尾(就一个) skip=n - 指在文件开始时忽略的行数。

delims=xxx - 指分隔符集。这个替换了空格和跳格键的默认分隔符集。 tokens=x,y,m-n - 指每行的哪一个符号被传递到每个迭代的for本身。这会导致额外变量名称的分配。m-n 格式为一个范围。通过 nth 符号指定 mth。如果符号字符串中的最后一个字符星号,那么额外的变量将在最后一个符号解析之后分配并接受行的保留文本。经测试,该参数最多只能区分31个字段。

usebackq - 使用后引号(键盘上数字1左面的那个键`)。

未使用参数usebackq时:file-set表示文件,但不能含有空格

双引号表示字符串,即\ 单引号表示执行命令,即'command'

使用参数usebackq时:file-set和\都表示文件 当文件路径或名称中有空格时,就可以用双引号括起来 单引号表示字符串,即'string' 后引号表示命令执行,即`command` For命令例1: @echo off

rem 首先建立临时文件test.txt

echo ;注释行,这是临时文件,用完删除 >test.txt

echo 11段 12段 13段 14段 15段 16段 >>test.txt echo 21段,22段,23段,24段,25段,26段 >>test.txt echo 31段-32段-33段-34段-35段-36段 >>test.txt

FOR /F \echo %%i %%j %%k Pause Del test.txt

运行显示结果:

11段 13段 14段 15段 16段 21段 23段 24段,25段,26段 31段 33段 34段-35段-36段 请按任意键继续. . .

为什么会这样?我来解释: eol=; 分号开头的行为注释行

tokens=1,3* 将每行第1段,第3段和剩余字段分别赋予变量%%i,%%j,%%k delims=,- (减号后有一空格)以逗号减号和空格为分隔符,空格必须放在最后 For命令例2:**************************************** @echo off

FOR /F \Pause

运行将显示test.txt全部内容,包括注释行。

For命令例3:****************************************

另外/F参数还可以输出命令的结果 @echo off

FOR /F \pause

这样你本机全部帐号名字就出来了把扩号内的内容用两个单引号引起来就表示那个当命令执行,FOR会返回命令的每行结果,加那个\是为了让我空格的行能整行显示出来,不加就只显示空格左边一列!

第四节 FOR命令中的变量

FOR命令中有一些变量,他们的用法许多新手朋友还不太了解,今天给大家讲解他们的用法!

先把FOR的变量全部列出来:

~I - 删除任何引号(\,扩展 %I

%~fI - 将 %I 扩展到一个完全合格的路径名 %~dI - 仅将 %I 扩展到一个驱动器号

%~pI - 仅将 %I 扩展到一个路径 %~nI - 仅将 %I 扩展到一个文件名 %~xI - 仅将 %I 扩展到一个文件扩展名 %~sI - 扩展的路径只含有短名 %~aI - 将 %I 扩展到文件的文件属性 %~tI - 将 %I 扩展到文件的日期/时间 %~zI - 将 %I 扩展到文件的大小

%~$PATH:I - 查找列在路径环境变量的目录,并将 %I 扩展 到找到的第一个完全合格的名称。如果环境变量名 未被定义,或者没有找到文件,此组合键会扩展到 空字符串

我们可以看到每行都有一个大写字母\这个I其实就是我们在FOR带入的变量,我们FOR语句代入的变量

名是什么,这里就写什么.

比如:FOR /F %%z IN ('set') DO @echo %%z

这里我们代入的变量名是z那么我们就要把那个I改成z,例如%~fI改为%~fz 至于前面的%~p这样的内容就是语法了!

好开始讲解:

一、 ~I - 删除任何引号(\,扩展 %I 这个变量的作用就如他的说明,删除引号! 我们来看这个例子:

首先建立临时文件temp.txt,内容如下 \\3333\\\

可建立个BAT文件代码如下: @echo off

echo ^\echo \echo 3333^\echo \echo ^\

rem 上面建立临时文件,注意不成对的引号要加转义字符^,重定向符号前不要留空格

FOR /F \%%~i pause del temp.txt

执行后,我们看CMD的回显如下: 1111 #字符串前的引号被删除了 2222 #字符串首尾的引号都被删除了 3333\#字符串前无引号,后面的引号保留

4444\#字符串前面的引号删除了,而中间的引号保留 55\#字符串前面的引号删除了,而中间的引号保留 请按任意键继续. . .

和之前temp.txt中的内容对比一下,我们会发现第1、2、5行的引号都消失了,这就是删除引号~i的作用了

!

删除引号规则如下(BAT兄补充!)

1、若字符串首尾同时存在引号,则删除首尾的引号; 2、若字符串尾不存在引号,则删除字符串首的引号;

3、如果字符串中间存在引号,或者只在尾部存在引号,则不删除。

龙卷风补充:无头不删,有头连尾删。

二、 %~fI - 将 %I 扩展到一个完全合格的路径名

看例子:

把代码保存放在随便哪个地方,我这里就放桌面吧.

FOR /F \%%~fi pause

执行后显示内容如下

C:\\Documents and Settings\\Administrator\\桌面\\test.bat C:\\Documents and Settings\\Administrator\\桌面\\test.vbs 当我把代码中的 %%~fi直接改成%%i

FOR /F \%%i pause

执行后就会显示以下内容: test.bat test.vbs

通过对比,我们很容易就看出没有路径了,这就是\将 %I 扩展到一个完全合格的路径名\的作用

也就是如果%i变量的内容是一个文件名的话,他就会把这个文件所在的绝对路径打印出来,而不只单单打

印一个文件名,自己动手动实验下就知道了!

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

看例子:

代码如下,我还是放到桌面执行!

FOR /F \%%~di pause

执行后我CMD里显示如下 C: C:

我桌面就两个文件test.bat,test.vbs,%%~di作用是,如果变量%%i的内容是一个文件或者目录名,他就会

把他这文件

或者目录所在的盘符号打印出来!

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

这个用法和上面一样,他只打印路径不打印文件名字

FOR /F \%%~pi pause

我就不打结果了,大家自己复制代码看结果吧,下面几个都是这么个用法,代码给出来,大家自己看结果吧!

五、 %~nI - 仅将 %I 扩展到一个文件名 只打印文件名字

FOR /F \%%~ni pause

六、 %~xI - 仅将 %I 扩展到一个文件扩展名 只打印文件的扩展名

FOR /F \%%~xi pause

七、 %~sI - 扩展的路径只含有短名 打印绝对短文件名

FOR /F \%%~si pause

八、 %~aI - 将 %I 扩展到文件的文件属性 打印文件的属性

FOR /F \%%~ai pause

九、 %~tI - 将 %I 扩展到文件的日期/时间 打印文件建立的日期

FOR /F \%%~ti pause

十、 %~zI - 将 %I 扩展到文件的大小 打印文件的大小

FOR /F \%%~zi pause

上面例子中的\可以改为\,即不要分隔符

十一、 %~$PATH:I - 查找列在路径环境变量的目录,并将 %I 扩展 到找到的第一个完全合格的名称。如果环境变量名 未被定义,或者没有找到文件,此组合键会扩展到 空字符串

这是最后一个,和上面那些都不一样,我单独说说!

然后在把这些代码保存为批处理,放在桌面。 @echo off

FOR /F \ %%~$PATH:i pause

龙卷风补充:上面代码显示结果为C:\\WINDOWS\\system32\\notepad.exe

他的意思就在PATH变量里指定的路径里搜索notepad.exe文件,如果有notepad.exe则会把他所在绝对路

径打印出来,没有就打印一个错误!

第五节 批处理中的变量

批处理中的变量,我把他分为两类,分别为\系统变量\和\自定义变量\我们现在来详解这两个变量!

一、系统变量

他们的值由系统将其根据事先定义的条件自动赋值,也就是这些变量系统已经给他们定义了值,

不需要我们来给他赋值,我们只需要调用而以! 我把他们全部列出来! %ALLUSERSPROFILE% 本地 返回“所有用户”配置文件的位置。 %APPDATA% 本地 返回默认情况下应用程序存储数据的位置。 í% 本地 返回当前目录字符串。

%CMDCMDLINE% 本地 返回用来启动当前的 Cmd.exe 的准确命令行。 %CMDEXTVERSION% 系统 返回当前的“命令处理程序扩展”的版本号。 %COMPUTERNAME% 系统 返回计算机的名称。

%COMSPEC% 系统 返回命令行解释器可执行程序的准确路径。

úTE% 系统 返回当前日期。使用与 date /t 命令相同的格式。由 Cmd.exe 生成。有关date 命令的详细信息,请参阅 Date。

%ERRORLEVEL% 系统 返回上一条命令的错误代码。通常用非零值表示错误。 %HOMEDRIVE% 系统 返回连接到用户主目录的本地工作站驱动器号。基于主目录值而设置。用户主目录是在“本地用户和组”中指定的。

%HOMEPATH% 系统 返回用户主目录的完整路径。基于主目录值而设置。用户主目录是在“本地用户和组”中指定的。

%HOMESHARE% 系统 返回用户的共享主目录的网络路径。基于主目录值而设置。用户主目录是在“本地用户和组”中指定的。

%LOGONSERVER% 本地 返回验证当前登录会话的域控制器的名称。

%NUMBER_OF_PROCESSORS% 系统 指定安装在计算机上的处理器的数目。

%OS% 系统 返回操作系统名称。Windows 2000 显示其操作系统Windows_NT。 %PATH% 系统 指定可执行文件的搜索路径。

%PATHEXT% 系统 返回操作系统认为可执行的文件扩展名的列表。

%PROCESSOR_ARCHITECTURE% 系统 返回处理器的芯片体系结构。值:x86 或 IA64 基于Itanium

%PROCESSOR_IDENTFIER% 系统 返回处理器说明。

%PROCESSOR_LEVEL% 系统 返回计算机上安装的处理器的型号。 %PROCESSOR_REVISION% 系统 返回处理器的版本号。

%PROMPT% 本地 返回当前解释程序的命令提示符设置。由 Cmd.exe 生成。 %RANDOM% 系统 返回 0 到 32767 之间的任意十进制数字。由 Cmd.exe 生成。

%SYSTEMDRIVE% 系统 返回包含 Windows server operating system 根目录(即系统根目录)的驱动器。

%SYSTEMROOT%系统返回 Windows server operating system 根目录的位置。 %TEMP% 和 %TMP% 系统和用户 返回对当前登录用户可用的应用程序所使用的默认临时目录。有些应用程序需要 TEMP,而其他应用程序则需要 TMP。

%TIME% 系统 返回当前时间。使用与 time /t 命令相同的格式。由 Cmd.exe 生成。有关time 命令的详细信息,请参阅 Time。

%USERDOMAIN% 本地 返回包含用户帐户的域的名称。 %USERNAME% 本地 返回当前登录的用户的名称。 %USERPROFILE% 本地 返回当前用户的配置文件的位置。

%WINDIR% 系统 返回操作系统目录的位置。这么多系统变量,我们如何知道他的值是什么呢?在CMD里输入 echo %WINDIR%

这样就能显示一个变量的值了!举个实际例子,比如我们要复制文件到当前帐号的启动目录里就可以这样

copy d:\\1.bat \「开始」菜单\\程序\\启动\\\

%USERNAME% 本地 返回当前登录的用户的名称。 注意有空格的目录要用引号引起来另外还有一些系统变量,他们是代表一个意思,或者一个操作!

他们分别是%0 %1 %2 %3 %4 %5 ......一直到%9 还有一个%* %0 这个有点特殊,有几层意思,先讲%1-%9的意思.

%1 返回批处理的第一个参数 %2 返回批处理的第二个参数 %3-%9依此推类

反回批处理参数?到底怎么个返回法?我们看这个例子,把下面的代码保存为test.BAT然后放到C盘下 @echo off

echo %1 %2 %3 %4 echo %1 echo %2 echo %3 echo %4

进入CMD,输入cd c:\\

然后输入 test.bat 我是第一个参数 我是第二个参数 我是第三个参数 我是第四个参数

注意中间的空格,我们会看到这样的结果:

我是第一个参数 我是第二个参数 我是第三个参数 我是第四个参数 我是第一个参数 我是第二个参数 我是第三个参数 我是第四个参数

对比下代码,%1就是”我是第一个参数” %2就是”我是第二个参数” 怎么样理解了吧!

这些%1和%9可以让批处理也能带参数运行,大大提高批处理功能!还有一个%* 他是什么呢?他的作用不是很大,只是返回参数而已,不过他是一次返回全部参数的值,不用在输入%1 %2来确定一个个的

例子 @echo off echo %*

同样保存为test.bat 放到C盘 进入CMD,输入cd c:\\

然后输入 test.bat 我是第一个参数 我是第二个参数 我是第三个参数 我是第四个参数

好现在开始讲那个比较特殊的%0

%0 这个不是返回参数的值了,他有两层意思! 第一层意思:返回批处理所在绝对路径 例子: @echo off echo %0 pause

保存为test.BAT放在桌面运行,会显示如下结果

\桌面\\test.bat\

他把当前批处理执行的所在路经打印出来了,这就是返回批处理所在绝对路径的意思

第二层意思:无限循环执行BAT 例子: @echo off net user %0

保存为BAT执行,他就会无限循环执行net user这条命令,直到你手动停止. 龙卷风补充:其实%0就是第一参数%1前面那个参数,当然就是批处理文件名(包括路径)。

以上就是批处理中的一些系统变量,另外还有一些变量,他们也表示一些功能, FOR命令中的那些就是,FOR变量已经说过,就不讲了.

二、自定义变量

故名思意,自定义变量就是由我们来给他赋予值的变量 要使用自定义变量就得使用set命令了,看例子. @echo off set var=我是值

echo %var% pause

保存为BAT执行,我们会看到CMD里返回一个 \我是值\var为变量名,=号右变的是要给变量的值 这就是最简单的一种设置变量的方法了

如果我们想让用户手工输入变量的值,而不是在代码里指定,可以用用set命令的/p参数

例子: @echo off

set /p var=请输入变量的值 echo %var% pause

var变量名 =号右边的是提示语,不是变量的值,变量的值由我们运行后自己用键盘输入!

第六节 set命令详解

一、用set命令设置自定义变量

显示、设置或删除 cmd.exe 环境变量。 SET [variable=[string]] variable 指定环境变量名。

string 指定要指派给变量的一系列字符串。 要显示当前环境变量,键入不带参数的 SET。 SET 命令不允许变量名含有等号。

注意:以下用法将清除变量variable的值,使其变成未定义状态。 SET variable=

上面等号后面无任何符号,如果写成SET variable=\,此时变量值并不为空,而是等于两个引号,即\

例子: @echo off set var=我是值 echo %var% pause

在批处理中我们要引用这个变就把var变量名用两个%(百分号)扩起来,如%var%

SET还可以提供一个交互界面,让用户自己输入变量的值,然后我们在来根据这个值来做相应操作,现在我就来说说SET的这种语法,只需要加一个\参数就可以了! SET /P variable=[promptString]

例子: @echo off

set /p var=请输入变量的值: echo 您输入了 %var% ~_~ pause

set /p 是命令语法 var是变量名 =号右边的\请输入变量的值: \这个是提示语,不是变量的值了!

运行后,我们在提示语后面直接输入1,就会显示一行您输入了 1 ~_~ 这两种语法外,还有如下几种语法: SET /A expression 环境变量替换已如下增强: %PATH:str1=str2% %PATH:~10,5% %PATH:~-10% %PATH:~0,-2%

这机种语法有什么用处呢?下面我们来一个个讲解他们!

二、用set命令进行简单计算 语法:SET /A expression

/A 命令行开关指定等号右边的字符串为被评估的数字表达式。该表达式

评估器很简单并以递减的优先权顺序支持下列操作: () -分组 ! ~ - -一元运算符 * / % -算数运算符 + - -算数运算符 << >> -二进制逻辑移位 & -二进制按位“与” ^ -二进制按位“异” | -二进制按位“或” = *= /= %= += -= -算数赋值

&= ^= |= <<= >>= -二进制运算赋值 -表达式分隔符

有时候我们需要直接在原变量进行加减操作就可以用这种语法

set /a var+=1 这样的语法对应原始语法就是set /a var = %var% + 1 都是一样的结果,在原变量的值上在进行数学运算,不过这样写简单一点 再来一个: set /a var*=2

三、用set命令进行字符串处理

1、字符串替换

%PATH:str1=str2%

上面语法的意思就是:将字符串变量%PATH%中的str1替换为str2 这个是替换变量值的内容,看例子 @echo off

set a= bbs. verybat. cn echo 替换前的值: \set var=%a: =%

echo 替换后的值: \pause

运行显示:替换前的值: \替换后的值: \

对比一下,我们发现他把变量%a%的空格给替换掉了,从这个例子,我们就可以发现

%PATH:str1=str2%这个操作就是把变量%PATH%的里的str1全部用str2替换

比如我们把上面的例子改成这样 @echo off

set a=bbs.verybat.cn echo 替换前的值: \set var=%a:.=伤脑筋% echo 替换后的值: \pause

运行显示:

替换前的值: \

替换后的值: \伤脑筋verybat伤脑筋cn\

解释set var=%a:.=伤脑筋%

set是命令 var是变量名 字a是要进行字符替换的变量的值,\为要替换的值, \伤脑筋\为替换后的值!

执行后就会把变量%a%里面的\全部替换为\伤脑筋\

这就是set的替换字符的很好的功能! 替换功能先讲到这,下面将字符串截取功能

请注意:字符串的替换和截取功能在引用变量的地方均可以,并不一定必须要有set命令 例: @echo off

set a=bbs.verybat.cn echo 替换前的值: \

echo 替换后的值: \伤脑筋%\pause

此例在echo语句中就替换了字符串,效果一样。 2、字符串截取

截取功能统一语法格式为:%a:~[m[,n]]%

方括号表示可选,%为变量标识符,a为变量名,不可少,冒号用于分隔变量名和说明部分,符号~可以简单理解为“偏移”即可,m为偏移量(缺省为0),n为截取长度(缺省为全部)%PATH:~10,5% 这个什么意思,看例子: 截取功能例子1: @echo off

set a=bbs.verybat.cn set var=%a:~1,2% echo %var% pause

执行后,我们会发现只显示了\两个字母,我们的变量%a%的值不是为bbs.verybat.cn吗?

怎么只显示了第2个字母和第3个字母\分析一结果我们就可以很容易看出 %PATH:~10,5%就是显示变量PATH里从11位(偏移量10)开始的5个字符! 分析set var=%a:~1,2%

set是命令,var是变量值,a要进行字符操作的变量,\从变量\第几位开始显示,\表示显示几

位。

合起来就是把变量a的值从第2位(偏移量1)开始,把2个字符赋予给变量var 这样应该明白了吧~

其他两种语法 %PATH:~-10% %PATH:~0,-2%

他们也是显示指定变量指定几位的值的意思

%PATH:~-10% 看例子 截取功能例子2: @echo off

set a=bbs.verybat.cn set var=%a:~-3% echo %var%

pause 运行结果:.cn

这个就是把变量a倒数3位的值给变量VAR

当然我们也可以改成这样 截取功能例子3: @echo off

set a=bbs.verybat.cn set var=%a:~3% echo %var% pause

运行显示:.verybat.cn

这个就是把变量a的从第3位开始后面全部的值给变量VAR

%PATH:~0,-2% 例子 截取功能例子4: @echo off

set a=bbs.verybat.cn set var=%a:~0,-3% echo %var% pause

执行后,我们发现显示的是\少了\从结果分析,很容易分析出,这是把变量a的值从0位开始, 到倒数第三位之间的值全部赋予给var

如果改成这样 截取功能例子5: @echo off

set a=bbs.verybat.cn set var=%a:~2,-3% echo %var% pause

运行显示:s.verybat

那么他就是显示从第3位(偏移量2)开始减去倒数三位字符的值,并赋予给变量var

讲得好,例子就是说明问题,为便于记忆,龙卷风小节如下: a=bbs.verybat.cn

%a:~1,2% =“bs” 偏移量1,从第二位开始向右取2位

%a:~-3% =“.cn” 偏移量负3,即倒数3位(也可理解为留下右边3位),右取全部

%a:~3% =“.verybat.cn” 偏移量3(也可理解为去掉左边3位),右取全部 %a:~0,-3% =“bbs.verybat” 偏移量0,右取长度至负3,即倒数3位 %a:~2,-3% =“s.verybat” 偏移量2,右取长度至负3,即倒数3位

********************************************** 所以,截取功能统一语法格式为:%a:~[m[,n]]%

**********************************************

方括号表示可选,%a%为变量名,不可少,冒号用于分隔变量名和说明部分,符号~可以简单理解为“偏

移”即可,m为偏移量(缺省为0),n为截取长度(缺省为全部) 上面所述用法其实相当于vbs函数mid、left、right %a:~0,n% 相当于函数left(a,n) 取左边n位 %a:~-m% 相当于函数right(a,m) 取右边m位

%a:~m,n% 相当于函数mid(a,m+1,n) 从m+1位开始取n位

%a:~m,-n% 相当于函数mid(a,m+1,len(a)-m-n),从m+1位开始,至倒数n+1位

%a:~m % 相当于函数mid(a,m+1,len(a)-m) 或者right(a,len(a)-m),从m+1位开始取右边全部。

思考题目:输入任意字符串,求字符串的长度 参考答案:

@echo off

set /p str=请输入任意长度的字符串: echo 你输入了字符串:\call :stringlenth \

echo 字符串长度为:%num% pause exit

:StringLenth

::---------字符串长度计算子程序

::---------参数%1为字符串(如有空格,请用引号括起来) ::---------参数%2为返回变量名称,不能含空格或特殊字符 ::@echo off set theString=%~1

if not defined theString goto :eof set Return=0

:StringLenth_continue set /a Return+=1

set thestring=%thestring:~0,-1%

if defined thestring goto StringLenth_continue if not \goto :eof

第六节 if命令讲解

IF [NOT] ERRORLEVEL number command IF [NOT] string1==string2 command IF [NOT] EXIST filename command

NOT 指定只有条件为 false 的情况下, Windows XP 才应该执行该命令。 ERRORLEVEL number 如果最后运行的程序返回一个等于或大于指定数字的退出编码,指定条件为 true。

string1==string2 如果指定的文字字符串匹配,指定条件为 true。 EXIST filename 如果指定的文件名存在,指定条件为 true。

command 如果符合条件,指定要执行的命令。如果指定的条件为 FALSE,命令后可跟一个执行 ELSE 键字后的命令的 ELSE 命令。

ELSE 子句必须在 IF 之后出现在同一行上。例如: IF EXIST filename ( del filename ) ELSE (

echo filename missing )

第一种用法:IF [NOT] ERRORLEVEL number command

这个用法的基本做用是判断上一条命令执行结果的代码,以决定下一个步骤. 一般上一条命令的执行结果代码只有两结果,\成功\用0表示 \失败\用1表示.

举个例子: @echo off net user

IF %ERRORLEVEL% == 0 echo net user 执行成功了! pause

这是个简单判断上条命令是否执行成功.

细心的朋友可能会发现,这个用法和帮助里的用法不太一样,按照帮助里的写法\

echo net user 执行成功了! \这一句代码应该写成:IF ERRORLEVEL 0 echo net user 执行成功了!

那为什么我要写成这样呢?各位自己把代码改掉执行后,就会发现错误了!用这种语法,不管你的上面的命令是否执行成功,他都会认为命令成功了,不知道是BUG还是本人理解错误...

补充:这不是bug,而是 if errorlevel 语句的特点:当使用 if errorlevel 0 …… 的句式时,它的含义是:如果错误码的值大于或等于0的时候,将执行某个操作;当使用 if %errorlevel%==0 …… 的句式时,它的含义是:如果错误码的值等于0的时候,将执行某操作。因为这两种句式含义的差别,如果使用前一种句式的时候,错误码语句的排列顺序是从大到小排列%ERRORLEVEL% 这是个系统变量,返回上条命令的执行结果代码! \成功\用0表示 \失败\用1表示. 当然还有其他参数,用的时候基本就这两数字.一般上一条命令的执行结果代码只有两结果,\成功\用0表示 \失败\用1表

本文来源:https://www.bwwdw.com/article/7d57.html

Top