[問題] c return variable to batch(已解決)

看板C_and_CPP作者 (藍影)時間14年前 (2011/09/15 18:55), 編輯推噓2(2023)
留言25則, 4人參與, 最新討論串1/1
Windows XP 這問題不知道有沒有人遇過.. 假設要寫一功能之程式(批次檔) 為輸入 a b , 算 a+....+b 一般我們在寫 batch file 時,有類似 func-like 寫法如下 :: filename : sum.bat @echo off :sum SETLOCAL ENABLEDELAYEDEXPANSION SET low=%~1 SET up=%~2 SET rst=0 FOR /L %%I IN (%low%, 1, %up%) DO ( SET /A rst+=%%I ) (ENDLOCAL SET %3=%rst% ) :: filename:main.bat @echo off :main SET rst=0 call sum.bat 1 10 rst echo 1+...+10=%rst% pause > nul 這裡要問的是,如果 main.bat 裡面,sum.bat 改成 sum.exe 的話, 有沒有辦法完成? 我想破頭還是想不出來, #include <stdio.h> #include <string.h> #include <stdlib.h> int main(int argc, char **argv) { int i=0, rst=0; for(i=atoi(argv[1]); i<=atoi(argv[2]); ++i) rst+=i; sprintf(argv[3], "%d", rst); return 0; } 我知道這樣一定會出包,而且很嚴重, 主要是想問,C language 有沒有辦法把結果傳進 batch 裡面之環境變數裡? 目前我是用 redirection 方式, 在 c 裡面會把結果 print 出來, 用 batch 調用時, sum.exe 1 10 > log.txt , 到時再用 batch 讀 log.txt 便知結果 , 想請教是不是只有這方法可行?或還有其他方法可得到類似效果? ( 用 C 寫 application 給 batch 調用) 謝謝各位不吝指導,感激不盡! -- YouLoveMe() ? LetItBe() : LetMeFree(); -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 180.177.78.41 tropical72:轉錄至看板 Programming 09/15 19:10 tropical72:轉錄至看板 EZsoft 09/15 19:11

09/15 19:11, , 1F
用for or set應該都可以給吧...
09/15 19:11, 1F

09/15 19:28, , 2F
在c裡調用set,那最後batch 怎知要去接哪個?寫死嗎?
09/15 19:28, 2F

09/15 19:31, , 3F
不能寫在batch嗎?
09/15 19:31, 3F

09/15 19:35, , 4F
耶..這就是我納悶的地方.怎用c寫一個application可讓
09/15 19:35, 4F

09/15 19:35, , 5F
batch 接結果?
09/15 19:35, 5F

09/15 19:37, , 6F
喔 我懂了 用popen呼叫sum.exe
09/15 19:37, 6F

09/15 19:38, , 7F
忽略樓上...
09/15 19:38, 7F

09/15 19:38, , 8F
拿到keyword了!!先研究一下,晚些回報,感謝!!
09/15 19:38, 8F

09/15 19:58, , 9F
嗯..popen 似乎沒辦法把結果傳回 batch 裡去 XD
09/15 19:58, 9F

09/15 20:20, , 10F
你要不要用C把要做的batch事情, 轉存成.bat檔, 再去執行
09/15 20:20, 10F

09/15 20:20, , 11F
呢? (不知道這樣做,對你會不會比較簡單?)
09/15 20:20, 11F
嗯,動作洽好有點相反,一般是在 C language 呼叫 batch / command line, 但這隻 c 主要是寫給 batch file 使用, 基本上可以用 batch 做的當然用 batch 較方便, 不過 batch 設計整個死在沒有 array / floating, 再加上 batch 調用 recursive 的話整個慢到一個不行 (recur 可用 stack 也較小) 所以才想用 c 先包一些簡單的 library (math 應該是準備全包了) 出來, 給 batch 調用,補足 batch 先天不足。 當然如果搞下去很複雜的話,不排斥轉搞 vbs

09/15 20:38, , 12F
所以標題寫錯方向?
09/15 20:38, 12F
已修正,再補一下,用 putenv 失敗。 ※ 編輯: tropical72 來自: 180.177.78.41 (09/15 20:39)

09/15 20:39, , 13F
for /f %%G in ('sum.exe') do ?
09/15 20:39, 13F

09/15 20:50, , 14F
上面那行可以多次用sum.exe執行沒錯,但該怎取出結果?
09/15 20:50, 14F

09/15 20:51, , 15F
c 裡用 printf 後,batch 就沒辦法用 SET/call 取結果.
09/15 20:51, 15F

09/15 20:55, , 16F
?? %%G 就是結果呀
09/15 20:55, 16F

09/15 20:56, , 17F
比方說for /f %%G in ('sum.exe 1 10') do echo %%G
09/15 20:56, 17F

09/15 20:57, , 18F
G就是吃sum 命令的output呀
09/15 20:57, 18F

09/15 21:02, , 19F
就可以少一步轉到log.txt再讀出來的動作
09/15 21:02, 19F

09/15 21:34, , 20F
耶..是有點怪怪的,請問sum.exe那裡,55會怎處理?
09/15 21:34, 20F

09/15 21:34, , 21F
printf("%d\n", ret); 像這樣嗎?
09/15 21:34, 21F

09/15 21:47, , 22F
恩恩 是的
09/15 21:47, 22F
我似乎幹了傻事,或該拜拜了.. .c 用 printf 的確就行了,而 batch 從頭到尾的確都用 for 寫就行 @echo off SETLOCAL EnableDelayedExpansion FOR /F "tokens=* delims=" %%A in ('sum_gcc.exe 1 10') DO ( SET myvar=%%A echo !myvar! ) ENDLOCAL @echo off SETLOCAL EnableDelayedExpansion FOR /F "tokens=* delims=" %%A in ('sum_vc.exe 1 10') DO ( SET myvar=%%A echo !myvar! ) ENDLOCAL pause > nul for 那段 firejox 的也沒錯 (EnableDelayedExpansion 必加就不說了) 一開始神奇的事情是,直接在 command line 輸入 sum_vc.exe 1 10 不會跑出結果 (抓這個抓了一個下午,最後才測到這個 XD) 後來用 gcc 試試卻可以跑。 重開機、重編譯後,現在一切正常了,現在還在想 vc 那段 bug 可能沒重現性了。 最後謝謝 firejox, priv , ericinttu 協助處理,感激不盡。 ※ 編輯: tropical72 來自: 180.177.78.41 (09/15 22:34) ※ 編輯: tropical72 來自: 180.177.78.41 (09/15 22:41)

09/16 13:33, , 23F
VC可能是環境的問題吧
09/16 13:33, 23F

09/16 13:33, , 24F
要開win32 console project..
09/16 13:33, 24F

09/16 18:33, , 25F
謝謝priv提醒,由於問題沒回復性了,也難追回 XD
09/16 18:33, 25F
文章代碼(AID): #1ESTc87y (C_and_CPP)