OMG!Windows批处理

我想做一件很简单的事,将svn的某个版本的log取出放在一个变量中,在Windows的批处理中,下面这条命令可以做到:

for /F “delims==” %%B in (’svnlook log -r %REV% d:\repos’) do set LOG=!LOG! %%B

看起来倒是简洁,不过这句话却花了我整整一天的时间,原因在于:

  • Windows下,要将一个命令的输出结果存放到一个变量,需要使用for这个语句,首先这个就很奇怪
  • %%B 是for语句的循环变量,至于为什么用%%B,而不是批处理中常用的%B%,我也不清楚,大概是怕%B%和一般的变量替换冲突,更甚的是,在CMD窗口下,是用%B就可以,而在一个.bat文件中,就必须用%%B
  • 我为了支持log有多行的情况,所以在set LOG时,想将每一行都附加在原来LOG变量后面,所以我自然想写 set LOG=%LOG% %%B,不过很不幸,这样不行,查了好久才知道,要用 set LOG=!LOG! %%B,你以为这样就可以了,MS说:还不可以,因为在执行这个for语句之前!LOG!就被替换为值了,也就是这个for语句根本不会起到for循环往后附加每行的作用,要加上这样一句话setlocal enabledelayedexpansion在for语句前面,表示变量延迟替换,OMG, Orz ~~

真的被这个批处理雷倒了,最终版本是:

setlocal enabledelayedexpansion
for /F “delims==” %%B in (’svnlook log -r %REV% d:\repos’) do set LOG=!LOG! %%B

Comments (2)

progmeNovember 5th, 2009 at 6:35 am

看起来真晕

progmeNovember 5th, 2009 at 6:36 am

Windows下有个powershell,比较强大,比bat好用

Leave a comment

Your comment