2016-11-23 113 views
-2

嗨我正在尝试编写一个脚本,更新标题/文本文件中的MAJOR和MINOR版本号,我试图使用“FOR/F”命令但出于想法。 下面是头文件,我需要更新对应于“MAJOR_VERSION”和“MINOR_VERSION”批处理脚本更新文本文件中的版本号值

#ifndef _VERSION_H_ 
#define _VERSION_H_ 

//---------- Lock Firmware Package Version ------------ 
//Lock firmware package 
#define MAJOR_VERSION 3  //0-255 
#define MINOR_VERSION 58  //0-255 
#define REVISION_VERSION 0  //0-255 should generally always be 0 unless the meaning change 

//---------- VERSION ---------------------- 
+0

你到目前为止尝试过什么?你是什么意思的“更新” - 自动递增? – aschipfl

回答

0

值这是我的回答相同的问题That was deleted by the owner "Dinesh" after I'd answered it昨天。

@ECHO OFF 
SETLOCAL 
SET "sourcedir=U:\sourcedir" 
SET "filename1=%sourcedir%\q40733227.txt" 
SET "itemlist=major_version minor_version" 
FOR /f "usebackqtokens=1-3*" %%a IN ("%filename1%") DO (
FOR %%i IN (%itemlist%) DO IF /i "%%b"=="%%i" SET "%%b=%%c" 
) 

FOR %%i IN (%itemlist%) DO SET %%i 

GOTO :EOF 

您需要更改sourcedir的设置以适合您的情况。

我使用了一个名为q40733227.txt的文件,其中包含我的测试数据。

使用默认值对每行进行Tokenise。第二个标记中的字符串(对于由itemlist选择的值)应该取第三个标记中的值。

你可以扩展在明显的方式提取的值,延长ITEMLIST

+0

感谢您的回答,您发送的脚本可以工作但部分因此,我发布的问题有点不同,我希望使用脚本在文本文件中增加MAJOR_VERSION和MINOR_VERSION的宏值'3'和'58'。我尝试了“FINDSTR”命令但不能清楚地做到这一点。 – Dinesh

1

下面的脚本 - 我们称之为update-versions.bat - 应该做你想要什么:

@echo off 
setlocal EnableExtensions DisableDelayedExpansion 

rem // Parse command line arguments: 
set "DIRN=#define" 
set "FILE=%~1" 
if not defined FILE (>&2 echo ERROR: too few arguments!) & exit /B 1 
shift /1 
set /A "IDX=0" 
:ARGS 
set "ARGV=%~1" 
if not defined ARGV goto :SKIP 
set /A "IDX+=1" 
set "KEY[%IDX%]=%ARGV::=" & rem "%" 
if not defined KEY[%IDX%] set /A "IDX-=1" & goto :SKIP 
set "VER[%IDX%]=10000%ARGV:*:=%" 
set /A "VER[%IDX%]%%=10000" 
shift /1 
goto :ARGS 
:SKIP 

rem // Process file: 
for /F "delims=" %%L in ('findstr /N /R "^" "%FILE%" ^& ^> "%FILE%" rem/') do (
    set "LINE=%%L" 
    setlocal EnableDelayedExpansion 
    (
     for /F "tokens=1-3*" %%A in ("!LINE:*:=!") do (
      endlocal 
      if /I "%%A"=="%DIRN%" (
       set "VER=" & set "ITEM=%%B" & set "REST=%%D" 
       setlocal EnableDelayedExpansion 
       for /L %%I in (1,1,%IDX%) do (
        if /I "!ITEM!"=="!KEY[%%I]!" (
         set "KEY=!KEY[%%I]!" 
         set "VER=!VER[%%I]!" 
        ) 
       ) 
       if defined VER (
        >> "!FILE!" echo(!DIRN! !KEY! !VER! !REST! 
       ) else (
        >> "!FILE!" echo(!LINE:*:=! 
       ) 
      ) else (
       setlocal EnableDelayedExpansion 
       >> "!FILE!" echo(!LINE:*:=! 
      ) 
     ) 
    ) || (>> "!FILE!" echo/) 
    endlocal 
) 

endlocal 
exit /B 

要使用它,您需要提供修改的文件和版本信息作为命令行参数:

update-versions.bat "\path\to\file.h" MAJOR_VERSION:3 MINOR_VERSION:59 REVISION_VERSION:0 

正如你所看到的第一个参数是文件路径,W这是强制性的。每个剩余的参数指定一个版本号关键字(出现在#defined指令之后)和相关的新版本号,用冒号分隔;所有这些都是可选参数。

+0

Voila !!它工作,它会更新主要和次要号码,因为我期待它。谢谢。 – Dinesh

+0

不客气!请看看这个:[我应该怎么做当有人回答我的问题?](http://stackoverflow.com/help/someone-answers) – aschipfl

0

这是一个简单的脚本,使用JREPL.BAT - a regular expression find/replace utility。 JREPL是纯粹的scrpt(混合批处理/ JScript),它可以在任何Windows机器上从XP开始运行 - 不需要任何第三方exe文件。可以通过命令行通过jrepl /?jrepl /??获得完整的文档以获得分页帮助。

updateHeader.bat

@echo off 
setlocal 
set "var=" 

:loadVar 
set "%~2=%~3" 
set "var=%Var%%~2|" 
shift /2 
shift /2 
if "%~2" neq "" goto :loadVar 

call jrepl "(#define +(%var:~0,-1%) +)\d+" "$txt=$1+env($2)" /jq /f %1 /o - 

批处理脚本解析命令行参数。它建立一个要替换的变量名称列表(简单正则表达式替换),并为每个指定变量设置一个环境变量。 JREPL调用用相应环境变量的值替换每个值。

使用上述脚本的语法是updateHeader File Variable=Value[ Variable=Value]...。变量名称区分大小写。

例如,要更新文件“版本”。H”与主要版本= 4次版本= 01:

updateHeader version.h MAJOR_VERSION=4 MINOR_VERSION=01 

或者你可以只更新修订版本1,并指定该文件的不同路径:

updateHeader "c:\somePath\version.h" REVISION_VERSION=1 

可以指定尽可能多的替换,只要每一行要被替换的形式为#define VARIABLE value ...。空格的数量可以变化