批次處理指令碼偵錯


通常情況下,執行批次處理檔案時可能會遇到問題,而且大多數情況下都需要以某種方式偵錯批次處理檔案,以確定是批次處理檔案本身的問題。 以下是一些可以幫助偵錯批次處理指令碼檔案的技術。

錯誤訊息

要找出訊息的來源,請按照下列步驟操作 -

第1步 - 移除REM @ECHO OFF,即REM @ECHO OFF:: @ECHO OFF
第2步 - 使用必要的命令列引數執行批次處理檔案,將所有輸出重定向到紀錄檔檔案以供以後比較。

test.bat > batch.log 2>&1

第3步 - 在檔案batch.log中搜尋錯誤訊息

第4步 - 檢查上一行是否有任何意外或無效的命令,命令列開關或值; 要特別注意命令中使用的任何環境變數的值。

第5步 - 糾正錯誤並重複此過程,直到所有錯誤訊息都消失。

複雜的命令列

另一個常見的錯誤來源是不正確的重定向命令,例如,使用不正確的搜尋字串「巢狀」 FINDFINDSTR命令,有時在FOR / F迴圈中。

要檢查這些複雜命令的有效性,請按照下列步驟操作 -

第1步 - 在使用複雜命令集的行之前插入「命令檢查行」。

以下是插入ECHO命令以標記第一個TYPE命令的輸出結束和下一個開始的位置的範例。

TYPE %Temp%.\apipaorg.reg
ECHO.================================================ TYPE %Temp%.\apipaorg.reg 
| FIND 
"[HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\TCPIP\Parameters\Interfaces\"

第2步 - 按照程式查詢上述錯誤訊息來源。

第3步 - 特別注意「簡化」命令列的輸出:預期格式的輸出是什麼? 「令牌」值或位置是否如預期的那樣?

子程式

生成錯誤訊息的子例程在查詢錯誤原因時會帶來額外的「挑戰」,因為它們可能在同一個批次處理檔案中被多次呼叫。

為了找出是什麼導致不正確的呼叫子程式,請按照下列步驟 -

第1步 - 在指令碼的開頭新增並重置一個計數器變數 -

SET Counter=0

第2步 - 每次呼叫子程式時遞增計數器,在子程式的開始插入以下行 -

SET /A Counter+=1

第3步 - 在計數器遞增之後插入另一行,僅包含SET命令; 這將列出所有的環境變數及其值。

第4步 - 按照程式查詢上述錯誤訊息源。

Windows版本

如果打算將批次處理檔案分發給可能執行或不可執行相同Windows版本的其他計算機,則需要盡可能多的Windows版本測試批次處理檔案。

以下範例顯示如何檢查各種作業系統版本以檢查相關的Windows版本。

@ECHO OFF
:: Check for Windows NT 4 and later

IF NOT "%OS%"=="Windows_NT" GOTO DontRun
:: Check for Windows NT 4
VER | FIND "Windows NT" >NUL && GOTO DontRun
:: Check for Windows 2000
VER | FIND "Windows 2000" >NUL && GOTO DontRun
:: Place actual code here . . .
:: End of actual code . . .
EXIT

:DontRun
ECHO Sorry, this batch file was written for Windows XP and later versions only