批处理教程
我最近根据网络搜集与自己的整理形成以下的文章,现与大家共享:
第一节 常用批处理内部命令简介
批处理本质:是一堆DOS命令按一定顺序排列而形成的集合。批处理的作用就是自动的连续执行多条命令,批处理,也称为批处理脚本,英文译为BATCH。批处理有一个很鲜明的特点:使用方便、灵活,功能强大,自动化程度高。扩展名是bat(在nt/2000/xp/2003下也可以是cmd)的文件就是批处理文件。一个良好的习惯是在硬盘上建立一个bat或者batch目录(例如C:/BATCH),然后将所有你编写的批处理文件放到该目录中。
首先,批处理文件是一个文本文件,文件的每一行都是一条DOS命令。
其次,批处理文件是一种简单的程序,通过(if)和制语句(goto)来控制命令运行的流程。
第三,编写好的批处理文件都相当于一个DOS的外部命令,可以在任何位置调用运行。
第四,在DOS和Win9x/Me系统下,C:/AUTOEXEC.BAT是启动计算机自动运行的。
介绍命令
1、REM和 :: REM为注释命令,可以回显,::不回显,简洁有效亦可加快运行速度。第一、任何以冒号开头的字符行,在批处理中都被视作标号,而直接忽略其后的所有内容。
有效标号:冒号后紧跟一个以字母数字开头的字符串,goto语句可以识别。
无效标号:冒号后紧跟一个非字母数字的一个特殊符号,goto无法识别的标号,可以起到注释作用,所以”::”常被用作注释符号,其实:+也可起注释作用。
第二、rem在某些场合下将比::更为适用;另外, rem 可以用于config.sys 文件中。
2、ECHO 和 @
@Echo off
Echo hello
Pause
运行显示:hello
3、PAUSE Echo 其他提示语 & pause > nul(Echo 其他提示语 & pause >>nul效果一样)
或者写成以下形式其功能也一样(两行):
Echo 其他提示语
pause >(>>) nul
4、errorlevel
程序返回码echo %errorlevel%命令行格式查看返回码判断命令是否成,成功返回“0”
5、title 设置cmd窗口的标题 : title 新标题
6、COLOR 设置默认的控制台前景和背景颜色。
COLOR [attr] 第一个为背景,第二个则为前景。
7、mode 配置系统设备 help mode >a.txt
8、GOTO 和 :
if {%1}=={} goto noparms;if "%2"=="" goto noparms
@echo off
:start
set /a var+=1
echo %var%
if %var% leq 3 GOTO start
pause
9、find在文件中搜索字符串。如果没有指定路径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 #显示文件行数
10、start 命令:批处理中调用外部程序的命令;如果直接运行外部程序则必须等外部程序完成后才继续执行剩下的指令 start explorer d:/ 调用图形界面打开D盘(cd d:/)
11、assoc 和 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 ,再输入这条命令
12、pushd 和 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
pause13、CALL
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
14、shift 更改批处理文件中可替换参数的位置。
SHIFT [/n]:命令从第 n 个参数开始移位;n 介于零和八之间。例如:
SHIFT /2会将 %3 移位到 %2,将 %4 移位到 %3,等等;并且不影响 %0 和 %1。
15、IF
(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
string1和string2都为字符的数据。(绝对相等的意思)条件相等后即执行后面的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 文件不存在!
16、setlocal 与 变量延迟 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
>& 将一个句柄的输出写入到另一个句柄的输入中;<& 从一个句柄读取输入并将其写入到另一个句柄输出中。常用句柄: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可被>、>>重定向,而stderr在DOS下不可直接重定向,只有通过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~1;cd 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 执行的命令参数:FOR有4个参数 /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中的内容对比一下,我们会发现第1、2、5行的引号都消失了,这就是删除引号~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% 系统 返回 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 "%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位为数值。31个1换成十进制为2147483647,所以DOS计算的有效值范围是-2147483647至2147483647,超出该数值范围时计算出错。
运行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 注意引号
思考题:求2的n次方
@echo off
set /p n=请输入2的几次方:
set /a num=1^<^
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种执行状态:
0 文件复制没有错误。
1、if errorlevel 2 echo;2、用户按 CTRL+C 终止了 xcopy;3、出现了初始化错误。没有足够的内存或磁盘空间或命令行上输入了无效的驱动器名称或语法;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
二、if…else…条件语句
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次请求到本机的ip,(127.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=■
echo 100%%
echo └──────────────────────────────────────┘
pause
解说:“set /p = ■