2016-11-23 75 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 ...。空格的數量可以變化