您好我正在尝试编写一个脚本来更新标题/文本文件中的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 ----------------------
答案 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 ...
形式。空格的数量可以变化。