作者tropical72 (蓝影)
看板C_and_CPP
标题[问题] c return variable to batch(已解决)
时间Thu Sep 15 18:55:00 2011
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
1F:→ firejox:用for or set应该都可以给吧... 09/15 19:11
2F:→ tropical72:在c里调用set,那最後batch 怎知要去接哪个?写死吗? 09/15 19:28
3F:→ firejox:不能写在batch吗? 09/15 19:31
4F:→ tropical72:耶..这就是我纳闷的地方.怎用c写一个application可让 09/15 19:35
5F:→ tropical72:batch 接结果? 09/15 19:35
6F:→ firejox:喔 我懂了 用popen呼叫sum.exe 09/15 19:37
7F:→ firejox:忽略楼上... 09/15 19:38
8F:→ tropical72:拿到keyword了!!先研究一下,晚些回报,感谢!! 09/15 19:38
9F:→ tropical72:嗯..popen 似乎没办法把结果传回 batch 里去 XD 09/15 19:58
10F:推 ericinttu:你要不要用C把要做的batch事情, 转存成.bat档, 再去执行 09/15 20:20
11F:→ ericinttu:呢? (不知道这样做,对你会不会比较简单?) 09/15 20:20
嗯,动作洽好有点相反,一般是在 C language 呼叫 batch / command line,
但这只 c 主要是写给 batch file 使用,
基本上可以用 batch 做的当然用 batch 较方便,
不过 batch 设计整个死在没有 array / floating,
再加上 batch 调用 recursive 的话整个慢到一个不行 (recur 可用 stack 也较小)
所以才想用 c 先包一些简单的 library (math 应该是准备全包了) 出来,
给 batch 调用,补足 batch 先天不足。
当然如果搞下去很复杂的话,不排斥转搞 vbs
12F:推 ericinttu:所以标题写错方向? 09/15 20:38
已修正,再补一下,用 putenv 失败。
※ 编辑: tropical72 来自: 180.177.78.41 (09/15 20:39)
13F:→ firejox:for /f %%G in ('sum.exe') do ? 09/15 20:39
14F:→ tropical72:上面那行可以多次用sum.exe执行没错,但该怎取出结果? 09/15 20:50
15F:→ tropical72:c 里用 printf 後,batch 就没办法用 SET/call 取结果. 09/15 20:51
16F:→ firejox:?? %%G 就是结果呀 09/15 20:55
17F:→ firejox:比方说for /f %%G in ('sum.exe 1 10') do echo %%G 09/15 20:56
18F:→ firejox:G就是吃sum 命令的output呀 09/15 20:57
19F:→ priv:就可以少一步转到log.txt再读出来的动作 09/15 21:02
20F:→ tropical72:耶..是有点怪怪的,请问sum.exe那里,55会怎处理? 09/15 21:34
21F:→ tropical72:printf("%d\n", ret); 像这样吗? 09/15 21:34
22F:→ firejox:恩恩 是的 09/15 21:47
我似乎干了傻事,或该拜拜了..
.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)
23F:→ priv:VC可能是环境的问题吧 09/16 13:33
24F:→ priv:要开win32 console project.. 09/16 13:33
25F:→ tropical72:谢谢priv提醒,由於问题没回复性了,也难追回 XD 09/16 18:33