✔ 最佳答案
底下這個程式請編譯成 app1.exe
Option Explicit
Private Declare Sub ExitProcess Lib "KERNEL32" (ByVal uExitCode As Long)
Sub Main()
Dim ReturnCode As Long
ReturnCode = Val(InputBox("輸入返回值"))
ExitProcess ReturnCode '結束程式,並傳回返回值
End Sub
==============================
底下批次檔請存成 test.bat
@echo off
rem 執行第一個程式 app1.exe
app1
rem 根據程式返回值分支執行
rem 這裡分成 0,1,2,和3以上等情況, 可視需要增減
if errorlevel 3 goto s3
if errorlevel 2 goto s2
if errorlevel 1 goto s1
:s0
rem 你可在此安排 [狀況0] 要做的工作
echo ReturnCode=0
goto end
:s1
rem 你可在此安排 [狀況1] 要做的工作
echo ReturnCode=1
goto end
:s2
rem 你可在此安排 [狀況2] 要做的工作
echo ReturnCode=2
goto end
:s3
rem 你可在此安排 [狀況3] 要做的工作
echo ReturnCode = 3 or UP
goto end
:end
==============================
以上兩項工作皆備妥後,請在 DOS 輸入:
test
2011-10-03 23:01:11 補充:
雖然應用程式可輕易存取或新增環境變數,
但由於所使用的環境變數區段僅是一個「副本」,
所以在應用程式結束時,這些改變也同時拋棄,不會改變原來的「正本」。
當然透過修改系統登錄,也可改變環境變數的「正本」,
但那有後遺症,地雷不知何時引爆。
因此,較簡易的作法便是在應用程式結束時傳回返回值。
再配合DOS批次檔的 if errorlevel 來操作即可。
這在 C 的程式易達成:
int main( )
2011-10-03 23:07:00 補充:
(續上)
int main ( ) {
......
return retCode;
}
在VB6則因主程式是 Sub main 的架構,
無法像 C 那麼方便的 return 一個值,
得如上述答文引用 Windos API 的方式。
2011-10-04 10:13:38 補充:
>>rem app2會傳回 echo ReturnCode = 1 === 程式內直接設定 ReturnCode = 1
非也。
程式僅能直接設定某一返回值(正整數),而不是傳回 "echo ReturnCode = 1"
echo 就好像 print 一樣,僅是單純的顯示訊息而已,
if errorlevel N 語法是重點!
它是依據最近所執行應用程式的返回值來判斷這個 if 是否成立。
當返回值 [ 大於或等於N ] 時,成立。
這樣你便可理解為何在批次檔中一系列的 if errorleve N,其N的呈現順序是由大至小了。
2011-10-04 10:14:38 補充:
if errorlevel N 語法是本例運作的重點!
它是依據最近所執行應用程式的返回值來判斷這個 if 是否成立。
當返回值 [ 大於或等於N ] 時,成立。
這樣你便可理解為何在批次檔中一系列的 if errorleve N,其N的呈現順序是由大至小了。
2011-10-04 10:24:43 補充:
>>app2
>>echo ReturnCode = 1
>>pause
>>if errorlevel 1 GOTO LOVE_DOS
這樣的安排等於限定app2 的返回值是 1,那就失去動態規劃的意義了。
返回值存在二種以上時,才有動態規劃的必要。(拙文回答中是以4種為例)
特別再次提醒:返回值僅是一個「正整數」(包含零)。
批次檔配合一系列的 if errorlevel N 便可完成分派的工作。
2011-10-04 10:38:51 補充:
題目的原旨是想透過設定某一環境變數來完成動態規劃,
但誠如我在補充說明中所言的,滯礙難行。(不是不可行)
所以我逕自改成用返回值的方式來實作。
唯若 [溝通的訊息] 較複雜時,便得改用其他方式了!
人際間的溝通,不外是「傳遞訊息」。
程式間的溝通也是大同小異。
山不轉,路轉。窮則變,變則通。
事實上還是有方法來完成「較複雜訊息」的程式溝通,只是不適再論。
2011-10-04 12:54:59 補充:
補充意見007:
>>app2
>>echo ReturnCode = 1
>>pause
>>if errorlevel 1 GOTO LOVE_DOS
順序不恰當,因為 app2 的返回值不一定是 1。
在結束app2後,未經判斷便逕行 echo ReturnCode = 1 是盲斷的。
請參考回答內文中的架構來分派,才是合理的做法。
亦即在結束 [標的應用程式] 後,應立即安排 if erroelevel 來判斷分派流程。
2011-10-04 15:16:23 補充:
若該第一個程式能自動設定環境變數 m_good,才可使用批次檔處理。
但這一行:
IF %m_good%=="1" GOTO LOVE_DOS
可能得小修成:
IF #%m_good%==#1 GOTO LOVE_DOS
如此修改一下,或許便可運作。
2011-10-04 15:29:19 補充:
底下的批次檔要運作,有個前提:
我愛知識家.EXE 會設定環境變數 m_good。
@Echo OFF
:STEP1
我愛知識家
IF #%m_good%==#1 GOTO LOVE_DOS
GOTO END
:LOVE_DOS
我愛DOS知識家
:END
====
也可小改一下:
@Echo OFF
:STEP1
我愛知識家
IF NOT #%m_good%==#1 GOTO END
:STEP2
我愛DOS知識家
:END