如何通过 Windows 批处理文件中的 'find' 过滤器使用 'svn info' 命令获取 'BASE' 数字?

How to get the 'BASE' number with 'svn info' command by 'find' filter in Windows batch file?

我想通过 Windows 批处理文件中的 'svn info' 命令获取 'BASE' 号码,如下批处理脚本:

svn update

for /f "tokens=2" %%i in ('svn info -rBASE^|find "Revision"') do (
 @echo %%i
 set svn_rev=%%i
)

但我总是得到我的 svn 管理项目代码的 'HEAD' 号。所以我直接在控制台中尝试了命令:

>svn info -rBASE
Path: AliceAgent4.0b5856
URL: https://192.168.1.116:3443/svn/ProjectAliceVR/AliceOperationAgent/branches/AliceAgent4.0b5856
Relative URL: ^/AliceOperationAgent/branches/AliceAgent4.0b5856
Repository Root: https://192.168.1.116:3443/svn/ProjectAliceVR
Repository UUID: 794566ed1-6640e-7746-860d-66136dce9e99a
Revision: 5936
Node Kind: directory
Last Changed Author: yuanhui.he
Last Changed Rev: 5933
Last Changed Date: 2019-03-21 15:10:43 +0800 (周四, 21 3月 2019)

Revision5936,而不是 5933。然后,我尝试了 svnHEAD 参数,它输出与 BASE 相同的结果:

> svn info -rHEAD
Path: AliceAgent4.0b5856
URL: https://192.168.1.116:3443/svn/ProjectAliceVR/AliceOperationAgent/branches/AliceAgent4.0b5856
Relative URL: ^/AliceOperationAgent/branches/AliceAgent4.0b5856
Repository Root: https://192.168.1.116:3443/svn/ProjectAliceVR
Repository UUID: 794566ed1-6640e-7746-860d-66136dce9e99a
Revision: 5936
Node Kind: directory
Last Changed Author: yuanhui.he
Last Changed Rev: 5933
Last Changed Date: 2019-03-21 15:10:43 +0800 (周四, 21 3月 2019)

编辑:

我试过 'svn info -rBASE^|find "Last Changed Rev:"' 但它在批处理脚本中只有一个 Changed 字符串。

那么,我怎样才能得到 Last Changed Rev: 5933 行中的数字 5933

基本上,这道题有两个问题:

  • 如何获取 COMMITTED 号码而不是 HEAD 号码。
  • 如何更正 Windows 批处理文件中的 find 参数以找到正确的结果。

老实说,问题 How do you determine the latest SVN revision number rooted in a directory? 没有解决我的问题,但有人回答了我的问题。

我想任何人都能在这里找到我的问题,因为他们面临着与我相同的问题。省略他们的时间总是宝贵的,所以我在这里整理答案:

A1:把BASEHEAD改成COMMITTED就可以直接得到你想要的:

svn update

for /f "tokens=2" %%i in ('svn info -rCOMMITTED^|find "Revision"') do (
 @echo %%i
 set svn_rev=%%i
)

A2:将for循环的tokens值改为4,然后将find参数改为Last Changed Rev:。这可以更正 for 循环的动作以找到正确的数字。我不熟悉 windows 批量凭证,我的错,@Compo。

svn update

for /f "tokens=4" %%i in ('svn info -rHEAD^|find "Last Changed Rev:"') do (
 @echo %%i
 set svn_rev=%%i
)

根据我的评论,

  • 在冒号处拆分输入
  • 对每个文本文件使用模拟输入
  • 使用具有正则表达式功能的 findstr ^ 行首处的锚点和多个搜索字符串
  • 从行首设置变量名称(删除 spaces)和
  • 使用 set /A 从数字
    中删除尾随 space (可能会因 08xx/09xx 被解释为八进制而失败)

:: Q:\Test19\SO_55291828.cmd
@Echo off&Setlocal EnableDelayedExpansion

::svn update

Echo svn info -rBASE
for /f "tokens=1-2delims=:" %%i in ('
  type svn_info-rBASE ^|findstr "^Last.Changed.Rev ^Revision"
') do (
 Set "var=%%i"
 set /A "_!var: =!=%%j"
)
Set _
Echo:
Echo svn info -rHEAD
for /f "tokens=1-2delims=:" %%i in ('
  type svn_info-rHEAD ^|findstr "^Last.Changed.Rev ^Revision"
') do (
 Set "var=%%i"
 set /A "_!var: =!=%%j"
)
Set _

示例输出:

> SO_55291828.cmd
svn info -rBASE
_LastChangedRev=5933
_Revision=5936

svn info -rHEAD
_LastChangedRev=5933
_Revision=5936