[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] 上传代码到svn的批处理怎样获取log中的指定数字并赋值?

大家好,我用bat编写了一个svn post-commit hooks 去自动上传代码到 reviewboard,
大致功能实现了,但是有些小问题请教下大家

1. 我想将 log (可能是多行) 中 ##后面的数字拿出来赋值给变量(假设前提是log中只有一个地方有##且##后一定是数字且后面无其他内容),下面是我的代码
  1. for /f "tokens=1 delims=##" %%i in ('C:\csvn\bin\svnlook.exe log "%REPOS%" -r "%TXN%"') do set REV=%%i
复制代码
但是我发现问题是在没有##的多行log中,bat会默认把最后一行作为赋值给REV。

请问我的代码的问题出在哪里 咋么该? 谢谢

用#作为分割符时,文档中不包含#的行,也会赋值个变量rev,至for循环完成,赋值给rev就是最后一行了。试试加if判断:
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%i in ('C:\csvn\bin\svnlook.exe log "%REPOS%" -r "%TXN%"') do (
  3.   set "str=%%i"
  4.   if not "!str:##=!"=="!str!" set rev=!str:*##=!
  5. )
  6. echo !rev!
  7. pause
复制代码

TOP

本帖最后由 zhwbqd 于 2012-7-20 15:05 编辑

十分感谢 apang 的解答,我后来也想到应该用if来判断, 也写了一个可以实现的,不知道您觉得我这个怎么样
  1. for /f "tokens=1 delims=##" %%i in ('C:\csvn\bin\svnlook.exe log "%REPOS%" -r "%TXN%"') do set REV=%%i
  2.   echo %REV%|findstr "^[0-9]*$" > nul
  3.   if %errorlevel% gtr 0 ( set REV=)
复制代码
如果取到的##是数字 errlevel就是0了, 但是缺点就是如果##数字 后面还有内容的话就会有问题了。。

小弟还有一个问题就是我想将svnlook的命令执行的结果赋值给一个变量,该输出可能包含多行的log信息, 看到论坛上有人用
  1. set "str=%str:str=>nul & dir/b%"
复制代码
但是如果我将dir/b 替换为 C:\csvn\bin\svnlook.exe log "%REPOS%" -r "%TXN%“ 的话就会有问题, 打开echo on 看到貌似这样不支持 %TXN%和%REPOS%的变量 在其中,
后来我就用了另一种方法,但是这种的缺点就是无法换行,而且超过4行就会被忽略。
  1. setlocal enabledelayedexpansion
  2.   set n=1
  3.   for /f "delims=" %%i in ('C:\csvn\bin\svnlook.exe log "%REPOS%" -r "%TXN%"') do (
  4.   set "_!n!=%%i"
  5.   set /a n+=1
  6.   )
  7.   set _
  8.   set DESC=%_1% %_2% %_3% %_4%
复制代码
不知道各位有何高见?
好像我查将 多行命令输出赋值给一个变量的这样的问题还没有人问过。。是太简单了吗。。。
后来认真看了一下真的很简单。。。惭愧
  1. set "a=>nul&dir /b"
复制代码
但是还是在bat文件中还是有点问题
输出的时候虽然打出了description,但是含有前面的一些判断 我打开了echo on  还是会有1>nul  & C:\csvn\bin\svnlook
.exe log C:\csvn\data\repositories\fms-lab -r 287赋值给了desc
  1. C:\csvn\data\repositories\fms-lab\hooks>set DESC=   1>nul  & C:\csvn\bin\svnlook
  2. .exe log C:\csvn\data\repositories\fms-lab -r 287
复制代码

TOP

回复 3# zhwbqd

似乎可以这样?
  1. @echo off&setlocal enabledelayedexpansion
  2. set 换行=^
  3. for /f "delims=" %%i in ('dir /b') do (
  4.   set str=!str!%%i!换行!
  5. )
  6. echo !str!
  7. pause
复制代码

TOP

回复 4# apang

强, 谢谢, 这就是传说中的预处理吧?

TOP

返回列表