17

後でTOMCAT_VERの値にアクセスしようとしていますが、空の文字列として表示されます。

if exist "%_REALPATH%\tomcat-%TOMCAT_VER2%" (
  set CATALINA_HOME=%_REALPATH%\tomcat-%TOMCAT_VER2%
  set TOMCAT_VER=%TOMCAT_VER2%
  echo "%TOMCAT_VER%"
) else if exist "%TOMCAT_VER2%" (
  set CATALINA_HOME="%TOMCAT_VER2%"
  set TOMCAT_VER="%TOMCAT_VER2%"
  echo "%TOMCAT_VER%"
)

さらにデバッグするために、設定された場所のすぐ下にechoステートメントを挿入しましたが、機能していないようです。エコーオフを無効にすると、これらの変数が設定されていることを示すステートメントを見ることができますが、それらを印刷できないようです。

4

1 に答える 1

30

bbb(バッチ初心者のバグ)が見つかりましたが、変数が空ではありません。期待どおりに機能しないのは拡張です。

パーセント展開は、コードが実行される前に、行または完全な括弧ブロックが解析されるときに実行されます。しかし、これを解決するには、遅延拡張
を使用できます。これは、解析時に拡張されるのではなく、実行時にのみ拡張されます。

EnableDelayedExpansionは、変数を展開するための追加の構文!var!を追加します。
パーセント拡張%var%はまだ利用可能であり、遅延拡張によって変更されません。
の遅延展開は、式が実行されたときに実行され!var!ますが、ブロック内のコマンドが実行される前に、解析の瞬間(完全なコードブロック)に展開されます。%var%

setlocal EnableDelayedExpansion

if exist "!_REALPATH!\tomcat-!TOMCAT_VER2!" (
  set "CATALINA_HOME=!_REALPATH!\tomcat-!TOMCAT_VER2!"
  set "TOMCAT_VER=!TOMCAT_VER2!"
  echo !TOMCAT_VER!
) else if exist "!TOMCAT_VER2!" (
  set "CATALINA_HOME=!TOMCAT_VER2!"
  set "TOMCAT_VER=!TOMCAT_VER2!"
  echo !TOMCAT_VER!
)
于 2013-01-15T21:19:35.877 に答える