中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 【cmd人性化贡献】愿意真正为cmd做点东西的进
作者:
标题: 【cmd人性化贡献】愿意真正为cmd做点东西的进 上一主题 | 下一主题
plp626
银牌会员

钻石会员


积分 2278
发帖 1020
注册 2007-11-19
状态 离线
『楼 主』:  【cmd人性化贡献】愿意真正为cmd做点东西的进

今天发了两个帖子解决了问题,很感谢论坛的会员们 接着 突发奇想,再继续发散思维下特有如下想法,想让cmd人性化点 大家都知道脚本中可以用call方法调用子过程,但是这种方法很麻烦 要人为设定返回变量,然后再用,习惯了高级语言后对此种调用发法很不爽,还有cmd不支持浮点运算,数学函数自然不能用,(论坛里有个math.exe,就很好大家可以搜索关键字math,正式这个math.exe让我产生此想法) 提议写个解释器(命名expr),把子过程的call方法封装 对子过程的调用用高级语言的 varable=fun(arg1,arg2,,,) 形式,对于有返回值的函数用等号去接受,(这一点p可以说是得天独厚,是大多数语言无法比拟的,因为它没有变量类型) expr var=fun1(arg1, arg2, ... fun2(p1, p2, ...)) ; var2=fun3(...) ; fun4(....); 现在想到一个问题就是如果expr作为三方工具,那么var的值只在expr的生存期有效,当expr将控制权返回给cmd时,用 return var; 却要求为int型,而且cmd能接受的只有errorlevel变量,看来要做不只有这些了 若再换一种思路,不return var; 而是printf("%s", var); 然后再写个bat脚本for /f 去抓取信息, 于是产生用纯批处理写expr的想法,但是效率可想而知, 于是还是回到用 c语言+bat的for /f的思路 若真是喜欢cmd(linux的强大正是有众多的fans一点一滴地积累而成)愿意给它做点东西,开始吧




山外有山,人外有人;低调做人,努力做事。 进入网盘(各种工具)~~ 空间~~cmd学习
2009-5-29 09:27
查看资料  发短消息 网志   编辑帖子  回复  引用回复
slore
铂金会员





积分 5212
发帖 2478
注册 2007-2-8
状态 离线
『第 2 楼』:  

给个系统环境变量保存char类型的结果,integer就用errorlevel 当然都用系统环境变量也可以




S smile 微笑,L love 爱,O optimism 乐观,R relax 放松,E enthusiasm 热情...Slore
2009-5-29 10:00
查看资料  发短消息 网志   编辑帖子  回复  引用回复
netbenton
银牌会员

批处理编程迷


积分 1916
发帖 752
注册 2008-12-28
来自 广西
状态 离线
『第 3 楼』:  

这样调用子程序,并返回结果,也不是很麻烦呀?
@echo off&setlocal enabledelayedexpansion
call  :sub aa=33 44
echo 33 + 44 = %aa%
pause
goto :eof
:sub
@echo off&setlocal enabledelayedexpansion
set/a num=%2+%3

(
endlocal
set %1=%num%
goto :eof
)




精简 [你的+我的+他的]=>[大家的] 个人网志
2009-5-29 11:00
查看资料  发送邮件  发短消息 网志  OICQ (37659560)  编辑帖子  回复  引用回复
plp626
银牌会员

钻石会员


积分 2278
发帖 1020
注册 2007-11-19
状态 离线
『第 4 楼』:  

Originally posted by netbenton at 2009-5-29 11:00 AM: 这样调用子程序,并返回结果,也不是很麻烦呀? [code]@echo off&setlocal enabledelayedexpansion call :sub aa=33 44 echo 33 + 44 = %aa% pause goto :eof :sub @echo of ...
你要和我。。。。? 我只是举了个例子 cmd在处理命令行时,如果=;,外没有双引号会被当作参数分割符号来处理,为了增加可读性我们可以投机取巧用个=
给你举个通俗的例子, 现在有个两子过程:fun <int> <int> [ret] 可以返回两个整数的和, :fun2 <int> [ret] 可以判断这个和是不是素数,是素数返回1 不是返回0 我现在有数1 数2,想知道它们的和是不是素数 你调用的基本形式是 1. call :fun 数1 数2 和 2. call :fun2 和 ret 现在用这样的形式表示 expr ret=fun2(fun(数1,数2)) 多方便,如果再优化,给expr加运算符性能,这样使用 expr ret=fun2(shu1+shu2) 最简单的例子就省略了一个临时变量,
可以来此帖子讨论: bbs.bathome.cn/threa ...




山外有山,人外有人;低调做人,努力做事。 进入网盘(各种工具)~~ 空间~~cmd学习
2009-5-29 11:30
查看资料  发短消息 网志   编辑帖子  回复  引用回复
knoppix7
银牌会员





积分 1287
发帖 634
注册 2007-5-2
来自 cmd.exe
状态 离线
『第 5 楼』:  

弄过这个东西.. 卡在对括号的划分上..


2009-5-29 23:27
查看资料  发短消息 网志   编辑帖子  回复  引用回复
knoppix7
银牌会员





积分 1287
发帖 634
注册 2007-5-2
来自 cmd.exe
状态 离线
『第 6 楼』:  

只是想到过一个框架.. @echo off setlocal (开不开延迟自己看着办.不过开一层有好处) Code. Code.. .. . Endlocal&set return=%结果% 省的清理临时变量了.而且结果也能传回去.


2009-5-29 23:28
查看资料  发短消息 网志   编辑帖子  回复  引用回复
everest79
金牌会员

一叶枝头,万树皆春



积分 2564
发帖 1127
注册 2006-12-25
状态 离线
『第 7 楼』:  

我记得C语言有个 system(cons char *command) expr var=... int main(char *agv){ char *ar1="var=" char *ar2="..." char *name=new char[200]; strcat(name,ar1); strcat(name,ar2); system("set name"); return 0 }




49206C6F766520796F752067757973 54656C3A3133383238343036373837
2009-5-30 01:08
查看资料  发短消息 网志   编辑帖子  回复  引用回复
plp626
银牌会员

钻石会员


积分 2278
发帖 1020
注册 2007-11-19
状态 离线
『第 8 楼』:  

其实想一想 C 的 main 函数 原型 int main(....) 没见过(起码我没见过) *char main (....) 就知道 这个想法的难度




山外有山,人外有人;低调做人,努力做事。 进入网盘(各种工具)~~ 空间~~cmd学习
2009-5-31 04:16
查看资料  发短消息 网志   编辑帖子  回复  引用回复
plp626
银牌会员

钻石会员


积分 2278
发帖 1020
注册 2007-11-19
状态 离线
『第 9 楼』:  

鞥。。。 我发现不是这样简单的思考,难道。。。。?




山外有山,人外有人;低调做人,努力做事。 进入网盘(各种工具)~~ 空间~~cmd学习
2009-5-31 04:19
查看资料  发短消息 网志   编辑帖子  回复  引用回复
knoppix7
银牌会员





积分 1287
发帖 634
注册 2007-5-2
来自 cmd.exe
状态 离线
『第 10 楼』:  

好吧...我只能围观了.. C之类的见都没见过... 能直接用内存写入把命令写入CMD就爽了... 星际上我是干过这事...可CMD连数组都没有我到哪里下手去..XD


2009-5-31 05:45
查看资料  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: