2016-08-11 4 views
0

バージョン番号を増やすためにバッチファイルを書くつもりですが、 "for/f"とその動作について混同しています。コマンドプロンプトを使用してテストすると、バッチファイルです。これで私を助けてください。 は、ここに私のバッチファイルバッチファイルを使ってファイルにバージョン番号を読み書きする

for /f "tokens=2,3 " %%i in (version.h) do (
    set /a number=%%j+1 
    echo %%i 
    echo %%j 
    echo %number% 
    if %%i==REVISION (
     echo line1 
     echo #define %%i "%number%" >> temp.file 
    ) else (
     echo line2 
     echo #define %%i %%j >> temp.file 
    ) 
) 
del /q version.h 
ren temp.file version.h 

だと、ここでバッチファイルのみが最初の実行(の#define REVISION「243」)で正しい結果を生成することができます

#define MAJOR "1" 
#define MINOR "0" 
#define REVISION "242" 

私version.hをだ、と奇妙なを持っています2回目の実行結果(#define REVISION "0")。 3回目の結果は正しいですが(#define REVISION 244)、4回目の実行は再び奇妙になります(#define REVISION "1"など)。 正しい文字列を解析しなかったようです コマンドプロンプトで「for /?」と入力してもヘルプメッセージを読みましたが、それでも理解できない場合は、この手助けをしてください。

+3

[遅延拡張問題](http://stackoverflow.com/a/30284028/2152082) – Stephan

+0

コメントありがとうございます!私は最終的に私の問題の根本原因を見つけました! – lesner

答えて

0

次のとおりですスクリプトは、目的のファイルに存在する空行や特殊文字を保存します。一時ファイルは存在せず、ファイルの変更はその場で行われます。

コードは次のとおりです。仕組み:

@echo off 
setlocal EnableExtensions DisableDelayedExpansion 

rem // Define constants here: 
set "FILE=%~1" & rem // (provide the target file as command line argument) 
set "DIRECTIVE=#define" & rem // (name of the directive to search) 
set "DEFINITION=REVISION" & rem // (name of the definition to search) 
set "CASESENS=" & rem // (set to non-empty for case-sensitive searches) 
set "QUOTED="^" & rem // (set to non-empty for quoting returned number) 

rem // Resolve arguments and options: 
if not defined FILE ((>&2 echo ERROR: no file specified!) & exit /B 1) 
if defined CASESENS (set "CASESENS=") else (set "CASESENS=/I") 
if defined QUOTED (set "QUOTED="^") else (set "QUOTED=") 

rem // Loop through all lines in the target file: 
setlocal EnableDelayedExpansion 
for /F delims^=^ eol^= %%L in (' 
    rem/ /* Prefix lines with line numbers to not lose empty ones; ^&^
    rem/ after having read file, deplete its entire content: */ ^&^
    findstr /N /R "^^" "!FILE!" ^& ^> "!FILE!" break 
') do (
    endlocal 
    set "FLAG=" 
    set "LINE=%%L" 
    rem // Split line into three tokens: 
    for /F "tokens=1-3 eol= " %%I in ("%%L") do (
     set "FIELD1=%%I" 
     set "FIELD2=%%J" 
     set "NUMBER=%%~K" 
     setlocal EnableDelayedExpansion 
     rem // Check first token for matching directive name: 
     if %CASESENS% "!FIELD1:*:=!"=="!DIRECTIVE!" (
     rem // Check second token for matching definition name: 
      if %CASESENS% "!FIELD2!"=="!DEFINITION!" (
       endlocal 
       rem // Increment number of third token: 
       set /A "NUMBER+=1" 
       set "FLAG=#" 
       setlocal EnableDelayedExpansion 
      ) 
     ) 
     endlocal 
    ) 
    setlocal EnableDelayedExpansion 
    rem // Write output line into target file: 
    >> "!FILE!" (
     rem // Check whether dirctive and definition matched: 
     if defined FLAG (
      rem // Match found, so write new line with incremented number: 
      echo(!DIRECTIVE! !DEFINITION! %QUOTED%!NUMBER!%QUOTED% 
     ) else (
      rem // No match found, so write original line: 
      echo(!LINE:*:=! 
     ) 
    ) 
) 
endlocal 

endlocal 
exit /B 
+0

あなたのコードとあなたのコメントをありがとう!これは役に立ちます!再度、感謝します! – lesner

関連する問題