一、什么是批处理 批处理的本质,是一堆DOS命令按一定顺序排列而形成的集合。 批处理,也称为批处理脚本,英文译为BATCH,批处理文件后缀BAT就取的前三个字母。它的构成没有固定格式,只要遵守以下这条就ok了:每一行可视为一个命令,每个命令里可 以含多条子命令,从第一行开始执行,直到最后一行结束,它运行的平台是DOS。批处理有一个很鲜明的特点:使用方便、灵活,功能强大,自动化程度高。 二、批处理常用命令 1、@ 它的作用是隐藏它后面这一行的命令本身。 2、echo 中文为“反馈”、“回显”的意思。它其实是一个开关命令,就是说它只有两种状态:打开和关闭。于是就有了echo on和echo off两个命令了。直接执行echo命令将显示当前echo 命令状态(off或on)执行echo off将关闭回显,它后面的所有命令都不显示命令本身,只显示执行后的结果。 echo. :输出空行,即相当于输入一个回车;值得注意的是命令行中的“.”要紧跟在ECHO后面中间不能有空格,否则“.”将被当作提示信息输出到屏幕。另外“.”可以用, :;”/[\]+等任一符号替代。 3、start 命令 调用外部程序,所有的DOS命令和命令行程序都可以由start命令来调用。 start /wait : start命令会启动软件的安装程序,而/wait命令会让系统在处理批处理文件中的下一条命令之前等待前一个软件安装完成。使用/wait命令是很重要的,只有这 样才不会让批处理文件中的所有命令一下子全部执行起来,那样将会导致同一时间运行多个软件的安装程序。 如:几秒钟让你的内存耗尽(例一): @Echo off Start cmd::(开启CMD程序) %0 4、pause 中文为“暂停”的意思。它的作用,是让当前程序进程暂停一下,并显示一行信息:请按任意键继续. . .。我们可以加 >nul把这个信息隐藏。 5、:和goto 为什么要把这两个命令联合起来介绍?因为它们是分不开的,无论少了哪个或多了哪个都会出错。goto是个跳转命令,:是一个标签。当程序运行到goto时,将自动跳转到:定义的 部分去执行了。如:为你的硬盘添加背景图片(例二) @echo off echo 输入 1 后按回车键, 添加盘符背景图 echo 输入 2 后按回车键, 清除盘符背景图 @set /p start=请选择 (1、2、3、=退出) 后按回车键: if "%start%"=="1" goto 1 if "%start%"=="2" goto 2 :1 set /p sky=请选择添加文件夹背景图位置: set /p cn=设置选择背景图的名字: echo [ExtShellFolderViews] >%sky%:\desktop.ini echo {BE098140-A513-11D0-A3A4-00C04FD706EC}={BE098140-A513-11D0-A3A4-00C04FD706EC} >>%sky%:\desktop.ini echo [{BE098140-A513-11D0-A3A4-00C04FD706EC}] >>%sky%:\desktop.ini echo Attributes=1 >>%sky%:\desktop.ini echo IconArea_Image=%sky%:\%cn%.jpg >>%sky%:\desktop.ini echo [.ShellClassInfo] >>%sky%:\desktop.ini echo ConfirmFileOp=0 >>%sky%:\desktop.ini start %sky%:\ attrib %sky%:\desktop.ini +r +s +h exit :2 set /p sky=请输入要删除背景图的位置: del %sky%:\desktop.ini /f/q/a echo 已经成功删除 echo 按任意键退出 pause exit 6、% 这个百分号严格来说是算不上命令的,它只是批处理中的参数。 %[1-9]表示参数,参数是指在运行批处理文件时在文件名后加的以空格(或者Tab)分隔的字符串。变量可以从%0到%9,%0有两个意义 一是表示批处理命令本身,还一个就是无 限循环,其它参数字符串用%1到%9顺序表示。 例子: %0表示批处理命令本身 新建一个1.BAT文件。输入以下内容: @echo off del %0 pause 大家看效果,1.BAT已经被删除了。 还一个意思无限循环!如例一。无限执行start cmd 这条命令! %1、%2……的意思: 例:@echo off echo %1 %2 %3 %4 echo %1 echo %2 echo %3 echo %4 进入CMD,输入cd c:\ 然后输入 test.bat 我是第一个参数 我是第二个参数 我是第三个参数 我是第四个参数 注意中间的空额,我们会看到这样的结果: 我是第一个参数 我是第二个参数 我是第三个参数 我是第四个参数 我是第一个参数 我是第二个参数 我是第三个参数 我是第四个参数 对比下代码,%1就是我是第一个参数 %2就是我是第二个参数 怎么样理解了吧! 还有一个%* 他是什么呢?他的作用不是很大,只是返回参数而已,不过他是一次返回全部参数的值,不用在输入%1 %2来确定一个个的 例子 @echo off echo %* 同样保存为test.bat 放到C盘 进入CMD,输入cd c:\ 然后输入 test.bat 我是第一个参数 我是第二个参数 我是第三个参数 我是第四个参数 可以看到他一次把全部参数都显示出来了 现在说自定义变量 故名思意,自定义变量就是由我们来给他赋予值的变量;要使用自定义变量就得使用set命令了,看例子. @echo off set var=我是值 echo %var% pause 保存为BAT执行,我们会看到CMD里返回一个 "我是值" var为变量名,=号右边的是要给变量的值 这就是最简单的一种设置变量的方法了 如果我们想让用户手工输入变量的值,而不是在代码里指定,可以用用set命令的/p参数 例子: @echo off set /p var=请输入变量的值 echo %var% pause var变量名 =号右边的是提示语,不是变量的值。变量的值由我们运行后自己用键盘输入! 7、if 总的来说,if命令是一个表示判断的命令,根据得出的每一个结果,它都可以对应一个相应的操作。 (1)、输入判断 if "参数" == "字符串" 待执行的命令 参数如果等于指定的字符串,则条件成立,运行命令,否则运行下一句。(注意是两个等号) 如if "%1"=="a" format a: 再如例二。 (2)、存在判断。例: if exist C:\Progra~1\Tencent\AD\*.gif del C:\Progra~1\Tencent\AD\*.gif 如果存在那些gif文件,就删除这些文件。注意,这里的条件判断是判断存在的,当然也可以判断不存在的,例如下面这句“如果不存在那些gif文件则退出脚本”:if not exist C:\Progra~1\Tencent\AD\*.gif exit。只是多一个not来表示否定而已。 (3)、结果判断。例: masm %1.asm if errorlevel 1 pause & edit %1.asm link %1.obj 这种用法是先判断前一个命令执行后的返回码(也叫错误码,DOS程序在运行完后都有返回码),如果和定义的错误码符合(这里定义的错误码为1),则执行相应的操作(这里相 应的操作为pause & edit %1.asm部分)。 8、call 在批处理脚本中,call命令用来从一个批处理脚本中调用另一个批处理脚本。 9、find 这是一个搜索命令,用来在文件中搜索特定字符串,通常也作为条件判断的铺垫程序。这个命令单独使用的情况在批处理中是比较少见的,因为没什么实际意义。 10、for 循环命令,只要条件符合,它将多次执行同一命令。 语法:FOR %%variable IN (set) DO command [command-parameters] 对一组文件中的每一个文件执行某个特定命令。 %%variable 指定一个单一字母可替换的参数。 (set) 指定一个或一组文件。可以使用通配符。 command 指定对每个文件执行的命令。 command-parameters 为特定命令指定参数或命令行开关。 例如一个批处理文件中有一行: for %%c in (*.bat *.txt) do type %%c 则该命令行会显示当前目录下所有以bat和txt为扩展名的文件的内容。 FOR %%a IN ( C: D: E: F: G: H: ) DO ATTRIB -R -H -S %%a\SXS.EXE & DEL /F /Q /A -R -H -S %%a\SXS.EXE & ATTRIB -R -H -S %%a\AUTORUN.INF & DEL /F /Q /A -R -H -S %%a\AUTORUN.INF 该命令删除根目录下所有SXS.EXE和AUTORUN.INF文件. 在批处理文件中使用 FOR 命令时,指定变量请使用 %%variable 而不要用 %variable。直接在命令行则只需要一个%号。变量名称是区分大小写的,所以 %i 不同于 %I 11、SET 显示、设置或删除 cmd.exe 环境变量。 要显示当前环境变量,键入不带参数的 SET。 /P 命令行开关允许将变量数值设成用户输入的一行输入。读取输入行之前,显示指定的 promptString。promptString 可以是空的。 /A 命令行开关指定等号右边的字符串为被评估的数字表达式。该表达式评估器很简单并以递减的优先权顺序操作。 如: set /p start=请选择 (1、2、3) 后按回车键: if "%start%"=="1" goto 1 if "%start%"=="2" goto 2 if "%start%"=="3" goto 3 管道命令: 1、| 它的作用,就是把前一命令执行的结果传到后一命令去处理。 如:help | more 回车后会发现显示满一屏幕后就自动暂停,等候继续显示其他信息。当按写回车时,变成一个一个的出现;按下空格键时一屏幕一屏幕显示,直到全部显示完为止;按其他键自动 停止返回DOS。 这里结合了管道命令|和DOS命令more来共同达到目的的。 2、>、>> 这两个命令的效果从本质上来说都是一样的,他们都是输出重定向命令,说的通俗一点,就是把前面命令的输出写入到一个文件中。这两个命令的唯一区别是,>会清除掉原有文件 中的内容后把新的内容写入原文件,而>>只会另起一行追加新的内容到原文件中,而不会改动其中的原有内容。 3、< <,输入重定向命令,从文件中读入命令输入,而不是从键盘中读入。 例:sort < list.txt > alphlist.txt sort 命令按字母顺序排列文本文件或命令的输出。在此范例中,sort 命令对 List.txt 文件的行进行排序并显示结果,但不更改文件。并将结果存到 Alphlist.txt 文件中。 组合命令: 顾名思义,就是可以把多个命令组合起来当一个命令来执行。这在批处理脚本里是允许的,而且用的非常广泛。它的格式很简单----既然现在已经成了一个文件了,那么这多个命 令就要用这些组合命令连接起来放在同一行----因为批处理认行不认命令数目。 1、& 这可以说是最简单的一个组合命令了,它的作用是用来连接n个DOS命令,并把这些命令按顺序执行,而不管是否有命令执行失败。如:copy a.txt b.txt /y & del a.txt 2、&& 这个命令可以把它前后两个命令组合起来当一个命令来用,与&命令不同之处在于,它在从前往后依次执行被它连接的几个命令时会自动判断是否有某个命令执行出错,一旦发现出 错后将不继续执行后面剩下的命令。这就为我们自动化完成一些任务提供了方便。(当然这个和IF命令差不多,可以自己选择喜欢的方式) 小提示:有些命令是不能同时执行的 如:出道题:把C盘和D盘的文件和文件夹列出到a.txt文件中。 有人说,同时执行两个dir,然后把得到的结果>到a.txt里就ok了嘛: 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 当然这里还可以利用&命令:dir c:\ > a.txt & dir d:\ >> a.txt 3、|| 这个命令的用法和&&几乎一样,但作用刚好和它相反:利用这种方法在执行多条命令时,当遇到一个执行正确的命令就退出此命令组合,不再继续执行下面的命令。 题目:查看当前目录下是否有以s开头的exe文件,如果有则退出。例: @echo off dir s*.exe || exit 其实这个例子是有破绽的,如果存在那个exe文件,就退出;如果不存在那个exe文件,也退出!为什么?因为如果不存在那个.exe文件,则前一条命令dir s*.exe执行肯定是不成 功的,所以就继续执行exit,自然就退出了。那么如何解决题目给出的问题呢?看下例: @echo off dir s*.exe || echo Didn''t exist file s*.exe & pause & exit 这样执行的结果,就能达到题目的要求,是否存在s*.exe将出现两种结果。这里加暂停的意思,当然是让你能看到echo输出的内容,否则一闪而过的窗口,echo就白写了。 几个符号: 1、符号(" ") " "符号允许在字符串中包含空格。进入一个特殊的目录可以用如下方法.例: c:\>cd "Program Files" c:\>cd progra~1 c:\>cd pro* 以上方法都可以进入Program Files目录 2、符号(,) ,符号相当于空格。在某些特殊的情况下可以用,来代替空格使用。例: c:\>dir,c:\ 3、符号(;) ;符号当命令相同的时候可以将不同的目标用;隔离开来但执行效果不变。如执行过程中发生错误则只返回错误报告但程序还是会继续执行。例:DIR C:\;D:\;E:\F:\ 以上的命令相当于 DIR C:\ DIR D:\ DIR E:\ DIR F:\ 4、符号“::” 这个符号的作用很简单,它是注释命令,在批处理脚本中和rem命令等效。它后面的内容在执行时不显示,也不起任何作用,因为它只是注释,只是增加了脚本的可读性。 5、符合“^” ^是对特殊符号"<",">","&"的前导字符,在命令中他将以上3个符号的特殊功能去掉,仅仅只把他们当成符号而不使用他们的特殊意义。 比如echo test ^>1.txt 结果则是他没有追加在1.txt里,只是显示了出来 三、利用批处理修改注册表 1、添加值 REG ADD KeyName [/v ValueName | /ve] [/t Type] [/s Separator] [/d Data] [/f] KeyName [\\Machine\]FullKey 远程机器的机器名 - 忽略默认到当前机器。 远程机器上只有 HKLM 和 HKU。 FullKey ROOTKEY\SubKey ROOTKEY [ HKLM | HKCU | HKCR | HKU | HKCC ] SubKey 所选 ROOTKEY 下注册表项的完整名 /v 所选项之下要添加的值名 /ve 为注册表项添加空白值名<无名称> /t REG Key 数据类型 [REG _SZ | REG _MULTI_SZ | REG _DWORD_BIG_ENDIAN | REG _DWORD | REG _BINARY | REG _DWORD_LITTLE_ENDIAN | REG _NONE | REG _EXPAND_SZ ] (reg_dword 四字节数值数据,十六进制值 reg_binary二进制值 reg_sz字符串 reg_multi_sz多字符串 reg_expanda_sz带变量的字符串) 如果忽略,则采用REG _SZ /s 指定一个在REG _MULTI_SZ 数据字符串中 用作分隔符的字符 如果忽略,则将 "\0" 用作分隔符 /d 要分配给添加的注册表 ValueName 的数据 /f 不用提示就强行改写现有注册表项 例如: REG ADD \\ABC\HKLM\Software\MyCo 添加远程机器 ABC 上的一个注册表项 HKLM\Software\MyCo REG ADD HKLM\Software\MyCo /v Data /t REG _BINARY /d fe340ead 添加一个值(名称: Data,类型: REG _BINARY,数据: fe340ead) REG ADD HKLM\Software\MyCo /v MRU /t REG _MULTI_SZ /d fax\0mail 添加一个值(名称: MRU,类型: REG _MUTLI_SZ,数据: fax\0mail\0\0) REG ADD HKLM\Software\MyCo /v Path /t REG _EXPAND_SZ /d %%systemroot%% 添加一个值(名称: Path,类型: REG _EXPAND_SZ,数据: %systemroot%) 注意: 在扩充字符串中使用双百分比符号( %% ) 2、删除值 REG DELETE /v ValueName 删除子项下的特定项。如果未指定项,则将删除子项下的所有项和子项。 /ve 指定只可以删除为空值的项。 /va 删除指定子项下的所有项。使用本参数不能删除指定子项下的子项。 /f 无需请求确认而删除现有的注册表子项或项。 例:要删除注册表项 Timeout 以及其所有子项和值,请键入: REG DELETE HKLM\Software\MyCo\MyApp\Timeout 要删除计算机 ZODIAC 上 HKLM\Software\MyCo 下的注册表值 MTU,请键入: REG DELETE \\ZODIAC\HKLM\Software\MyCo /v MTU Ps:在批处理加入如下内容 1、title 盘符添加背景图 在CMD菜单栏显示“盘符添加背景图”标题 color 0E 设置批处理内容颜色。可以是0A;0B;1C;2D…… 前一位数字表示背景色,后一个字母则为前景。每个数字可以为以下任何值之一: 0 = 黑色 1 = 蓝色 2 = 绿色 3 = 湖蓝色 4 = 红色 5 = 紫色 6 = 黄色 7 = 白色 8 = 灰色 9 = 淡蓝色 A = 淡绿色 B = 淡浅绿色 C = 淡红色 D = 淡紫色 E = 淡黄色 F = 亮白色 如果没有给定任何参数,该命令会将颜色还原到 CMD.EXE 启动时的颜色。 2、dir > con >为输入输出重定向中的一个 输出重定向命令 上面这个命令的意思是将dir的显示结果输出到con设备(显示器) 其实和dir 直接回车后执行的效果是一样的 dir > nul 将dir命令执行的结果输出到nul空设备 即不显示结果(于显示器上) nul是Dos中的一个设备文件名 表示空设备 CON 控制台(键盘/显示器) AUX 第一串行通信口 PRN 第一并行通信口/打印机 COM1 第一串行通信口 LPT1 第一并行通信口/打印机 COM2 第一串行通信口 LPT2 第一并行通信口/打印机 3、mode 设置bat窗口的大小 mode con cols=左右长度 lines=上下长度 Mode con: COLS=41 LINES=18 4、ping /n 6 127.1>nul 在等待5秒后开始运行下面语句 5、Sc config Alerter start= DISABLED 设置你的警报服务为禁止 Sc config PlugPlay start= AUTO 设置即插即用设备服务为自动 6、批处理中显示当前时间日期 echo %date% date /t 都可以显示当前日期 不同之处:echo %date% 这样日期可以显示在批处理的中间 但是date /t 就不可以 系统及局部变量 %SystemDrive% 操作系统所在的分区号。如 C: %HOMEDRIVE% 操作系统所在的分区号。如:C: %SystemRoot% 操作系统根目录。如 C:\WINDOWS %windir% 操作系统根目录。如 C:\WINDOWS %ALLUSERSPROFILE% 所有用户文件夹。如C:\Documents and Settings\All Users %APPDATA% 如:C:\Documents and Settings\用户目录\Application Data %ProgramFiles% 程序文件夹相当于 C:\Program Files %CommonProgramFiles% 相当于 C:\Program Files\Common Files %HOMEPATH% 相当于 \Documents and Settings\用户目录 %USERPROFILE% 相当于 C:\Documents and Settings\用户目录 %UserProfile% 当前用户文件夹 C:\Documents and Settings\Administrator 1%temp% 临时文件夹C:\Documents and Settings\Administrator\Local Settings\Temp 2%SystemRoot%\TEMP 临时文件夹 C:\WINDOWS\Temp 桌面 %USERPROFILE%\桌面 右键菜单“发送到” %USERPROFILE%\SendTo 收藏夹 %USERPROFILE%\Favorites 快速启动 %APPDATA%\Microsoft\Internet Explorer\Quick Launch 「开始」菜单 %USERPROFILE%\「开始」菜单 %ALLUSERSPROFILE% 返回所有“用户配置文件”的位置。 (C:\Documents and Settings\All Users) %APPDATA% 返回默认情况下应用程序存储数据的位置。 (C:\Documents and Settings\Administrator\Application Data) %CD% 返回当前目录字符串。 %CMDCMDLINE% 返回用来启动当前的 Cmd.exe 的准确命令行。 ("C:\WINDOWS\system32\CMD.exe") %CMDEXTVERSION% 返回当前的“命令处理程序扩展”的版本号。 %COMPUTERNAME% 返回计算机的名称。 %COMSPEC% 返回命令行解释器可执行程序的准确路径。 (C:\WINDOWS\system32\cmd.exe) %DATE% 返回当前日期。使用与 date /t 命令相同的格式。 %ERRORLEVEL% 返回最近使用过的命令的错误代码。通常用非零值表示错误。 %HOMEDRIVE% 返回连接到用户主目录的本地工作站驱动器号。基于主目录值的设置。用户主目录是在“本地用户和组”中指定的。 %HOMEPATH% 返回用户主目录的完整路径。基于主目录值的设置。用户主目录是在“本地用户和组”中指定的。 (\Documents and Settings\Administrator) %HOMESHARE% 返回用户的共享主目录的网络路径。基于主目录值的设置。用户主目录是在“本地用户和组”中指定的。 %LOGONSEVER% 返回验证当前登录会话的域控制器的名称。 %NUMBER_OF_PROCESSORS% 指定安装在计算机上的处理器的数目。 %OS% 返回操作系统的名称。Windows 2000 将操作系统显示为 Windows_NT。 (Windows_NT) %PATH% 指定可执行文件的搜索路径。 C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\Program Files\ATI Technologies\ATI Control Panel) %PATHEXT% 返回操作系统认为可执行的文件扩展名的列表。 (.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH) %PROCESSOR_ARCHITECTURE% 返回处理器的芯片体系结构。值: x86,IA64。 %PROCESSOR_IDENTFIER% 返回处理器说明。 %PROCESSOR_LEVEL% 返回计算机上安装的处理器的型号。 %PROCESSOR_LEVEL% 返回处理器的版本号 %PROMPT% 返回当前解释程序的命令提示符设置。由 Cmd.exe 生成。 ($P$G) %RANDOM% 返回 0 到 32767 之间的任意十进制数字。由 Cmd.exe 生成。 %TEMP% and %TMP% 系统和用户 返回对当前登录用户可用的应用程序所使用的默认临时目录。有些应用程序需要 TEMP,而其它应用程序则需要 TMP。 (C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp) %TIME% 返回当前时间。使用与 time /t 命令相同的格式 (12:20:05.89) %USERDOMAIN% 返回包含用户帐户的域的名称。 %USERNAME% 返回当前登录的用户的名称。 %UserPrefix% 返回当前用户的配置文件的位置。
|