修改批处理文件中.c文件中定义的版本号

时间:2013-08-06 23:53:40

标签: batch-file

我正在编写批处理文件以开始自动构建固件。

目前我从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)。

我是批处理文件的新手,我正在学习,但这让我很难过。我宁愿不复制每一行并修改我想要的那一行,我只想操纵原作。

感谢您提供任何帮助或指导。

5 个答案:

答案 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 -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)

的代码:

awk "$2 ~ /DSP_FW_VERSION/ {$3++};1" file

awk for Windows