以前一直想学点脚本却没学,看了几个命令却不知道干什么好,上周为项目构建写几个帮助脚本后,体会到脚本在自动化方面很重要,把教训和脚本的学习记录下:
附件有完整脚本和帮助文档。
main.bat
@echo off rem 先说使用批处理要注意的几点: rem 1、尽量不要将批处理要操作的文件放在不同的盘符下,所有要处理的文件最好放在同一个目录下; rem 2、文件/夹名最好不要空格,因为批处理的命令参数一般是用空格分隔的,有空格的话,用文件名做参数容易出错; rem 3、尽量使用相对路径,不要用绝对路径; rem 4、对于要使用但又不理解的命令,一定要先查看命令的使用说明:help cmdName rem echo off 表示此语句后的所有运行的命令都不显示命令本身 rem @ 与echo off 相似,但它是加在每个命令的最前面,只作用于当前命令,表示运行时不显示这一命令 rem 用来注释 rem echo 表示显示此命令后的字符,也可以用于将命令后的字符串输出到文件,如下面所示 rem echo abc to file >> targetfile.txt rem 上面的命令将把abc to file写到targetfile.txt rem pause 暂停执行并在屏幕上显示Press any key to continue...的提示,等待用户按任意键后继续 rem exit /b code 加上/b选项表示退出当前批处理脚本,而不是cmd.exe,相当于函数的return语句。code是个数字,表示执行结果 rem set 用于定义变量 rem call 用来调用另一个批处理,就像函数调用(如果不用call而直接调用别的批处理文件,那么执行完成那个批处理文件后将无法返回当前文件后续的命令) rem 在被调用的批处理里,%[1-9] 表示传递进来的参数,参数是指调用者在文件名后加以空格分隔的字符串。 rem %0 表示批处理命令本身,其他参数字符串用%1到%9表示 rem 批处理调用示例,不带参数 call for.bat firstparamvalue rem type 用来输出文件内容,下面的命令输出subfor.bat文件的内容 type subfor.bat
for.bat
@echo off echo caller pass me : %1 @rem 调用批处理subfor.bat,并传入两个参数 set items=a b c d set letters=x y z for %%a in (%items%) do ( for %%b in (%letters%) do ( call subfor.bat %%a %%b ) ) rem 对一组文件中的每一个文件执行某个特定命令 rem FOR %%variable IN (set) DO command [command-parameters] rem %%variable 指定一个单一字母可替换的参数。 rem (set) 指定一个或一组文件。可以使用通配符。 rem command 指定对每个文件执行的命令。 rem command-parameters 为特定命令指定参数或命令行开关。 for %%a in (*.txt) do ( rem 如果文件名有空格,必须使用"" rem type "%%a" ) cls rem 读取text.txt中的每一行作为参数%%a的值,调用循环体 for /F "delims=" %%a in (text.txt) do ( echo %%a ) echo for 循环命令的使用比较复杂,必须认真阅读使用说明
subfor.bat
@echo off echo echo in subfor.bat : %1 %2
if.bat
@echo off rem if语句有三种格式: rem 1、判定参数是否符合期望值:if [not] "参数" == "字符串" 待执行的命令 if "%1" == "abc 123" ( echo first var'value is :abc 123 ) else ( echo first var'value not excepted, it is :%1 ) rem 2、判定文件是否存在:if [not] exist [路径\\文件名] 待执行的命令 if exist "abc 123.txt" ( echo content of file abc 123.txt is : type "abc 123.txt" ) else ( echo abc 123.txt is exist . ) call subif.bat 3 rem 3、if errorlevel <数字> 待执行的命令 rem 返回值必须按照从大到小的顺序排列 if errorlevel 3 ( echo errorlevel is three . ) else if errorlevel 2 ( echo errorlevel is two . ) else if errorlevel 1 ( echo errorlevel is one . ) else ( echo execute success . )
subif.bat
@echo off if "%1" == "" ( rem 加上/b选项表示退出当前批处理,而不是退出cmd.exe exit /b 0 ) else ( exit /b %1 )
goto.bat
@echo off if "%1" == "" ( goto default ) else if "%1" == "helloworld" ( goto helloworld ) :default echo you come to default . goto end :hellowrold echo why you come to hello world ? goto end :end
createHelp.bat 此脚本可以输出系统命令的帮助文档,不过还有点问题,但可以运行了。
@echo off set cmds=FIND SORT DISKPART for /F "usebackq" %%i in (`help`) do ( for %%a in (%cmds%) do ( if not "%%a" == "%%i" ( help "%%i" > help/%%i-help.txt ) ) )
2012-09-24 增加文件处理,以xml为例,增加字符串处理示例。
config.xml文件:
<config> <host>www.google.com.kh</host> <port>8080</port> </config>
dealContent.bat
@echo off rem 把config.xml里的<host>127.0.0.1</host>替换成<host>www.google.com.kh</host> if exist config_tmp.xml del config_tmp.xml rem 使用for循环命令读取文件内容时,先从文件里读取一行,然后用默认的分隔符对行进行划分,再用得到的每一项调用循环体 rem 所以要处理的文件的行最好不要有空格或tab for /F %%i in (config.xml) do ( rem 如果项是xml的标签,要对<>转义 if %%i == ^<host^>127.0.0.1^</host^> ( rem >>前面是没有空格 echo ^<host^>www.google.com.kh^</host^>>> config_tmp.xml ) else ( echo %%i>> config_tmp.xml ) ) del config.xml ren config_tmp.xml config.xml
字符串处理示例:主要是字符串截取、替换,通过替换删除指定字符串:
dealStr.bat:
@echo off rem 字符串处理 rem 字符串拼接,语法:newStr=%str1%%str2% set str1=abc set str2=123 set newStr=%str1%%str2% echo %newStr% rem 字符串截取,语法:%var:~x,y% (x,y∈Z) rem 说明:当x为正数时表示从左到右第x+1位开始截取,当x为负数时表示从右到左第x位开始截取(右一位是-1), rem 当省略x时采用默认值0; rem 当y为正数时表示截取的长度,当y为负数时表示截取到从右到左的第y+1位,当省略y时采用默认值-1。 set src=abc 123 456 set trunk=%src:~2,4% echo %trunk% echo %src:~-5,4% rem 字符串替换,语法:%var:str1=str2% rem 说明:将字符串var中所有的str1替换为str2 echo %src:123=789% rem 删除字符串里的空格 set str5=abc 123 4 5 6 7 8 echo %str5: =% rem 删除字符串里的tab echo %str5: =%