請問DOS專家.BAT執行2個EXE.中間變數問題.

2011-10-01 9:31 pm
請問DOS專家.BAT執行2個EXE.中間變數問題.這個BAT要執行2個程式.但是第一個執行完之後.紀錄其變數.然後將該變數的值.用來判斷第2個程式執不執行.舉例如下: 我愛知識家.EXE====裡面會去檢討某種狀況.假如成立.變數m_good=” 1”再往下比對.假如m_good=” 1”.就可以往下執行這個程式>>>我愛DOS知識家.EXE 請問這個BAT如用DOS來寫.該如何描述.有不清請發表意見.我再來說明喔.
更新1:

是不是DOS沒有這種功能 對變數來宣告是公用性的

更新2:

WOW!這麼多專家來捧場.因為近日超忙.讓我抽空來測測喔.再把實況發表喔.好嗎.謝謝!

更新3:

剛測完大師的智慧.架構簡單明瞭.層次分明.為了方便閱讀自己加了pause.這樣自己要如何運作都非常方便.謝謝大師.辛苦了. 再來測測< >專家的囉!

更新4:

Daii.XiANG的測試狀況如下: 1.返回值==是本題的重要靈魂.DOS則是重要架構. 2.程式測不太出來[加了pause都沒停止].可否請大師來指導一下.其中原因==是否因傳回值不可為字串.或是可以.在EXE的程式要先宣告.....

更新5:

大師字字珠璣.既深奧又深奧.不知2F看懂沒.我是似懂非懂.請大家繼續努力來探討.也請2F專家到意見區發表一下看法喔.大家晚安....

更新6:

用大師的邏輯來小改Daii.XiANG ( 初學者 5 級 )的程式碼(如下).就可以跑了.關鍵可能是此題相當特殊.必須用大師的架構與語法來走.非常好的研究題目喔. @Echo OFF rem app2會傳回 echo ReturnCode = 1 === 程式內直接設定 ReturnCode = 1 app2 echo ReturnCode = 1 pause if errorlevel 1 GOTO LOVE_DOS echo "沒進入" pause GOTO END :LOVE_DOS echo "我在這裡" pause :END

更新7:

感謝 Daii.XiANG ( 初學者 5 級 ) 先將你的回答紀錄於<<意見欄>>.以供參考.謝謝. 假如大家沒有意見.明日結案.以大師的為最佳解答. Daii.XiANG 專家.如有考慮回答採用率(會影響未來的升級).就要注意囉.謝謝你喔!

更新8:

感謝大師幫忙.假如大家沒意見的話.明日結案喔.感謝嚕!!!!

回答 (4)

2011-10-03 9:27 am
✔ 最佳答案
底下這個程式請編譯成 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
參考: , {, {
2015-05-08 8:06 am
我本來從沒遇到過修NAS修硬碟和隨身碟要資料救援,一開始也跟大家一樣總是問價格到處比價,因為不懂,凡事都從價格,考量,輕言聽信朋友介紹比較便宜一家,找錯家之後痛苦尾隨而來,以下省略500字........,後來自己上網找資料救援找到硬碟醫院,和他們經理溝通之後給我正確觀念,這是妳寶貴的資料,妳要考慮是救不救的回問題,而不是貴不貴問題,如果重要請找對人搶救NAS資料硬碟救援才能恢復你的NAS中多顆的硬碟資料
http://www.datamaster.com.tw/
2011-10-04 4:36 pm
感謝 Daii.XiANG ( 初學者 5 級 )
先將你的回答紀錄於此.謝謝.
==================================================
您好
因不知妳的兩支檔案為何
假設妳的第一支檔案執行後可自動丟出參數(如: m_good)
可用下列方式處理

2011-10-04 08:36:55 補充:
@Echo OFF
:STEP1
我愛知識家 > NUL
IF %m_good%=="1" GOTO LOVE_DOS
GOTO END
:STEP2
我愛DOS知識家 > NUL
:END

2011-10-04 08:37:05 補充:
以上
供您參考 參考資料:

MY KNOWLEDGE... 2011-10-03 19:22:29 補充

報歉
打太快了
:STEP2 請改為 :LOVE_DOS

更正如下
@Echo OFF
:STEP1
我愛知識家 > NUL
IF %m_good%=="1" GOTO LOVE_DOS
GOTO END
:LOVE_DOS
我愛DOS知識家 > NUL
:END

2011-10-04 14:24:47 補充:
感謝大師指導.請大師看看Daii.XiANG ( 初學者 5 級)所描述的....
>>>>>若該程式能自動丟出該參數.才可使用批次檔直接處理<<<<
請問這樣的描述可以嗎!3Q!

2011-10-04 17:07:25 補充:
大師就是大師.無所不能.一通百通.
又會隔空治病.網友都很讚歎喔.
心量更是大.都不藏私的.
真是一言難盡啊.
應該是說:不是用言語可以形容的!!!!!!
2011-10-04 3:20 am
DOS本身並無對一般可執行程式的參數
做判斷功能

2011-10-03 19:20:30 補充:
您好
因不知妳的兩支檔案為何
假設妳的第一支檔案執行後可自動丟出參數(如: m_good)
可用下列方式處理

@Echo OFF
:STEP1
我愛知識家 > NUL
IF %m_good%=="1" GOTO LOVE_DOS
GOTO END
:STEP2
我愛DOS知識家 > NUL
:END

以上
供您參考

2011-10-03 19:22:29 補充:
報歉
打太快了
:STEP2 請改為 :LOVE_DOS

更正如下
@Echo OFF
:STEP1
我愛知識家 > NUL
IF %m_good%=="1" GOTO LOVE_DOS
GOTO END
:LOVE_DOS
我愛DOS知識家 > NUL
:END

2011-10-04 13:40:18 補充:
版大的發文是針對DOS的批次檔所問
而批次檔本身並無此機能

我在回答中明確指出: 若該程式能自動丟出該參數
才可使用批次檔直接處理
否則
需藉由東邪前輩的VB程式輔助

以上
參考: MY KNOWLEDGE...


收錄日期: 2021-04-30 16:07:08
原文連結 [永久失效]:
https://hk.answers.yahoo.com/question/index?qid=20111001000010KK03498

檢視 Wayback Machine 備份