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
October 10th, 2009 in
code|编程
看起来真晕
Windows下有个powershell,比较强大,比bat好用