批处理脚本的细节

来源:互联网 发布:mac系统大写键打不开 编辑:程序博客网 时间:2024/05/19 15:26

写Jenkins在windows下vs项目的自动化编译的批处理脚本的时候,在一些细节处理方法遇到过很多问题,虽然网上关于批处理有很多的教程,但是对于一些指令讲解还是不够详细,这些小问题往往会困扰你比较长的时间,这里分享一下我在写脚本时遇到的一些小问题,希望能够帮助到大家。
1.错误处理一个好的脚本一定要具有一定的错误处理机制,因为脚本的执行虽然快速,但同样带来了一定的破坏性,有时候到另一台机器时,你往往很难控制脚本的执行过程,所以保险一点的作法就是你对指令执行的前提条件进行检验,你可以使用if not exist等类似的指令进行检测,例如
if not exist "%GITBIN%" echo Couldn't find Gitbin at "%GITBIN%" and you should set like this "F:\Git\bin"& pause & exit 2
这条指令就是对环境变量GITBIN进行检查,如果不存在这个环境变量,脚本就退出执行,并且将exit后相应的值写入ERRORLEVEL,你可以根据ERRORLEVEL的值进行后续的处理,例如
if %ERRORLEVEL% NEQ 0 goto error
2.环境变量的使用
当脚本需要处理路径并不是唯一的时候,比如说,jdk的安装路径因人而异,为了增强脚本的通用性,比较方便的做法就是让用户将需要配置的路径写入环境变量,然后再脚本中直接使用环境变量来进行操作,当然自己也可以在脚本中写入临时的环境变量。

set _PROJECTNAME=TestCppcd samples\%_PROJECTNAME%\proj.android

这两行命令会根据临时写入环境变量中的目录名TestCpp进入到相应的目录。当你要直接进入自己设置的环境变量对应的目录时,需要先获取环境变量的路径值的前两个字符,也就是对应的盘符,进入相应的磁盘下,如何才能直接用cd命令进入相应的目录。如果想要获取当前路径,直接echo %cd%。
3.调用其他脚本怎么说呢,这里不是主要讲说调用其他脚本,很多时候可能会在脚本中调用其他的脚本,如果你直接在脚本中输入脚本的名称,很有可能执行完那个脚本后无法从中退出,或者说你想在另一个控制台中执行一个编译命令,你可以用一行命令使用管道完成这样一个任务,但是很有可能你不能从中退出,这个时候你不妨试试不直接写脚本的名称,用call命令来进行调用,也许你就能使你的脚本继续执行下去。这行指令将一个命令传入到cygwin的shell控制台来完成一个shell脚本的执行,执行完成后退出shell控制台,继续执行我们的脚本,如果不适用call指令,你的批处理很可能一直停留在shell控制台。
4.拷贝文件夹很多时候你不仅仅是需要拷贝单个文件这么简单,你需要把整个文件夹内的东西都拷贝到另一个文件夹下,这时候你就需要xcopy命令

cd Debug.win32xcopy  /E /Y /Q "%CC_TEST_RES%" ..

这两行命令的作用是将环境变量CC_TEST_RES对于的文件夹下所有文件包括子文件夹都拷贝到Debug.win32目录下,不要忘记后面的一个点。
5.习惯性地写上注释时间总是无情的,当你很久以后再看你以前写的脚本,很有可能你会一时间看不懂你写的脚本,特别是当你写了很多的脚本以后,这时候注释就能给你提供很大的帮助,使你能快速记起脚本的作用和一些指令的意义,良好的注释同样会给别人阅读你的脚本提供很大的帮助,所以无论你的注释写的有多差都要对你的脚本添加注释。
暂时就写到这里,还有很多细节自己没有添加进来,后续自己会继续补充,同样也欢迎大家分享自己在写批处理时遇到的一些坑人的地方分享出来,帮助更多的人越过这些坑。