- 引言
- Part 1 – 開始
- Part 2 – 變量
- Part 3 – 返回值
- Part 4 – 標準輸入輸出
- Part 5 – If 語句
- Part 6 – 循環語句
- Part 7 – 函數
- Part 8 – 解析輸入
- Part 9 – 日志
- Part 10 – 高級技巧
今天來講一下腳本的返回值,返回值是與外界溝通的唯一方式。 然而,即使熟練的Windows程序員也忽略了返回碼的重要性。
Return Code Conventions
通常情況下,命令行程序執行成功會返回 0 ,執行錯誤會返回非0的數字。 警告信息則不影響返回值。重要的是腳本是否工作。
Checking Return Codes In Your Script Commands
%ERRORLEVEL%
環境變量存儲了上一次程序返回的代碼。ECHO
、IF
和SET
將保留%ERRORLEVEL%
的現有值,這是一個非常有用的特性。
常用的做法是使用IF
語句中的NEQ
(不等于)運算符來檢查腳本的返回值:
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
表達式為真。 最好不使用這種方法,有時候腳本也會返回一些負數。
有時可能需要檢查腳本返回的具體值, 例如測試一個可執行程序是否加入了PATH
環境變量,可以判斷返回代碼是否為 9009
SomeFile.exe
IF %ERRORLEVEL% EQU 9009 (
ECHO error -SomeFile.exe not found in your PATH
)
事先很難知道返回的究竟是什么,通常是使用一些錯誤的試驗來確定返回的究竟是什么。記住,這不是一種很好的編程方式,一點也不完美,但是它能解決問題 :joy:
Conditional Execution Using the Return Code
有一種非常炫酷的方法,根據第一條語句執行的結果來執行隨后的語句。前邊的程序或者腳本必須返回成功(0)或者失敗(非0)的標志。
在腳本執行成功后執行跟隨的命令,可以使用&&
操作符:
SomeCommand.exe && ECHO SomeCommand.exe succeeded!
在腳本執行失敗后執行跟隨的命令,可以使用||
操作符:
SomeCommand.exe || SomeCommand.exe failed with return code %ERRORLEVEL%
默認情況下,當發生錯誤時,命令處理器還會繼續執行。 你必須編寫代碼停止它。
停止程序非常簡單的一個做法是使用EXIT
命令和/B
開關(退出當前運行的腳本,而不是命令提示符窗口,如果不加/B
,會退出整個命令提示符窗口)。同時傳遞一個非零的數字通知調用者腳本執行失敗了。
SomeCommand.exe || EXIT /B 1
還有一種方法是使用GOTO
跳轉至 :EOF
(End-Of-File)。跳轉到腳本末,腳本將結束,并返回 1。
SomeCommand.exe || GOTO :EOF
Tips and Tricks for Return Codes
建議堅持使用0
作為腳本成功執行的返回值。正數作為失敗返回。這樣就能使用IF ERRORLEVE 1
的用法來判斷腳本是否正常執行了。同時,也建議使用SET
命令,在腳本的頂部定義錯誤的返回值,增強可讀性,例如:
SET /A ERROR_HELP_SCREEN=1
SET /A ERROR_FILE_NOT_FOUND=2
Note: 之前講過,變量名最好使用小寫,但是因為DOS不支持常量,這里使用大寫目的是為了表示,這些是不經常改動的常量。
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,這樣就能根據6推斷出,哪些步驟出現了錯誤。