因为一直在探索测试的自动化技术,以前开发了几个cmd命令文件实现了Klocwork的批量自动化测试功能,但没有实现单bat版的脚本。
近日在学习Perl脚本时,又研究了一下Windows命令行脚本,实现了这个目标。
它主要是用到了
call :label argumenslist
goto :eof
两个cmd内置命令。
主流程的结束用
exit /B exitcode
@ECHO *************************************************************************** @ECHO *** *** @ECHO *** 脚本功能: *** @ECHO *** 1. 递归测试当前目录及其所有子目录下wpj工程 *** @ECHO *** 2. 递归测试wpj文件清单中的所有工程 *** @ECHO *** *** @ECHO *** 版本: *** @ECHO *** KwCheckWpjList version 0.9 *** @ECHO *** *** @ECHO *** 版权: *** @ECHO *** 本脚本采用GNU版权协议分发,是作者开发的系列脚本工具之一。 *** @ECHO *** *** @ECHO *** 作者:svnLight@youkuaiyun.com *** @ECHO *** *** @ECHO *** 创建日期:2009年07月07日 *** @ECHO *** 初始版本0.9 *** @ECHO *** *** @ECHO *************************************************************************** :: :: ********************************************************************************* :: 主程序 :: MainProcess <<< :: @ECHO OFF && setlocal
:: 配置参数(需要根据实际情况修改) :: 1. Tornado的根目录 @set TornadoRoot="C:/Tor8260" :: 2. Klocwork安装路径 @set KWROOT=C:/Klocwork/K8.2Server :: 3. 项目缩写,用作K8工程的前缀 @set ProjectAbbr=Test :: 4. 即时通消息信宿 @set MsgDstHost=192.168.1.10 :: 5. Klocwork临时文件的根路径 @set TempRoot=D:/Klocwork/Temp4Check
@set PATH=%KWROOT%/bin;%PATH% @set K8TimeCountFile=K8TimeSpan.txt @set StartTime=%time% @echo .>> %K8TimeCountFile% @echo ********************************************************* >> %K8TimeCountFile% @echo 开始新一轮的检测, 开始于%StartTime% >> %K8TimeCountFile% @set StartDir=%CD%
@call %TornadoRoot%/host/x86-win32/bin/torVars.bat
@set /A FileCounter=0
@if ""=="%1" goto ProcByFolder @if NOT ""=="%1" ECHO 按照%1文件中的wpj工程清单逐个进行K8测试... @ECHO. :: Wpj文件为绝对路径,不能包含有空格 @for /F %%I in (%1) do @if exist %%I @set /A FileCounter+=1 && call :SubKwCheckWpj %ProjectAbbr% %%I @@if not %FileCounter%==0 call :SubReStartService web @ipmsg /msg %MsgDstHost% "%1文件中全部wpj工程测试完成." @goto ShowMsg
:ProcByFolder @ECHO 对当前目录及其所有子目录中的wpj工程进行K8测试... @ECHO. :: 路径中不能包含有空格 @for /R %%I in (*.wpj) do @if exist %%I @set /A FileCounter+=1 && call :SubKwCheckWpj %ProjectAbbr% %%I
@@if not %FileCounter%==0 call :SubReStartService web @ipmsg /msg %MsgDstHost% "当前目录及其所有子目录中全部wpj工程测试完成."
:ShowMsg @ECHO 共测试%FileCounter%个Tornado工程
@cd %StartDir% @set EndTime=%time% @echo 全部工程的检测时间,%StartTime%,%EndTime% >> %K8TimeCountFile% @echo ********************************************************* >> %K8TimeCountFile%
@endlocal
@ECHO ON @Exit /B 0 :: >>> MainProcess
:: ********************************************************************************* :: 子过程01 - KwCheckWpj :: SubKwCheckWpj<<< :SubKwCheckWpj @echo Start Check Project[%2]... @echo off & setlocal @if not defined K8TimeCountFile @set K8TimeCountFile=K8TimeSpan.txt @if not defined MsgDstHost @set MsgDstHost=192.168.1.10 @if not defined TornadoRoot @echo No TornadoRoot defined && goto Sub1End @if "%2"=="" goto ErrorReport
@set StartTime=%time% @set StartDir=%CD% :: -- :: 自动获取当前活动的Projects Root @for /F "tokens=3,*" %%I in ('kwadmin get-projects-root') do @set KWPRJROOT=%%I @echo K8's project_root: %KWPRJROOT% :: -- 准备表目录 @set table_dir=%TempRoot%/Tables-Dir/%1/%~n2 @set ClearDir=%TempRoot%/Tables-Dir/%1 ::@ECHO table_dir=%table_dir%
:: -- 准备out目录 @set OUTDIR=%TempRoot%/Out-Dir/%1/%~n2 ::@ECHO OUTDIR=%OUTDIR% @set OUTFILE=%OUTDIR%/%~n2.out
:: -- 准备Report目录 @set ReportDIR=%TempRoot%/Report-Dir/%1 ::@ECHO ReportDIR=%ReportDIR% @if not exist "%ReportDIR%" @mkdir "%ReportDIR%"
:: -- 初始化项目 @for /F %%I in ('kwadmin list-projects') do @if "%%I"=="%1_%~n2" goto DELETE_PROJECT @goto PROC_PROJECT
:DELETE_PROJECT @echo Deleting project '%1_%~n2'. @kwadmin delete-project %1_%~n2
:PROC_PROJECT
@if exist "%ClearDir%" rd /S /Q "%ClearDir%" @mkdir "%table_dir%"
@if exist "%OUTDIR%" rd /S /Q "%OUTDIR%" @mkdir "%OUTDIR%"
@echo Creating project '%1_%~n2'. @kwadmin create-project %1_%~n2 --language c,cxx --copy-sources
:: -- 设置项目属性 @kwadmin --host localhost set-project-property %1_%~n2 source.bsf %OUTFILE% @kwadmin --host localhost set-project-property %1_%~n2 source_encoding GB2312 @kwadmin --host localhost set-project-property %1_%~n2 project_work_dirs "%USERNAME%;%COMPUTERNAME%;%table_dir%" @kwadmin --host localhost set-project-property %1_%~n2 windows_project true @kwadmin --host localhost set-project-property %1_%~n2 reuse_tables_dir true ::@kwadmin --host localhost set-project-property %1_%~n2 do_cluster_analysis true @kwadmin --host localhost set-project-property %1_%~n2 jobs_number auto @kwadmin --host localhost set-project-property %1_%~n2 report_options "--metrics-config$CONFIG_FILES_DIR$metrics_default.mconf,--error-config$CONFIG_FILES_DIR$problems_default.pconf.xml,--usage-rules$CONFIG_FILES_DIR$usagerules_default.uconf,--long-path,--verbose,--usage-details,--show-unmatched-rules" @kwadmin --host localhost set-project-property %1_%~n2 compiler_options --errors-config$CONFIG_FILES_DIR$problems_default.pconf.xml,--honor-std
@cd /d %~dp2% :: 准备.out文件 @type makefile | find "BUILD_SPEC" >%TempRoot%/temp.lst @FOR /F "tokens=2 delims== " %%I IN (%TempRoot%/temp.lst) do ( @set BuildSpec=%%I @echo BuildSpec="%%I" @goto FindRule ) :FindRule @type makefile | find "DEFAULT_RULE" >%TempRoot%/temp.lst @FOR /F "tokens=2 delims== " %%I IN (%TempRoot%/temp.lst) do ( @set DefaultRule=%%I @echo DefaultRule="%%I" @goto FindMake ) :FindMake :: 按照工程makeall的写法进行make,其实应该更简单些 :: “-C %BuildSpec% -f ../”应该等效于“ ”,唯一的区别是目标文件生成的位置不同 @if not exist %BuildSpec% mkdir %BuildSpec% @make -C %BuildSpec% -f ../makefile clean @kwinject -o %OUTFILE% make -C %BuildSpec% -f ../makefile %DefaultRule% @IF NOT ERRORLEVEL == 0 ( @ECHO 分析当前项目需要缓存ctdt.c,重新执行kwinject... @make -C %BuildSpec% -f ../makefile clean @kwinject --cache-files "*ctdt.c" -o %OUTFILE% make -C %BuildSpec% -f ../makefile %DefaultRule% ) :: 判断是否生成了有效的out文件 @CALL :SubGetFileSize %OUTFILE% @if %FileSize% LEQ 20 goto NoToolChain
:: -- 进行缺陷检测,K8命令 ::@kwDspParser %2 -c Debug -o %OUTFILE% @kwbuildproject -S %1_%~n2 -o "%table_dir%" %OUTFILE% -j auto -v -f @kwadmin load %1_%~n2 "%table_dir%"
:: -- 生成报告 @kwinspectreport --project %1_%~n2 --build build_1 --text %ReportDIR%/%1_%~n2_report.txt --xml %ReportDIR%/%1_%~n2_report.xml
@cd /d "%StartDir%" @set EndTime=%time% @echo %~n2.wpj,%StartTime%,%EndTime%,Check >> %K8TimeCountFile% @ipmsg /msg %MsgDstHost% "%~n2.wpj工程测试完成." @goto Sub1End
:NoToolChain @ECHO kwinject没有监护到make工具链。 @ipmsg /msg %MsgDstHost% "kwinject没有监护到%~n2.wpj工程的make工具链." @ECHO 1) 脚本中的变量TornadoRoot设置错误,必须指向正确的Tornado安装目录。 @ECHO 或%TornadoRoot%/host/x86-win32/bin/torVars.bat中WIND_BASE变量设置与实际Tornado的路径不符。 @ECHO 3) 如果确信toolchain没有问题,可能是makefile文件的依赖关系有错误(如include头文件有误) @ECHO 先在命令行用make测试一下。 @ECHO 重新测试当前的工程。 @PAUSE :Sub1End @ECHO. @endlocal
goto :EOF :: <<< SubKwCheckWpj
:: ********************************************************************************* :: 子过程02 - RestartService :: SubRestartService<<< :SubRestartService @echo off & setlocal @if not "%1"=="all" if not "%1"=="web" if not "%1"=="project" if not "%1"=="license" if not "%1"=="database" ( @ECHO 缺少参数或参数错误。 @goto Sub2End ) :: Restart Klocwork service... :: 自动获取当前活动的Projects Root @for /F "tokens=3,*" %%I in ('kwadmin get-projects-root') do @set KWPRJROOT=%%I ::@echo K8's project_root: %KWPRJROOT% @if "%1"=="all" goto tagRESTART_SERVICES :: :RESTART_SERVICE @echo Restart Klocwork service %1. @kwservice restart %KWPRJROOT% %1 >nul @goto Sub2End
:tagRESTART_SERVICES @echo Restart Klocwork services. @kwservice restart %KWPRJROOT% >nul
:Sub2End @endlocal
@goto :EOF :: >>> SubRestartService
:: ********************************************************************************* :: 子过程03 - GetFileSize :: SubGetFileSize <<< :SubGetFileSize @set /A FileSize=%~z1 @ECHO 文件%~nx1的大小为%FileSize%字节。 @goto :EOF :: >>> SubGetFileSize |
用于Path扫描、VC/.Net工程的批量扫描工具,道理与此类似。
bat脚本的功能虽然不是很强,但处理这些基本的功能还是没有问题的。更高级的需求可以借助于像vbs、Perl等更强的脚本语言来实现。
使用方法
C:/>KwCheckWpjList WpjList.txt
由于一般的代码树都不包含空格,KwCheckWpjList.cmd没有对包含空格的绝对路径进行测试。