批处理命令入门

批处理教程

我最近根据网络搜集与自己的整理形成以下的文章,现与大家共享:

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

批处理本质是一堆DOS命令按一定顺序排列而形成的集合。批处理的作用就是自动的连续执行多条命令,批处理,也称为批处理脚本,英文译为BATCH。批处理有一个很鲜明的特点:使用方便、灵活,功能强大,自动化程度高。扩展名是bat(nt/2000/xp/2003下也可以是cmd)的文件就是批处理文件。一个良好的习惯是在硬盘上建立一个bat或者batch目录(例如C:/BATCH),然后将所有你编写的批处理文件放到该目录中。

首先,批处理文件是一个文本文件,文件的每一行都是一条DOS命令。

其次,批处理文件是一种简单的程序,通过(if)和制语句(goto)来控制命令运行的流程。

第三,编写好的批处理文件都相当于一个DOS的外部命令,可以在任何位置调用运行。

第四,在DOSWin9x/Me系统下,C:/AUTOEXEC.BAT是启动计算机自动运行的。

介绍命令

1REM和 ::      REM为注释命令,可以回显,::不回显,简洁有效亦可加快运行速度。第一、任何以冒号开头的字符行,在批处理中都被视作标号,而直接忽略其后的所有内容。

有效标号:冒号后紧跟一个以字母数字开头的字符串,goto语句可以识别。

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

第二、rem在某些场合下将比::更为适用;另外, rem 可以用于config.sys 文件中。

2ECHO 和 @

@Echo off

Echo hello

Pause

运行显示:hello

3PAUSE     Echo 其他提示语 & pause > nulEcho 其他提示语 & pause >>nul效果一样)

或者写成以下形式其功能也一样(两行):

Echo 其他提示语  

pause >>> nul

4errorlevel

程序返回码echo %errorlevel%命令行格式查看返回码判断命令是否成,成功返回“0” 

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

6COLOR    设置默认的控制台前景和背景颜色。

COLOR [attr]         第一个为背景,第二个则为前景。

7mode 配置系统设备       help   mode >a.txt    

8GOTO 和 :

if {%1}=={} goto noparmsif "%2"=="" goto noparms

@echo off

:start

set /a var+=1

echo %var%

if %var% leq 3 GOTO start

pause

9find文件中搜索字符串如果没有指定路径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 #显示文件行数 

10start 命令:批处理中调用外部程序的命令;如果直接运行外部程序则必须等外部程序完成后才继续执行剩下的指令  start explorer d:/  调用图形界面打开D盘(cd d:/

11assoc 和 ftype            文件关联

assoc 设置'文件扩展名'关联,关联到'文件类型'   ftype 设置'文件类型'关联,关联到'执行程序和参数当你双击一个.txt文件时,windows并不是根据.txt直接判断用 notepad.exe 打开而是先判断.txt属于txtfile '文件类型'再调用txtfile 关联的命令行 txtfile=%SystemRoot%/system32/NOTEPAD.EXE %1可以在"文件夹选项""文件类型"里修改这2种关联

assoc 显示所有'文件扩展名'关联;assoc .txt [#]显示.txt代表的'文件类型。

ftype  显示所有'文件类型'关联;ftype exefile [#]显示exefile类型关联的命令行

assoc .txt=Word.Document.8可以看到.txt文件的图标都变了

assoc .txt=txtfile  恢复.txt的正确关联;ftype exefile="%1" %*恢复 exefile 的正确关联

如果该关联已经被破坏,可以运行 command.com ,再输入这条命令

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

pause13CALL

CALL [drive:][path]filename [batch-parameters]调用的其它批处理程序。filename 参数必须具有 .bat 或 .cmd 扩展名。CALL :label arguments调用本文件内命令段,相当于子程序。被调用的命令段以标签:label开头以命令goto :eof结尾。

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

参数扩充时不理会参数所代表的文件是否真实存在,均以当前目录进行扩展

@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

: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 /2会将 %3 移位到 %2,将 %4 移位到 %3,等等;并且不影响 %0 和 %1

15IF

(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检测当前变量的值做出判断,为防止字符串中有空格,可用以下格式 

if [NOT] {string1}=={string2} command

if [NOT] [string1]==[string2] command    if [NOT] “string1”==“string2”command这种写法实际上将括号或引号当成字符串的一部分了

(3) IF [NOT] EXIST filename command

EXIST filename为文件或目录存在的意思

echo off

IF EXIST autoexec.bat echo 文件存在!

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

16setlocal 与 变量延迟     setlocal enabledelayedexpansion   

1

@echo off

set a=4

set a=5 & echo %a%

pause

结果:4

第二节 常用特殊符号

管道命令(优先级)>重定向命令>组合命令

1@   命令行回显屏蔽符;2%   批处理变量引导符;3重定向符;4>>   重定向符;5<>&<& 重定向符;6|   命令管道符;7^   转义字符;8&   组合命令;9&& 组合命令;10||   组合命令;11""   字符串界定符;12逗号;13分号;14() 括号;15感叹号(变量延迟的启动语句是“setlocal enabledelayedexpansion)

16、批处理中可能会见到的其它特殊标记符:CR(0D)命令行结束符;Escape(1B) ANSI转义字符引导符;Space(20) 常用的参数界定符 Tab(09) ; = 不常用的参数界定符;+ COPY命令文件连接符;* ? 文件通配符;参数开关引导符;批处理标签引导符。

1@   命令行回显屏蔽符

2%   批处理变量引导符:它只是批处理中的参数而已,引用变量用%var%,调用程序外部参数用%1%9等等,%0  %1  %2  %3  %4  %5  %6  %7  %8  %9  %*为命令行传递给批处理的参数%0 批处理文件本身,包括完整的路径和扩展名;%1 第一个参数;%9 第九个参数;%* 从第一个参数开始的所有参数;参数%0具有特殊的功能,可以调用批处理自身,以达到批处理本身循环的目的,也可以复制文件自身等等。

例:最简单的复制文件自身的方法      copy %0 d:/wind.bat

3>重定向符

4>>重定向符

5<>&<&重定向符<输入重定向命令从文件中读取命令输入,而不是从键盘中读入。

@echo off

echo 2005-05-01>temp.txt

date 

del temp.txt

>&  将一个句柄的输出写入到另一个句柄的输入中;<&  从一个句柄读取输入并将其写入到另一个句柄输出中。常用句柄:012,未定义句柄:39

1>nul 表示禁止输出正确的信息;2>nul 表示禁止输出错误信息。

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

句柄0:标准输入stdin,键盘输入;句柄1:标准输出stdout,输出到命令提示符窗口(console,代码为CON);句柄2:标准错误stderr,输出到命令提示符窗口(console,代码为CON

其中的stdin可被<重定向,stdout可被>>>重定向,而stderrDOS下不可直接重定向,只有通过ctty或其它命令将系统控制权转交给其它设备的方式,来间接完成。

6|   命令管道符        格式:第一条命令 第二条命令 [| 第三条命令...]

将第一条命令的结果作为第二条命令的参数来使用,

例如:dir c:/|find "txt"  ::查找C/所有,并发现TXT字符串。

不使用format的参数时,我是这样来自动格式化A盘的echo y|format a: /s /q /v:system

7^    转义字符

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

echo test ^>1.txt             结果则是:test > 1.txt

例:

@echo off

echo 英雄^

^

^

男人

pause

8&   组合命令  

比如: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:/ > a.txt && dir d:/ >> a.txt 

11""字符串界定符  双引号允许在字符串中包含空格,进入一个特殊目录可以用如下方法

cd "program files"cd progra~1cd pro*  以上三种方法都可以进入program files这个目录

12逗号      逗号相当于空格          比如:dir,c:/

13分号   当命令相同时,可以将不同目标用来隔离,如果目标路径不存在,则终止执行;如果路径存在,文件不存在,则继续执行。

比如:dir c:/;d:/;e:/;z:/以上命令相当于

dir c:/

dir d:/

dir e:/

dir z:/

例:dir c:/;d:/;e:/1.txt                命令相当于

dir c:/

dir d:/

dir e:/1.txt

14() 括号         这些命令将被看成一个整体,视为一条命令行。

例:  命令:echo 1 & echo 2 & echo 3

可以写成:

(

echo 1

echo 2

echo 3

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

15感叹号

FOR         专题讲座

FOR 参数 %%变量名 IN (相关文件或命令)   DO 执行的命令参数:FOR4个参数 /d /l /r /f 他们的作用我在下面用例子解释%%变量名 :这个变量名他们区分大小写。

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

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

   (set)    指定一个或一组文件。可以使用通配符。

   command 指定对每个文件执行的命令。

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

一、参数 /d   只能显示当前目录下的目录名字

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

@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个字母的,就会显示出来,没有就不显示了

@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 后没有指定目录,则使用当前目录。如果集仅为一个单点(.)字符,则枚举该目录树。

1

@echo off

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

pause

以当前目录为搜索路径:目录和他下面的子目录的全部EXE文件列出来!!!

3

@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]

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

@echo off

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

pause

保存执行看效果,他会打印从1 2 3 4 5   这样5个数字

@echo off

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

pause

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

四、参数 /F    /迭代及文件解析在没有使用令牌选项时,/F 将只检查第一个令牌。默认情况下,/F 传递每个文件每一行的第一个空白分隔符号。跳过空行"options"包括一个或多个

FOR /F ["options"] %variable IN (file-set) DO command [command-parameters]

FOR /F ["options"] %variable IN ("string") DO command [command-parameters]

FOR /F ["options"] %variable IN ('command') DO command [command-parameters]

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 "eol=; tokens=1,3* delims=,- " %%i in (test.txt) do 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 "eol= delims=" %%i in (test.txt) do echo %%i

Pause

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

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

另外/F参数还可以以输出命令的结果看这个例子

@echo off

FOR /F "delims=" %%i in ('net user') do @echo %%i

pause

这样你本机全部帐号名字就出来了把扩号内的内容用两个单引号引起来就表示那个当命令执行,FOR会返回命令的每行结果,加那个"delims=" 是为了让空格的行能整行显示出来,不加就是只显示空格左边一列!比如:FOR /F   %%z IN ('set') DO @echo %%z

这里我们代入的变量名是z那么我们就要把那个I改成z,例如%~fI改为%~fz

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

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

"1111

"2222"

3333"

"4444"44

"55"55"55

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

@echo off

echo ^"1111>temp.txt

echo "2222">>temp.txt

echo 3333^">>temp.txt

echo "4444"44>>temp.txt

echo ^"55"55"55>>temp.txt

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

FOR /F "delims=" %%i IN (temp.txt) DO echo   %%~i

pause

del temp.txt

执行后,我们看CMD的回显如下:

1111           #字符串前的引号被删除了

2222           #字符串首尾的引号都被删除了

3333"       #字符串前无引号,后面的引号保留

4444"44        #字符串前面的引号删除了,而中间的引号保留

55"55"55    #字符串前面的引号删除了,而中间的引号保留

请按任意键继续. . ..

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

无头不删,有头连尾删,无尾则删首。

1、若字符串首尾同时存在引号,则删除首尾的引号;2、若字符串尾不存在引号,则删除字符串首的引号;3、如果字符串中间存在引号,或者只在尾部存在引号,则不删除。

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

看例子:

FOR /F "delims==" %%i IN ('dir /b') DO @echo   %%~fi

pause

执行后显示内容如下

C:/Documents and Settings/Administrator/桌面/test.bat

C:/Documents and Settings/Administrator/桌面/test.vbs

当我把代码中的 %%~fi直接改成%%i

FOR /F "delims==" %%i IN ('dir /b') DO @echo   %%i

pause

执行后就会显示以下内容:

test.bat

test.vbs

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

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

FOR /F "delims==" %%i IN ('dir /b') DO @echo   %%~di

pause

执行后我CMD里显示如下

C:

C:

如果变量%%i的内容是一个文件或者目录名,会把这文件或者目录所在的盘符号打印出来!

四、 %~pI 仅将 %I 扩展到一个路径‘这个用法和上面一样,他只打印路径不打印文件名字

FOR /F "delims==" %%i IN ('dir /b') DO @echo   %%~pi

pause

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

FOR /F "delims==" %%i IN ('dir /b') DO @echo   %%~ni

pause

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

FOR /F "delims==" %%i IN ('dir /b') DO @echo   %%~xi

pause

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

FOR /F "delims==" %%i IN ('dir /b') DO @echo   %%~si

pause

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

FOR /F "delims==" %%i IN ('dir /b') DO @echo   %%~ai

pause

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

FOR /F "delims==" %%i IN ('dir /b') DO @echo   %%~ti

pause

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

FOR /F "delims==" %%i IN ('dir /b') DO @echo   %%~zi

pause

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

十一、%~$PATH:I查找列在路径环境变量的目录,并将 %I 扩展到找到的第一个完全合格的名称。如果环境变量名未被定义,或者没有找到文件,此组合键会扩展到空字符串把这些代码保存为批处理,放在桌面。

@echo off

FOR /F "delims=" %%i IN (“notepad.exe”) DO echo   %%~$PATH:i

pause

一、系统变量

%ALLUSERSPROFILE% 本地 返回“所有用户”配置文件的位置。

%APPDATA% 本地 返回默认情况下应用程序存储数据的位置。

%CD% 本地 返回当前目录字符串。

%CMDCMDLINE% 本地 返回用来启动当前的 Cmd.exe 的准确命令行。

%CMDEXTVERSION% 系统 返回当前的“命令处理程序扩展”的版本号。

%COMPUTERNAME%   系统 返回计算机的名称。

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

%DATE%   系统 返回当前日期。使用与 date /t 命令相同的格式由 Cmd.exe 生成。

%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% 系统 返回 到 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 "%USERPROFILE%/「开始」菜单/程序/启动/"

%USERNAME% 本地 返回当前登录的用户的名称。   注意有空格的目录要用引号引起来

另外还有一些系统变量,他们是代表一个意思,或者一个操作!www.cmdos.net

他们分别是%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可以让批处理也能带参数运行,大大提高批处理功能!

:

@echo off

echo %*

同样保存为test.bat 放到C

进入CMD,输入cd c:/

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

可以看到他一次把全部参数都显示出来了

%0   这个不是返回参数的值了,他有两层意思!

第一层意思:返回批处理所在绝对路径

@echo off

echo %0

pause

保存为test.BAT放在桌面运行,会显示如下结果"C:/Documents and Settings/Administrator/桌面/test.bat"他把当前批处理执行的所在路经打印出来了,返回批处理所在绝对路径的意思。

第二层意思:无限循环执行BAT

例子:

@echo off

net user

%0

二、自定义变量

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

显示、设置或删除 cmd.exe 环境变量。

SET [variable=[string]] variable 指定环境变量名;string 指定要指派给变量的一系列字符串。

要显示当前环境变量,键入不带参数的 SETSET;命令不允许变量名含有等号。

例子:

@echo off

set var=我是值

echo %var%

pause

请看 set var=我是值 ,这就是BAT直接在批处理中设置变量的方法!

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

现在我就来说说SET的这种语法,只需要加一个"/P"参数就可以了。

SET /P variable=[promptString]

@echo off

set /p var=请输入变量的值:

echo 您输入了 %var%   ~_~

pause

set /p 是命令语法   var是变量名 =号右边的"请输入变量的值: "

运行后,我们在提示语后面直接输入1,就会显示一行您输入了 1 ~_~

2、用set命令进行简单计算

语法:SET /A expression              /A 命令行开关指定等号右边的字符串为被评估的数字表达式。注意:DOS计算只能精确到整数

例:

@echo off

set /p input=请输入计算表达式:

set /a var=%input%

echo 计算结果:%input%=%var%

pause

请输入计算表达式:1+9+20+30-10

计算结果:1+9+20+30-10=50

上面的计算过程显示,DOS计算只能精确到32位,这个32位是指二进制32位,其中最高位为符号位(0为正,1为负),低位31位为数值。311换成十进制为2147483647,所以DOS计算的有效值范围是-21474836472147483647,超出该数值范围时计算出错。

运行set /a a=1+1,b=2+1,c=3+1后会显示一个4

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

set /a var+=1   这样的语法对应原始语法就是set /a var = %var% + 1

set /a var*=2

对于"逻辑或取余操作符",我们需要把他们用双引号引起来,也可以用转义字符

set /a var= 1 "&" 1 这样结果就显示出来了,其他逻辑或取余操作符用法

set /a var= 1 "+" 1 异运算

set /a var= 1 "%" 1   取模运算

set /a var= 3 "<<" 2 左移位运算, 3的二进制为11,左移2位为1100

set /a var= 4 ">>" 2右移位运算,4的二进制为100,右移动2位为1,结果为1

这些符号也可以用&= ^= |= <<= >>= 这样的简单用法如

set /a var"&=" 1 等于set /a var = %var% "&" 1 注意引号

思考题:求2n次方

@echo off

set /p n=请输入2的几次方

set /a num=1^<^   rem 

pause

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

(1)、字符串替换

现在说%PATH:str1=str2%

上面语法的意思就是:将字符串变量%PATH%中的str1替换为str2且是替换变量值的内容

@echo off

set a= bbs.  verybat. cn

echo 替换前的值: "%a%"

set var=%a: =%

echo 替换后的值: "%var%"

pause

替换前的值: " bbs. verybat. cn"

替换后的值: "bbs.verybat.cn"

把上面的例子改成这样

@echo off

set a=bbs.verybat.cn

echo 替换前的值: "%a%"

set var=%a: =伤脑筋%

echo 替换后的值: "%var%"

pause

运行显示: 

替换前的值: "bbs.verybat.cn"

替换后的值: "bbs伤脑筋verybat伤脑筋cn"

(2)、字符串截取          语法格式为:%a:~[m[,n]]%

方括号表示可选,%为变量标识符,a为变量名,不可少,冒号用于分隔变量名和说明部分,符号~可以简单理解为“偏移”即可,m为偏移量(缺省为0),n为截取长度(缺省为全部)

能例1

@echo off

set a=bbs.verybat.cn

set var=%a:~1,2%

echo %var%

pause

其他两种语法

%PATH:~-10%

%PATH:~0,-2%

2

@echo off

set a=bbs.verybat.cn

set var=%a:~-3%

echo %var%

pause

运行结果:.cn

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

执行批处理程序中的条件处理。

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表示

举个例子:

@echo off

net user

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

pause

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

这只是一般的情况,实际上,errorlevel返回值可以在0~255之间。比如,xcopy默认的errorlevel值就有5个,分别表示5种执行状态:

文件复制没有错误。

1if errorlevel 2 echo2、用户按 CTRL+C 终止了 xcopy3、出现了初始化错误。没有足够的内存或磁盘空间或命令行上输入了无效的驱动器名称或语法;4、出现了磁盘写入错误。

if errorlevel 5 echo出现了磁盘写入错误

if errorlevel 4 echo出现了初始化错误

if errorlevel 2 echo用户按 CTRL+C 终止了 xcopy

if errorlevel 1 echo if errorlevel 2 echo

if errorlevel 0 echo文件复制没有错误。

1

@echo off

net usertest

IF %ERRORLEVEL% == 1 echo net user 执行失败了!

pause

2

@echo off

set /p var=随便输入个命令:                     

%var%

if %ERRORLEVEL% == 0 goto yes

goto no

:yes

echo !var! 执行成功了

pause

exit

:no

echo 基本上执行失败了..

pause

在来一个简化版的

@echo off

set /p var=随便输入个命令:

%var%

if %ERRORLEVEL% == 0 (echo %var%执行成功了) ELSE echo %var%执行失败了!

pause

当然我门还可以把if else这样的语句分成几行写出来,使他看上去好看点...

@echo off

set /p var=随便输入个命令:

%var%

if %ERRORLEVEL% == 0   (

echo !var! 执行成功了

) ELSE (

echo 基本上执行失败了..

)

pause

第二种用法:IF [NOT] string1==string2 command

例子

@echo off

set /p var=请输入第一个比较字符:

set /p var2=请输入第二个比较字符:

if %var% == %var2% (echo 我们相等) ELSE echo 我们不相等

pause

下面的例子打上了括号是为了区别是否有空格。

@echo off

set /p var=请输入第一个比较字符:

set /p var2=请输入第二个比较字符(多输入个空格试试):

if "%var%" == "%var2%" (echo 我们相等) ELSE echo 我们不相等

pause

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

例子

@echo off

if exist "c:/test" (echo 存在文件) ELSE echo 不存在文件

pause

第四种用法:IF增强的用法

   IF [/i] string1 compare-op string2 command       /i的意思是不比较时不区分大小写。

   IF CMDEXTVERSION number command

   IF DEFINED variable command

CMDEXTVERSION 条件的作用跟 ERRORLEVEL 的一样,除了它是在跟与命令扩展名有关联的内部版本号比较。第一个版本是 1。每次对命令扩展名有相当大的增强时,版本号会增加一个。命令扩展名被停用时CMDEXTVERSION 条件不是真的。如果已定义环境变量,DEFINED 条件的作用跟 EXISTS 的一样,除了它取得一个环境变量,返回的结果是 true

@echo off

if a == A (echo 我们相等) ELSE echo 我们不相等

pause

执行后会显示:我们不相等

@echo off

if /i a == A (echo 我们相等) ELSE echo 我们不相等

pause

我们相等

EQU -等于;NEQ -不等于;LSS -小于;LEQ -小于或等于;GTR -大于;GEQ -大于或等于

@echo off

set /p var=请输入一个数字:

if %var% LEQ   4 (echo 我小于等于4) ELSE echo 我不小于等于4

pause

三、交互界面设计

@echo off&title DOS资源站 www.cmdos.net

cls

title 终极多功能修复

:menu

cls

color 0A

echo.

echo                 ==============================

echo                 请选择要进行的操作,然后按回车

echo                 ==============================

echo.

echo              1.网络修复及上网相关设置,修复IE,自定义屏蔽网站

echo.

echo              2.病毒专杀工具,端口关闭工具,关闭自动播放

echo.

echo              3.清除所有多余的自启动项目,修复系统错误

echo.

echo              4.清理系统垃圾,提高启动速度

echo.

echo              Q.退出

echo.

echo.

:cho

set choice=

set /p choice=       请选择:

IF NOT "%choice%"=="" SET choice=%choice:~0,1%

if /i "%choice%"=="1" goto ip

if /i "%choice%"=="2" goto setsave

if /i "%choice%"=="3" goto kaiji

if /i "%choice%"=="4" goto clean

if /i "%choice%"=="Q" goto endd

echo 选择无效,请重新输入

echo.

goto cho

二、ifelse…条件语句

IF [NOT] ERRORLEVEL number command

IF [NOT] string1==string2 command

IF [NOT] EXIST filename command

增强用法:IF [/i] string1 compare-op string2 command

例:

IF EXIST filename (

       del filename

) ELSE (

       echo filename missing

)也可写成:if exist filename (del filename) else (echo filename missing)

但这种写法不适合命令太多或嵌套命令的使用。

三、循环语句

1、指定次数循环

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

组合命令:

FOR /L %variable IN (start,step,end) DO (

Command1

Command2

……

2、对某集合执行循环语句。

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

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

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

同前面一样,command可以用括号来组合:

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

Command1

Command2

……

commandn

)

3、条件循环          利用goto语句和条件判断,dos可以实现条件循环

@echo off

set var=0

rem ************循环开始了

:continue

set /a var+=1

echo %var%此循环

if %var% lss 100 goto continue

rem ************循环结束了

echo 循环执行完毕

pause

四、子程序

在批处理程序中可以调用外部可运行程序,比如exe程序,也可调用其他批处理程序,这些也可以看作子程序,但是不够方便,如果被调用的程序很多,就显得不够简明了,很繁琐,windowsXP中,批处理可以调用本程序中的一个程序段,相当于子程序,这些子程序一般放在主程序后面。

子程序调用格式:

CALL :label arguments

子程序语法:

:label

command1

command2

...

commandn

goto :eof

传至子程序的参数在call语句中指定,在子程序中用%1%2%9的形式调用,而子程序返回主程序的数据只需在调用结束后直接引用就可以了,当然也可以指定返回变量。

1

@echo off

call :sub return 你好

echo 子程序返回值:%return%

pause

:sub

set %1=%2

goto :eof

运行结果:你好

子程序例2:设计一个求多个整数相加的子程序

@echo off

set sum=0

call :sub sum 10 20 35

echo 数据求和结果:%sum%

pause

:sub

rem 参数1为返回变量名称

set /a %1=%1+%2

shift /2

if not "%2"=="" goto sub

goto :eof

运行结果:65

五、用ftp命令实现自动下载        ftp是常用的下载工具,ftp界面中有40多个常用命令。 

六、用7-ZIP实现命令行压缩和解压功能   详细情况见7-zip帮助文件

七、调用VBScript程序   用法:CScript 脚本名称 [脚本选项...] [脚本参数...]

八、将批处理转化为可执行文件:由于批处理文件是一种文本文件,任何人都可以对其进行随便编辑,所以如果将其转换成.com格式的可执行文件,不仅执行效率会大大提高,而且不会破坏原来的功能,更能将优先级提到最高。Bat2Com就可以完成这个转换工作。

小知识:在DOS环境下,可执行文件的优先级由高到低依次为.com>.exe>.bat>.cmd

九、时间延迟:执行一条命令后延迟一段时间再进行下一条命令。

1、利用ping命令延时

   @echo off

   echo 延时前!

   ping /n 3 127.0.0.1 >nul

   echo 延时后!

   pause 

解说:用到了ping命令的“/n”参数,表示要发送多少次请求到指定的ip。本例中要发送3次请求到本机的ip127.0.0.1)。127.0.0.1可简写为127.1

2、利用for命令延时

   @echo off

   echo 延时前!

   for /l %%i in (1,1,5000) do echo %%i>nul

   echo 延时后!

   pause

十、模拟进度条

@echo off

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

cls

echo.

echo   程序正在初始化. . . 

echo.

echo   ┌──────────────────────────────────────┐

set/p=   

for /L %%i in (1 1 38) do set /p a=nul

echo 100%%

echo   └──────────────────────────────────────┘

pause

解说:“set /p =  ”的意思是:只显示提示信息“■”且不换行,也不需手工输入任何信息,这样可以使每个“■”在同一行逐个输出。“ping /n 1 127.1>nul”是输出每个“■”的时间间隔,即每隔多少时间输出一个“■”。

你可能感兴趣的:(批处理命令入门)