12. IF 三招
• IF ERRORLEVEL 3
– exit code >= 3
• IF foo == bar
– 陷阱很多
• IF EXIST file
所以要從大的挑到小的。
12
13. 陷阱:小心 空變數 與 空白字元 (1)
SET VAR=
IF %VAR% == foo (
ECHO OK
)
這個時候不應有 (。
IF == foo (
SET VAR=foo bar
IF _%VAR% == _foo (
ECHO OK
)
這個時候不應有 bar。
IF _foo bar == _foo (
IF _ == _foo ( IF "foo bar" == foo (
13
14. 陷阱:小心 空變數 與 空白字元 (2)
SET VAR=foo bar
IF "%VAR%"=="foo bar" (
ECHO OK
)
OK
IF "foo bar" == "foo bar" (
SET VAR="foo bar"
IF "%VAR%"=="foo bar" (
ECHO OK
)
這個時候不應有 bar""=="foo
bar"。
IF ""foo bar""=="foo bar" (
快不行了…只有 %~1 可以去引號算是正解了
正正解:IF "%~1"=="foo" ( 14
15. FOR 四式
FOR … %%I IN (…) DO …
• FOR 清單 (空白分隔的變數)
• FOR /D, FOR /R 檔案 (遞迴)
• FOR /L 數數字
• FOR /F 資料剖析
在 .bat 裡要才 %%
15
16. 應用例:從一加到十
SET SUM=0
FOR /L %%I IN (1,1,10) DO (
SET /A SUM+=%%I
)
ECHO %SUM%
55
(begin, step, end)
SET /A 還能夠算數喔!
16
17. 應用例:讀取設定檔
FOR /F %%I IN (config.ini) DO SET %%I
ECHO apple=%apple%, banana=%banana%, cherry=%cherry%
apple=1, banana=8, cherry=3
config.ini
apple = 1
banana = 8
cherry = 3
17
18. 陷阱:延遲環境變數展開 (需 CMD /V:ON)
SET SUM=0
FOR /L %%I IN (1,1,10) DO (
SET /A SUM+=%%I
ECHO %SUM%
)
0
0
0
0
0
0
0
0
0
0
!SUM!
1
3
6
10
15
21
28
36
45
55
18
23. 更多討論
• PATH 變數內,路徑即使有空白字元也不能加雙引號。
• SET ERRORLEVEL 令 %ERRORLEVEL% 不如往常。
• 含空白字元的字串串接小祕訣
這樣也行:C:"Program Files"Java
• Windows 其實支援 symbolic link 了 (MKLINK /?)
C:ProgramDataOracleJavajavapath 是為一例
• 在 Makefile 裡,指令不能是大寫。
23
24. 衍生閱讀
• 善用 Command /?
– HELP 看支援的指令;SET 看可用的環境變數。
• Rob van der Woude’s Scripting Pages
http://www.robvanderwoude.com/batchfiles.php
• PowerShell
Windows 下一代的腳本語言
24