使用bat脚本判断远程SVN文件是否有修改

在Windows上,
使用 svn status -u -q %dir% 可以列出svn仓库的状态:

M             8295   build.bat
        *     8306   E:\game\bzk\dev\tools\proto\src\jianghu_dun.proto
        *     8306   E:\game\bzk\dev\tools\proto\src\hero.proto
M             8299   svn_ci.bat

(使用 svn status /? 可以查看 svn status的用法)
如上,我们可以获得类似的输出,其中一行第9个字符是星号*代表远程有修改的,因此我们只要查出某一行第九个字符是个星号即可,
翻来覆去查来找去,bat对字符串的操作真是难以言语,首先要在脚本中获得命令的输出,bat的方法是:

for /F "delims=" %%i in ('svn status -u -q %1') do ( 
 # echo %%i 可以输出:M             8295   build.bat
 set out=%%i
 # 但是 echo %out%就不行,搞不懂
)
# 如果在这里才处理%out% %out%等于`svn status -u -q`输出的最后一行,而不是总共4行,也不行

目前可以解决的思路是在for /F "delims=" %%i in ('svn status -u -q %1') do中加入选项 "tokens=1-4 delims= "
将输出按照空格分开,分别判断前4个是否包含星号:

set svn_change=false

call :check_svn_remote %here%\src
if %svn_change% == true (
    echo SVN上有更新的文件,正在重新生成
    call %HERE%\build.bat
)
goto :eof

# =========定义==============
:check_svn_remote
set svn_change=false
for /F "tokens=1-4 delims= " %%i in ('svn status -u -q %1') do ( 
    if [%%i] == [*] goto :svn_change_true
    if [%%j] == [*] goto :svn_change_true
    if [%%k] == [*] goto :svn_change_true
    if [%%l] == [*] goto :svn_change_true
)
goto :eof

:svn_change_true
set svn_change=true
goto :eof

如有更好的办法,还请大家指点:)

posted @ 2021-12-24 16:18  J6`  阅读(355)  评论(0编辑  收藏  举报