DOS script 裡迴圈的神奇語法

原本在 linux 上跑得好好的 shell,
突然因為需要得搬到 windows server 上跑
只好把它改成 .bat

一個很 ez 的迴圈 assign classpath 的動作
在 dos 上居然怎麻跑都不對勁,
剛改完的 .bat :

@echo off
set CLASSPATH=.;c:\tomcat\webapps\abc\WEB-INF\classes
set MYDIR=d:\tmp\cd
for %%x in (%MYDIR%\*.jar) do (
  echo %%x
  set CLASSPATH=!CLASSPATH!;%%x
  echo %CLASSPATH%
)
echo %CLASSPATH%
執行結果 :

E:\tmp>test.bat
d:\tmp\cd\common-lib1.jar
.;c:\tomcat\webapps\abc\WEB-INF\classes
d:\tmp\cd\common-lib2.jar
.;c:\tomcat\webapps\abc\WEB-INF\classes
d:\tmp\cd\common-lib3.jar
.;c:\tomcat\webapps\abc\WEB-INF\classes
!CLASSPATH!;d:\tmp\cd\common-lib3.jar
感覺只有最後一次迴圈的 assign 有作用,
google 了半天, 發現這個東東 ...

setlocal enabledelayedexpansion

一加上去馬上 work, 至於解釋, 看嘸, 也懶得看了 >__<

@echo off
setlocal enabledelayedexpansion
set CLASSPATH=.;c:\tomcat\webapps\abc\WEB-INF\classes
set MYDIR=d:\tmp\cd
for %%x in (%MYDIR%\*.jar) do (
  echo %%x
  set CLASSPATH=!CLASSPATH!;%%x
  echo %CLASSPATH%
)
echo %CLASSPATH%

執行結果 :

E:\tmp>test.bat
d:\tmp\cd\common-lib1.jar
.;c:\tomcat\webapps\abc\WEB-INF\classes
d:\tmp\cd\common-lib2.jar
.;c:\tomcat\webapps\abc\WEB-INF\classes
d:\tmp\cd\common-lib3.jar
.;c:\tomcat\webapps\abc\WEB-INF\classes
.;c:\tomcat\webapps\abc\WEB-INF\classes;d:\tmp\cd\common-lib1.jar;d:\tmp\cd\common-lib2.jar;d:\tmp\cd\common-lib3.jar


WTF DOS !!!

沒有留言: