我正在编写批处理文件以开始自动构建固件。
目前我从TFS(Team Foundation Server)获取代码然后构建它(该工具基于eclipse)。
但是,在构建代码之前,我想增加版本号,该版本号存储在文件version.h中。该文件的内容是:
/* $Header: /NG EM Controller Firmware Eclipse based/APPS/EM MAIN/version.h 2 4/25/13 10:19a user $
*/
#ifndef Version_h
#define Version_h
#define DSP_FW_VERSION 500
#define DSP_FW_ID 22
#define DESTINATION 1
#endif
/*
* More comments, the number increases with each check in*./
#define DSP_FW_VERSION 500行是我需要递增的行(在本例中为501)。
我是批处理文件的新手,我正在学习,但这让我很难过。我宁愿不复制每一行并修改我想要的那一行,我只想操纵原作。
感谢您提供任何帮助或指导。
答案 0 :(得分:2)
试试这个(纯批次):
@ECHO OFF &SETLOCAL ENABLEDELAYEDEXPANSION
SET "HFile=file"
SET "search=#define DSP_FW_VERSION"
FOR /f %%a IN ('^<"%HFile%" find /c /v ""') DO SET /a lines=%%a
< "%HFile%" (
FOR /l %%a IN (1,1,%lines%) DO (
SET "line="
SET /p "line="
IF NOT "!line!"=="" IF NOT "!line:%search%=!"=="!line!" (
SET /a replace=!line:%search%=!+1
SET "line=%search% !replace!"
)
ECHO(!line!
))>"%HFile%.new"
MOVE /y "%HFile%.new" "%HFile%"
TYPE "%HFile%"
答案 1 :(得分:1)
perl一行中的便携式方式(只有一个流程):
perl -i -pe '
BEGIN{$re = qr!^(/\*\s+\$Header:.*?version\.h\s+)(\d+)!};
$re and s@$re@sprintf "%s%d", $1, $2+1@e
' file.h
如果您只想尝试一下,请删除-i
开关。
答案 2 :(得分:1)
@ECHO OFF
SETLOCAL
SET "sourcedir=."
SET targetfile=version.h
SET newversion=%1
IF NOT DEFINED newversion ECHO require new version number as parameter&GOTO :EOF
IF NOT EXIST "%sourcedir%\%targetfile%" ECHO %targetfile% not found&GOTO :eof
DEL "%sourcedir%\%targetfile%_before_%newversion%" >NUL
ren "%sourcedir%\%targetfile%" "%targetfile%_before_%newversion%"
(
FOR /f "delims=" %%a IN (
' FINDSTR /n /R "$" "%sourcedir%\%targetfile%_before_%newversion%" '
) DO (
SET "line=%%a"
SETLOCAL ENABLEDELAYEDEXPANSION
SET line=!line:*:=!
IF "!line:~0,23!"=="#define DSP_FW_VERSION " SET line=!line:~0,23!%newversion%
ECHO(!line!
endlocal
)
)>"%sourcedir%\%targetfile%"
FC "%sourcedir%\%targetfile%" "%sourcedir%\%targetfile%_before_%newversion%"
GOTO :EOF
上述批次旨在使用新版本号的参数运行。
它应该将现有version.h
重命名为version.h_before_newversionnumber
,并重新生成version.h
文件,包括空行,但替换目标行除外。
最后的FC
命令仅用于在强有力的预生产测试期间比较文件的前后版本......
答案 3 :(得分:0)
line=`grep -E '#define DSP_FW_VERSION' version.h`
fst=$[line% *}
snd=${line##* }
nvno=`echo "${snd##* } + 1" | bc`
sed "s/$line/$fst $nvno/" version.h
第一行找到您要修改的行。你可能想要防守,并确保只找到一条线。第二行分割行的开头,第三行分割成两个变量。第四行使用'bc'递增版本号。最后一个通过重新组装第一部分和增加的第二部分来更改版本.h。有点难看,但它应该在bash中工作(你需要cygwin)。
答案 4 :(得分:0)