1

ファームウェアの自動ビルドを開始するためのバッチ ファイルを作成しています。

現在、TFS(Team Foundation Server)からコードを取得してからビルドしています(ツールはEclipseベースです)。

ただし、コードをビルドする前に、ファイル version.h に格納されているバージョン番号をインクリメントしたいと考えています。ファイルの内容は次のとおりです。

/* $Header: /NG EM Controller Firmware Eclipse based/APPS/EM MAIN/version.h 2     4/25/13 10:19a user $
 */

#ifndef Version_h
#define Version_h

#define DSP_FW_VERSION 500
#define DSP_FW_ID 22
#define DESTINATION 1

#endif 

/*
 * More comments, the number increases with each check in*./

行 #define DSP_FW_VERSION 500 は、インクリメントする必要がある行です (この場合は 501 に)。

私はバッチファイルに非常に慣れておらず、学習しながら学んでいますが、これには困惑しています。各行をコピーして必要な行を変更する必要はなく、元の行を操作したいだけです。

助けや指導をありがとう。

4

5 に答える 5

3

これを試してください(純粋なバッチ):

@ECHO OFF &SETLOCAL ENABLEDELAYEDEXPANSION
SET "HFile=file"
SET "search=#define DSP_FW_VERSION"

FOR /f %%a IN ('^<"%HFile%" find /c /v ""') DO SET /a lines=%%a
< "%HFile%" (
FOR /l %%a IN (1,1,%lines%) DO (
     SET "line="
     SET /p "line="
     IF NOT "!line!"=="" IF NOT "!line:%search%=!"=="!line!" (
          SET /a replace=!line:%search%=!+1
          SET "line=%search% !replace!"
     )
     ECHO(!line!
))>"%HFile%.new"
MOVE /y "%HFile%.new" "%HFile%"
TYPE "%HFile%"
于 2013-08-07T05:42:41.067 に答える
1

ワンライナー (1 つのプロセスのみ)で移植可能な方法:

perl -i -pe '
    BEGIN{$re = qr!^(/\*\s+\$Header:.*?version\.h\s+)(\d+)!};
    $re and s@$re@sprintf "%s%d", $1, $2+1@e
' file.h

-i少しだけ試してみたい場合は、スイッチを取り外してください。

于 2013-08-07T04:33:30.927 に答える
1
@ECHO OFF
SETLOCAL
SET "sourcedir=."
SET targetfile=version.h
SET newversion=%1
IF NOT DEFINED newversion ECHO require new version number as parameter&GOTO :EOF
IF NOT EXIST "%sourcedir%\%targetfile%" ECHO %targetfile% not found&GOTO :eof
DEL "%sourcedir%\%targetfile%_before_%newversion%" >NUL
ren "%sourcedir%\%targetfile%" "%targetfile%_before_%newversion%"

(
 FOR /f "delims=" %%a IN (
  ' FINDSTR /n /R "$" "%sourcedir%\%targetfile%_before_%newversion%" '
  ) DO (
   SET "line=%%a"
   SETLOCAL ENABLEDELAYEDEXPANSION
   SET line=!line:*:=!
   IF "!line:~0,23!"=="#define DSP_FW_VERSION " SET line=!line:~0,23!%newversion%
   ECHO(!line!
   endlocal
 )
)>"%sourcedir%\%targetfile%"

FC "%sourcedir%\%targetfile%" "%sourcedir%\%targetfile%_before_%newversion%"
GOTO :EOF

上記のバッチは、新しいバージョン番号のパラメーターを使用して実行することを目的としています。

既存の名前を に変更し、version.h空の行を含めversion.h_before_newversionnumberてファイルを再生成する必要がありversion.hますが、ターゲット行を置き換える 1 つの例外があります。

最後のFCコマンドは、本番前の激しいテスト中にファイルの前後のバージョンを比較することのみを目的としています...

于 2013-08-07T05:39:53.337 に答える
0
line=`grep -E '#define DSP_FW_VERSION' version.h`
fst=$[line% *}
snd=${line##* }
nvno=`echo "${snd##* } + 1" | bc`
sed "s/$line/$fst $nvno/" version.h

最初の行は、変更する行を見つけます。防御的にプレイして、1行だけが見つかるようにすることをお勧めします。2 行目は行の先頭を分割し、3 行目は最後の部分を 2 つの変数に分割します。4 行目は、「bc」を使用してバージョン番号を増やします。最後の部分は、最初の部分とインクリメントされた 2 番目の部分を再組み立てすることによって、version.h に変更を加えます。少し見にくいですが、bash で動作するはずです (cygwin が必要です)。

于 2013-08-07T04:12:50.680 に答える
0

のコード:

awk "$2 ~ /DSP_FW_VERSION/ {$3++};1" file

Windows用のawk

于 2013-08-07T05:58:54.873 に答える