2023年7月26日发(作者:)
BAT批处理脚本教程(⼀)批处理定义:顾名思义,批处理⽂件是将⼀系列命令按⼀定的顺序集合为⼀个可执⾏的⽂本⽂件,其扩展名为BAT或者CMD。这些命令统称批处理命令。⼩知识:可以在键盘上按下Ctrl+C组合键来强⾏终⽌⼀个批处理的执⾏过程。了解了⼤概意思后,我们正式开始学习.先看⼀个简单的例⼦!123@echo offecho "HelloWorld!"pause把上⾯的3条命令保存为⽂件或者然后执⾏,他就会在屏幕上显⽰以下⼆⾏话:HelloWorld!请按任意键继续. . .这就是⼀个简单批处理⽂件了,这个批处理⽂件⼀共就⽤了2条命令 "echo" 和"pause" 还有⼀个特殊符号"@"从上⾯这个简单的批处理中,我们可以发现其实批处理就是运⽤⼀些含有特殊意义的符号和⼀些完成指定功能的命令组合⽽成,那么在批处理中有多少这样的特殊符号和功能命令呢?我们现在就来仔细了解⼀下⼀些最常⽤的!批处理的常见命令(未列举的命令还⽐较多,请查阅帮助信息)1、REM 和 ::2、ECHO 和 @3、PAUSE4、ERRORLEVEL5、TITLE6、COLOR7、mode 配置系统设备8、GOTO 和 :9、FIND10、START11、assoc 和 ftype12、pushd 和 popd13、CALL14、shift15、IF16、setlocal 与 变量延迟17、ATTRIB 显⽰或更改⽂件属性介绍命令1、REM 和 ::REM为注释命令,⼀般⽤来给程序加上注解,该命令后的内容不被执⾏,但能回显。其次, :: 也可以起到rem 的注释作⽤, ⽽且更简洁有效; 但有两点需要注意:第⼀, 任何以冒号:开头的字符⾏, 在批处理中都被视作标号, ⽽直接忽略其后的所有内容。有效标号:冒号后紧跟⼀个以字母数字开头的字符串,goto语句可以识别。⽆效标号:冒号后紧跟⼀个⾮字母数字的⼀个特殊符号,goto⽆法识别的标号,可以起到注释作⽤,所以 :: 常被⽤作注释符号,其实 :+ 也可起注释作⽤。第 ⼆, 与rem 不同的是, ::后的字符⾏在执⾏时不会回显, ⽆论是否⽤echo on打开命令⾏回显状态, 因为命令解释器不认为他是⼀个有效的命令⾏, 就此点来看, rem 在某些场合下将⽐ :: 更为适⽤; 另外, rem 可以⽤于 ⽂件中。⾏内注释格式:%注释内容% (不常⽤,慎⽤)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管道转向可以作为其它命令的输⼊,⽐如ime即相当于在TIME命令执⾏后给出⼀个回车。所以执⾏时系统会在显⽰当前时间后,⾃动返回到DOS提⽰符状态(6)答复命令中的提问
格式:ECHO 答复语|命令⽂件名上述格式可以⽤于简化⼀些需要⼈机对话的命令(如:CHKDSK/F;FORMAT Drive:;del *.*)的操作,它是通过DOS管道命令把ECHO命令输出的预置答复语作为⼈机对话命令的输⼊。下⾯的例⼦就相当于在调⽤的命令出现⼈机对话时输⼊“Y”回车:C:>ECHO Y|CHKDSK/FC:>ECHO Y|DEL A :*.*(7)建⽴新⽂件或增加⽂件内容
格式:ECHO ⽂件内容>⽂件名ECHO ⽂件内容>>⽂件名例如:C:>ECHO @ECHO OFF>建⽴⾃动批处理⽂件C:>ECHO C:CPAVBOOTSAFE>>向⾃动批处理⽂件中追加内容C:>TYPE 显⽰该⾃动批处理⽂件@ECHO OFFC:CPAVBOOTSAFE(8)向打印机输出打印内容或打印控制码
格式:ECHO 打印机控制码>;PRNECHO 打印内容>;PRN下⾯的例⼦是向M-1724打印机输⼊打印控制码。<Alt>156是按住Alt键在⼩键盘键⼊156,类似情况依此类推:C:>ECHO +156+42+116>;PRN(输⼊下划线命令FS*t)C:>ECHO [email=+155@]+155@>;PRN[/email](输⼊初始化命令ESC@)C:>ECHO.>;PRN(换⾏)(9)使喇叭鸣响
C:>ECHO ^G“^G”是在dos窗⼝中⽤Ctrl+G或Alt+007输⼊,输⼊多个^G可以产⽣多声鸣响。使⽤⽅法是直接将其加⼊批处理⽂件中或做成批处理⽂件调⽤。这⾥的“^G”属于特殊符号的使⽤,请看本⽂后⾯的章节3、PAUSEPAUSE,玩游戏的⼈都知道,暂停的意思在这⾥就是停⽌系统命令的执⾏并显⽰下⾯的内容。例:PAUSE运⾏显⽰:请按任意键继续. . .要显⽰其他提⽰语,可以这样⽤:Echo 其他提⽰语 & pause > nul4、errorlevel程序返回码echo %errorlevel%每个命令运⾏结束,可以⽤这个命令⾏格式查看返回码⽤于判断刚才的命令是否执⾏成功默认值为0,⼀般命令执⾏出错会设 errorlevel 为15、title设置cmd窗⼝的标题title 新标题 #可以看到cmd窗⼝的标题栏变了6、COLOR设置默认的控制台前景和背景颜⾊。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" 在亮⽩⾊上产⽣亮红⾊7、mode 配置系统设备配置系统设备。串⾏⼝: 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] [/STATUS]打印重定向: MODE LPTn[:]=COMm[:]选定代码页: MODE CON[:] CP SELECT=yyy代码页状态: MODE CON[:] CP [/STATUS]显⽰模式: MODE CON[:] [COLS=c] [LINES=n]击键率: MODE CON[:] [RATE=r DELAY=d]例:mode con cols=113 lines=15 & color 9f此命令设置DOS窗⼝⼤⼩:15⾏,113列8、GOTO 和 :GOTO会点编程的朋友就会知道这是跳转的意思。在批处理中允许以“:XXX”来构建⼀个标号,然后⽤GOTO XXX跳转到标号:XXX处,然后执⾏标号后的命令。例:if {%1}=={} goto noparmsif "%2"=="" goto noparms标签的名字可以随便起,但是最好是有意义的字符串啦,前加个冒号⽤来表⽰这个字符串是标签,goto命令就是根据这个冒号(:)来寻找下⼀步跳到到那⾥。最好有⼀些说明这样你别⼈看起来才会理解你的意图啊。例:123456@echo off:startset /a var+=1echo %var%if %var% leq 3 GOTO startpause运⾏显⽰:12349、find在⽂件中搜索字符串。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命令⾃带的提⽰语(⽂件名提⽰)例:123456@echo offecho 111 >o 222 >>d "111" se运⾏显⽰如下:---------- 111请按任意键继续. . .例:123456@echo offecho 111 >o 222 >>e |find "111"del se运⾏显⽰如下:111请按任意键继续. . .10、start 命令批处理中调⽤外部程序的命令(该外部程序在新窗⼝中运⾏,批处理程序继续往下执⾏,不理会外部程序的运⾏状况),如果直接运⾏外部程序则必须等外部程序完成后才继续执⾏剩下的指令例:start explorer d:调⽤图形界⾯打开D盘11、assoc 和 ftype⽂件关联assoc 设置'⽂件扩展名'关联,关联到'⽂件类型'ftype 设置'⽂件类型'关联,关联到'执⾏程序和参数'当你双击⼀个.txt⽂件时,windows并不是根据.txt直接判断⽤ 打开⽽是先判断.txt属于 txtfile '⽂件类型'再调⽤ txtfile 关联的命令⾏ txtfile=%SystemRoot% %1可以在"⽂件夹选项"→"⽂件类型"⾥修改这2种关联assoc #显⽰所有'⽂件扩展名'关联assoc .txt #显⽰.txt代表的'⽂件类型',结果显⽰ .txt=txtfileassoc .doc #显⽰.doc代表的'⽂件类型',结果显⽰ .doc=nt.8assoc .exe #显⽰.exe代表的'⽂件类型',结果显⽰ .exe=exefileftype #显⽰所有'⽂件类型'关联ftype exefile #显⽰exefile类型关联的命令⾏,结果显⽰ exefile="%1" %*
assoc .txt=nt.8设置.txt为word类型的⽂档,可以看到.txt⽂件的图标都变了assoc .txt=txtfile恢复.txt的正确关联ftype exefile="%1" %*恢复 exefile 的正确关联如果该关联已经被破坏,可以运⾏ ,再输⼊这条命令12、pushd 和 popd切换当前⽬录123456@echo offc: & cd & md mp3 #在 C: 建⽴ mp3 ⽂件夹md d:mp4 #在 D: 建⽴ mp4 ⽂件夹cd /d d:mp4 #更改当前⽬录为 d:mp4pushd c:mp3 #保存当前⽬录,并切换当前⽬录为 c:mp3popd #恢复当前⽬录为刚才保存的 d:mp4⼀般⽤处不⼤,在当前⽬录名不确定时,会有点帮助。(dos编程中很有⽤)13、CALLCALL命令可以在批处理执⾏过程中调⽤另⼀个批处理,当另⼀个批处理执⾏完后,再继续执⾏原来的批处理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环境变量的⽬录,并将PATH:1 - 在列在 PATH 环境变量中的⽬录⾥查找 %1,并扩展到找到的第⼀个⽂件的驱动器号和路径。%~ftza1 - 将 %1 扩展到类似 DIR 的输出⾏。在上⾯的例⼦中,%1 和 PATH 可以被其他有效数值替换。%~ 语法被⼀个有效参数号码终⽌。%~ 修定符不能跟 %*使⽤注意:参数扩充时不理会参数所代表的⽂件是否真实存在,均以当前⽬录进⾏扩展要理解上⾯的知识,下⾯的例⼦很关键。例:@echo offEcho 产⽣⼀个临时⽂件 > 下⾏先保存当前⽬录,再将c:windows设为当前⽬录pushd c:windowsCall :sub 下⾏恢复前次的当前⽬录PopdCall :sub seDel t:subEcho 删除引号: %~1Echo 扩充到路径: %~f1Echo 扩充到⼀个驱动器号: %~d1Echo 扩充到⼀个路径: %~p1Echo 扩充到⼀个⽂件名: %~n1Echo 扩充到⼀个⽂件扩展名: %~x1Echo 扩充的路径指含有短名: %~s1Echo 扩充到⽂件属性: %~a1Echo 扩充到⽂件的⽇期/时间: %~t1Echo 扩充到⽂件的⼤⼩: %~z1Echo 扩展到驱动器号和路径:%~dp61718192627Echo 扩展到⽂件名和扩展名:%~nx1Echo 扩展到类似 DIR 的输出⾏:%~ :eof例:set aa=123456set cmdstr=echo %aa%call %cmdstr%pause本例中如果不⽤call,⽽直接运⾏%cmdstr%,将显⽰结果%aa%,⽽不是12345614、shift更改批处理⽂件中可替换参数的位置。SHIFT [/n]如果命令扩展名被启⽤,SHIFT 命令⽀持/n 命令⾏开关;该命令⾏开关告诉命令从第 n 个参数开始移位;n 介于零和⼋之间。例如:SHIFT /2会将 %3 移位到 %2,将 %4 移位到 %3,等等;并且不影响 %0 和 %1。15、IFIF 条件判断语句,语法格式如下:IF [NOT] ERRORLEVEL number commandIF [NOT] string1==string2 commandIF [NOT] EXIST filename command(1) IF [NOT] ERRORLEVEL number commandIF ERRORLEVEL这个句⼦必须放在某⼀个命令的后⾯,执⾏命令后由IF ERRORLEVEL 来判断命令的返回值。Number的数字取值范围0~255,判断时值的排列顺序应该由⼤到⼩。返回的值⼤于等于指定的值时,条件成⽴例:@echo offdir c:rem退出代码为>=1就跳⾄标题1处执⾏,>=0就跳⾄标题0处执⾏IF ERRORLEVEL 1 goto 1IF ERRORLEVEL 0 goto 0Rem 上⾯的两⾏不可交换位置,否则失败了也显⽰成功。:0echo 命令执⾏成功!Rem 程序执⾏完毕跳⾄标题exit处退出goto exit:1echo 命令执⾏失败!Rem 程序执⾏完毕跳⾄标题exit处退出goto exit:exitpause运⾏显⽰:命令执⾏成功!(2) IF [NOT] string1==string2 commandstring1和string2都为字符的数据,英⽂内字符的⼤⼩写将看作不同,这个条件中的等于号必须是两个(绝对相等的意思)条件相等后即执⾏后⾯的command检测当前变量的值做出判断,为了防⽌字符串中含有空格,可⽤以下格式if [NOT] {string1}=={string2} commandif [NOT] [string1]==[string2] commandif [NOT] "string1"=="string2" command这种写法实际上将括号或引号当成字符串的⼀部分了,只要等号左右两边⼀致就⾏了,⽐如下⾯的写法就不⾏:if {string1}==[string2] command(3) IF [NOT] EXIST filename commandEXIST filename为⽂件或⽬录存在的意思echo offIF EXIST echo ⽂件存在!IF not EXIST echo ⽂件不存在!这个批处理⼤家可以放在C盘和D盘分别执⾏,看看效果16、setlocal 与 变量延迟要想进阶,变量延迟是必过的⼀关!所以这⼀部分希望你能认真看。为了更好的说明问题,我们先引⼊⼀个例⼦。例1:1234@echo offset a=4set a=5 & echo %a%pause结果:4解说:为什么是4⽽不是5呢?在echo之前明明已经把变量a的值改成5了?让我们先了解⼀下批处理运⾏命令的机制:批 处理读取命令时是按⾏读取的(另外例如for命令等,其后⽤⼀对圆括号闭合的所有语句也当作⼀⾏),在处理之前要完成必要的预处理⼯作,这其中就包括对该 ⾏命令中的变量赋值。我们现在分析⼀下例1,批处理在运⾏到这句“set a=5 & echo %a%”之前,先把这⼀句整句读取并做了预处理——对变量a赋了值,那么%a%当然就是4了!(没有为什么,批处理就是这样做的。)⽽为了能够感知环境变量的动态变化,批处理设计了变量延迟。简单来说,在读取了⼀条完整的语句之后,不⽴即对该⾏的变量赋值,⽽会在某个单条语句执⾏之前再进⾏赋值,也就是说“延迟”了对变量的赋值。那么如何开启变量延迟呢?变量延迟⼜需要注意什么呢?举个例⼦说明⼀下:例2:12345@echo offsetlocal enabledelayedexpansionset a=4set 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:1234567@echo offsetlocal enabledelayedexpansionfor /l %%i in (1,1,5) do (set a=%%iecho !a!)pause结果:12345解说:本例开启了变量延迟并⽤“!!”将变量扩起来,因此得到我们预期的结果。如果不⽤变量延迟会出现什么结果呢?结果是这样的:ECHO 处于关闭状态。ECHO 处于关闭状态。ECHO 处于关闭状态。ECHO 处于关闭状态。ECHO 处于关闭状态。即没有感知到for语句中的动态变化。提⽰:在没有开启变量延迟的情况下,某条命令⾏中的变量改变,必须到下⼀条命令才能体现。这⼀点也可以加以利⽤,看例⼦。例:交换两个变量的值,且不⽤中间变量@echo off::⽬的:交换两个变量的值,但是不使⽤临时变量set var1=abcset var2=123echo 交换前: var1=%var1% var2=%var2%set var1=%var2%& set var2=%var1%echo 交换后: var1=%var1% var2=%var2%pause17、ATTRIB 显⽰或更改⽂件属性ATTRIB [+R|-R] [+A|-A] [+S|-S] [+H|-H] [[drive:] [path] filename] [/S [/D]]+ 设置属性。- 清除属性。R 只读⽂件属性。A 存档⽂件属性。S 系统⽂件属性。H 隐藏⽂件属性。[drive:][path][filename]指定要处理的⽂件属性。/S 处理当前⽂件夹及其⼦⽂件夹中的匹配⽂件。/D 也处理⽂件夹。例:md autorunattrib +a +s +h autorun上⾯的命令将建⽴⽂件夹autorun,然后将其设为存档、系统、隐藏属性
发布者:admin,转转请注明出处:http://www.yc00.com/news/1690362507a337981.html
评论列表(0条)