使用bat指令碼判斷遠端SVN檔案是否有修改
阿新 • • 發佈:2021-12-24
在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
如有更好的辦法,還請大家指點:)