KwCheckWpjList静态检查脚本

因为一直在探索测试的自动化技术,以前开发了几个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    ***  创建日期:20090707                                           ***

@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 2)
修改%KWROOT%/config/kwfilter.conf文件,添加工程所需的toolchain,保存修改。

@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没有对包含空格的绝对路径进行测试。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值