Windows 批處理腳本指南: 返回值

今天來講一下腳本的返回值侧蘸,返回值是與外界溝通的唯一方式邪蛔。 然而,即使熟練的Windows程序員也忽略了返回碼的重要性惠奸。

Return Code Conventions


通常情況下魄梯,命令行程序執(zhí)行成功會返回 0 桨螺,執(zhí)行錯誤會返回非0的數(shù)字。 警告信息則不影響返回值酿秸。重要的是腳本是否工作灭翔。

Checking Return Codes In Your Script Commands


%ERRORLEVEL% 環(huán)境變量存儲了上一次程序返回的代碼。ECHO辣苏、IFSET將保留%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.exeOtherCommand.exe 都失敗了静浴,返回值將是6,這樣就能根據(jù)6推斷出挤渐,哪些步驟出現(xiàn)了錯誤苹享。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市浴麻,隨后出現(xiàn)的幾起案子得问,更是在濱河造成了極大的恐慌,老刑警劉巖软免,帶你破解...
    沈念sama閱讀 216,744評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件宫纬,死亡現(xiàn)場離奇詭異,居然都是意外死亡或杠,警方通過查閱死者的電腦和手機(jī)哪怔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來向抢,“玉大人认境,你說我怎么就攤上這事⌒” “怎么了叉信?”我有些...
    開封第一講書人閱讀 163,105評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長艘希。 經(jīng)常有香客問我硼身,道長,這世上最難降的妖魔是什么覆享? 我笑而不...
    開封第一講書人閱讀 58,242評論 1 292
  • 正文 為了忘掉前任佳遂,我火速辦了婚禮,結(jié)果婚禮上撒顿,老公的妹妹穿的比我還像新娘丑罪。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,269評論 6 389
  • 文/花漫 我一把揭開白布吩屹。 她就那樣靜靜地躺著跪另,像睡著了一般。 火紅的嫁衣襯著肌膚如雪煤搜。 梳的紋絲不亂的頭發(fā)上免绿,一...
    開封第一講書人閱讀 51,215評論 1 299
  • 那天,我揣著相機(jī)與錄音擦盾,去河邊找鬼嘲驾。 笑死,一個胖子當(dāng)著我的面吹牛厌衙,可吹牛的內(nèi)容都是我干的距淫。 我是一名探鬼主播,決...
    沈念sama閱讀 40,096評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼婶希,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蓬衡?” 一聲冷哼從身側(cè)響起喻杈,我...
    開封第一講書人閱讀 38,939評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎狰晚,沒想到半個月后筒饰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,354評論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡壁晒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,573評論 2 333
  • 正文 我和宋清朗相戀三年瓷们,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片秒咐。...
    茶點(diǎn)故事閱讀 39,745評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡谬晕,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出携取,到底是詐尸還是另有隱情攒钳,我是刑警寧澤,帶...
    沈念sama閱讀 35,448評論 5 344
  • 正文 年R本政府宣布雷滋,位于F島的核電站不撑,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏晤斩。R本人自食惡果不足惜焕檬,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,048評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望澳泵。 院中可真熱鬧实愚,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,683評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至兔仰,卻和暖如春茫负,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背乎赴。 一陣腳步聲響...
    開封第一講書人閱讀 32,838評論 1 269
  • 我被黑心中介騙來泰國打工忍法, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人榕吼。 一個月前我還...
    沈念sama閱讀 47,776評論 2 369
  • 正文 我出身青樓饿序,卻偏偏與公主長得像,于是被迫代替她去往敵國和親羹蚣。 傳聞我的和親對象是個殘疾皇子原探,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,652評論 2 354

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)顽素,斷路器咽弦,智...
    卡卡羅2017閱讀 134,652評論 18 139
  • 個人學(xué)習(xí)批處理的初衷來源于實(shí)際工作;在某個迭代版本有個BS(安卓手游模擬器)大需求胁出,從而在測試過程中就重復(fù)涉及到...
    Luckykailiu閱讀 4,717評論 0 11
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法型型,類相關(guān)的語法,內(nèi)部類的語法全蝶,繼承相關(guān)的語法闹蒜,異常的語法,線程的語...
    子非魚_t_閱讀 31,624評論 18 399
  • “過度總結(jié)癥”是一種“低維思考”的產(chǎn)物在他瓜哥(Taguage)過去的點(diǎn)博里多次提到了“過度總結(jié)癥”這個話題抑淫,需要...
    那未必閱讀 1,361評論 1 25
  • 第一次認(rèn)識他丈冬,是在2013年的《中國好歌曲》嘱函,一個靦腆安靜的男孩,彈著吉他埂蕊,哼唱那首寂寞夜空里的《畫》往弓。那一期沒有...
    鑫姐姐閱讀 390評論 0 0