- 引言
- Part 1 – 開始
- Part 2 – 變量
- Part 3 – 返回值
- Part 4 – 標(biāo)準(zhǔn)輸入輸出
- Part 5 – If 語句
- Part 6 – 循環(huán)語句
- Part 7 – 函數(shù)
- Part 8 – 解析輸入
- Part 9 – 日志
- Part 10 – 高級技巧
今天來講一下腳本的返回值侧蘸,返回值是與外界溝通的唯一方式邪蛔。 然而,即使熟練的Windows程序員也忽略了返回碼的重要性惠奸。
Return Code Conventions
通常情況下魄梯,命令行程序執(zhí)行成功會返回 0 桨螺,執(zhí)行錯誤會返回非0的數(shù)字。 警告信息則不影響返回值酿秸。重要的是腳本是否工作灭翔。
Checking Return Codes In Your Script Commands
%ERRORLEVEL%
環(huán)境變量存儲了上一次程序返回的代碼。ECHO
辣苏、IF
和SET
將保留%ERRORLEVEL%
的現(xiàn)有值肝箱,這是一個非常有用的特性哄褒。
常用的做法是使用IF
語句中的NEQ
(不等于)運(yùn)算符來檢查腳本的返回值:
IF %ERRORLEVEL% NEQ 0 (
REM do something here to address the error
)
還有一種做法:
IF ERRORLEVEL 1 (
REM do something here to address the error
)
如果腳本的返回值大于1,則 ERRORLEVEL 1
表達(dá)式為真狭园。 最好不使用這種方法读处,有時候腳本也會返回一些負(fù)數(shù)。
有時可能需要檢查腳本返回的具體值唱矛, 例如測試一個可執(zhí)行程序是否加入了PATH
環(huán)境變量,可以判斷返回代碼是否為 9009
SomeFile.exe
IF %ERRORLEVEL% EQU 9009 (
ECHO error -SomeFile.exe not found in your PATH
)
事先很難知道返回的究竟是什么井辜,通常是使用一些錯誤的試驗(yàn)來確定返回的究竟是什么绎谦。記住,這不是一種很好的編程方式粥脚,一點(diǎn)也不完美窃肠,但是它能解決問題 :joy:
Conditional Execution Using the Return Code
有一種非常炫酷的方法,根據(jù)第一條語句執(zhí)行的結(jié)果來執(zhí)行隨后的語句刷允。前邊的程序或者腳本必須返回成功(0)或者失斣┝簟(非0)的標(biāo)志。
在腳本執(zhí)行成功后執(zhí)行跟隨的命令树灶,可以使用&&
操作符:
SomeCommand.exe && ECHO SomeCommand.exe succeeded!
在腳本執(zhí)行失敗后執(zhí)行跟隨的命令纤怒,可以使用||
操作符:
SomeCommand.exe || SomeCommand.exe failed with return code %ERRORLEVEL%
默認(rèn)情況下,當(dāng)發(fā)生錯誤時天通,命令處理器還會繼續(xù)執(zhí)行泊窘。 你必須編寫代碼停止它。
停止程序非常簡單的一個做法是使用EXIT
命令和/B
開關(guān)(退出當(dāng)前運(yùn)行的腳本像寒,而不是命令提示符窗口烘豹,如果不加/B
,會退出整個命令提示符窗口)诺祸。同時傳遞一個非零的數(shù)字通知調(diào)用者腳本執(zhí)行失敗了携悯。
SomeCommand.exe || EXIT /B 1
還有一種方法是使用GOTO
跳轉(zhuǎn)至 :EOF
(End-Of-File)。跳轉(zhuǎn)到腳本末筷笨,腳本將結(jié)束憔鬼,并返回 1。
SomeCommand.exe || GOTO :EOF
Tips and Tricks for Return Codes
建議堅(jiān)持使用0
作為腳本成功執(zhí)行的返回值奥秆。正數(shù)作為失敗返回逊彭。這樣就能使用IF ERRORLEVE 1
的用法來判斷腳本是否正常執(zhí)行了。同時构订,也建議使用SET
命令侮叮,在腳本的頂部定義錯誤的返回值,增強(qiáng)可讀性悼瘾,例如:
SET /A ERROR_HELP_SCREEN=1
SET /A ERROR_FILE_NOT_FOUND=2
Note: 之前講過囊榜,變量名最好使用小寫审胸,但是因?yàn)镈OS不支持常量,這里使用大寫目的是為了表示卸勺,這些是不經(jīng)常改動的常量砂沛。
Some Final Polish
一個小技巧,返回的值是2的N次冪曙求。
SET /A ERROR_HELP_SCREEN=1
SET /A ERROR_FILE_NOT_FOUND=2
SET /A ERROR_FILE_READ_ONLY=4
SET /A ERROR_UNKNOWN=8
如果需要記錄大量的錯誤信息在一個返回值碍庵,可以通過按位或,將錯誤編碼加在一起悟狱。
@ECHO OFF
SETLOCAL ENABLEEXTENSIONS
SET /A errno=0
SET /A ERROR_HELP_SCREEN=1
SET /A ERROR_SOMECOMMAND_NOT_FOUND=2
SET /A ERROR_OTHERCOMMAND_FAILED=4
SomeCommand.exe
IF %ERRORLEVEL% NEQ 0 SET /A errno^|=%ERROR_SOMECOMMAND_NOT_FOUND%
OtherCommand.exe
IF %ERRORLEVEL% NEQ 0 (
SET /A errno^|=%ERROR_OTHERCOMMAND_FAILED%
)
EXIT /B %errno%
如果SomeCommand.exe
和OtherCommand.exe
都失敗了静浴,返回值將是6,這樣就能根據(jù)6推斷出挤渐,哪些步驟出現(xiàn)了錯誤苹享。