2011年8月11日

在 Batch 的 For-loop 中,為何 %ERRORLEVEL% 沒有傳回正確值?

今天寫一個小腳本 (Windows Batch Scripting),當中須要把幾個 Image 檔案找出來並 Resize。但其中有些檔案不須處理,如檔案名字有 "_thumb"。所以寫了以下的腳本:

for %%a in ("%DEST_IMAGE_HDPI%\default_wallpaper*.*") do (
 echo %%a | findstr /C:"%THUMBNAIL_SUFFIX%" > nul
 IF %errorlevel% NEQ 0 (
  echo Process this file: %%a
 )
)

但是以上的腳本不能運作 -- %ERRORLEVEL% 永遠回傳 "0" 值!
Google 了一下並找到解決方法:
http://www.computing.net/answers/programming/batch-for-loop-errorlevel/13528.html

跟據 IVO 的意思,FOR-Loop 裡的環境變數 (Environment variables) 會維持在最初的值,除非在腳本中啟用 "Delayed Expansion of Variables"。並將 FOR-Loop 內的全域值: %...% 變成 !...!
修改腳本後如下:


SetLocal EnableDelayedExpansion

for %%a in ("%DEST_IMAGE_HDPI%\default_wallpaper*.*") do (
 echo %%a | findstr /C:"%THUMBNAIL_SUFFIX%" > nul
 IF !errorlevel! NEQ 0 (
  echo Process this file: %%a
 )
)

EndLocal

一般 "SetLocal" 在腳本開始時加入,結束時用 "EndLocal"

沒有留言:

發佈留言