批处理脚本,用于更新文本文件中的版本号值

时间:2016-11-23 15:46:35

标签: batch-file

您好我正在尝试编写一个脚本来更新标题/文本文件中的MAJOR和MINOR版本号,我正在尝试使用" FOR / F"命令,但出于想法。 下面是我需要更新对应于" MAJOR_VERSION"的值的Header文件。和" 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 ----------------------

3 个答案:

答案 0 :(得分: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

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

答案 1 :(得分: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的文件,其中包含我的测试数据。

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

您可以以显而易见的方式扩展提取的值,扩展项目列表

答案 2 :(得分: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]...。变量名称区分大小写。

例如,要更新文件&#34; version.h&#34;主版本= 4,次版本= 01:

updateHeader version.h MAJOR_VERSION=4 MINOR_VERSION=01

或者您可以仅将修订版本更新为1,并为文件指定不同的路径:

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

您可以指定任意数量的替换,只要要替换的每一行都具有#define VARIABLE value ...形式。空格的数量可以变化。