Problem
這故事是發生在重新開機後,Windows啟動網卡的速度實在太慢,造成ant的get task發生問題。已試過設定retries property,但無法解決問題。因此改透過batch的方式,確認網路連線正常後才去執行我們要執行的工作。
How to?
直覺的方法就是透過ping指令,並確認目標主機可以連線即可。為了避免語系問題,一開始我就使用chcp將語系切成英文。
chcp 437 set CHECK_HOST=www.yahoo.com.tw ping %CHECK_HOST% -w 1000 -n 2 | find "Reply from"
接著透過for迴圈與label做結果確認與Retry,當然Retry是需要最大限度的,直接看看完整的batch吧!
@echo off chcp 437 set CHECK_HOST=tonylin.idv.tw set CMD_CHECK_HOST=ping %CHECK_HOST% -w 1000 -n 2 ^^^| find "Reply from" set MAX_TIMES=5 set /a "COUNT=0" :CHECK_CONNECTION for /f "usebackq tokens=*" %%r in (`%CMD_CHECK_HOST%`) do ( goto :DO_JOB ) set /a "COUNT = COUNT + 1" if "%COUNT%" == "%MAX_TIMES%" ( echo Retry a connection to %CHECK_HOST% failed. Force to do the job. goto :EXIT ) echo Retry a connection to %CHECK_HOST% %COUNT% time(s) timeout 1 > NUL goto :CHECK_CONNECTION :DO_JOB echo DONE! :EXIT
我設定MAX_TIMES為最大限制次數,COUNT為重試次數。在每次執行失敗後,COUNT都會加一,直它達到MAX_TIMES後,就會跳到:EXIT。另外,每次執行失敗,我都會透過timeout指令來做sleep動作。當目標可以正常連線後,就會進入for迴圈,接著跳至:DO_JOB。
友藏內心獨白: 往往簡單的script,可以讓許多工作更為可靠!
留言
張貼留言