2016-11-23 17 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という名前のファイルを使用しました。

デフォルトを使用して各行をトークン化します。 2番目のトークンの文字列(itemlistで選択された値)は、3番目のトークンの値をとる必要があります。

あなたは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 

最初の引数がファイルへのパスであることがわかりますhichは必須です。残りの各引数は、バージョン番号キーワード(#definedディレクティブの後に表示されます)と関連する新しいバージョン番号をコロンで区切って指定します。これらはすべてオプションの引数です。

+0

Voila !!それは働きました、それは私がそれを期待していたようにメジャーとマイナー番号を更新します。ありがとうございました。 – Dinesh

+0

あなたは大歓迎です!これをチェックしてください:[私の質問に誰かが答えるときに私はどうしたらいいですか?](http://stackoverflow.com/help/someone-answers) – aschipfl

0

ここにはJREPL.BAT - a regular expression find/replace utilityを使用する単純なスクリプトがあります。 JREPLは純粋なscrpt(ハイブリッドバッチ/ JScript)で、XP以降のWindowsマシンでネイティブに実行されます。サードパーティのexeファイルは必要ありません。完全なドキュメントはコマンドラインからjrepl /?、またはjrepl /??を使用してページングされたヘルプをご覧ください。

@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 - 

updateHeader.bat

バッチスクリプトは、コマンドライン引数を解析します。置き換えられる変数名のリスト(単純な正規表現の変更)を作成し、指定された変数ごとに環境変数も設定します。 JREPL呼び出しは、各値を対応する環境変数の値で置き換えます。

上記のスクリプトを使用する構文はupdateHeader File Variable=Value[ Variable=Value]...です。変数名では大文字と小文字が区別されます。

たとえば、ファイル "version"を更新します。メジャーバージョン= 4とマイナーバージョンとの時間」= 01:

updateHeader version.h MAJOR_VERSION=4 MINOR_VERSION=01 

それとも1にちょうど改訂版を更新し、ファイルに別のパスを指定することができます。

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

あなたが指定することができます

関連する問題