批处理之家's Archiver

netbenton 发表于 2009-10-26 20:58

一个跨窗口的choice批处理命令:mach.exe

通过三方,可以在当前cmd进程,读写另一个cmd窗口的环境变量

bat与三方可以不再仅仅是通过返回码通话了,

看一个特别的choice,

[color=lime]"mach.exe"[/color]

该三方的作用是:
接受键盘输入,返回ascii码,结果存到:窗口标题为“BatHome”,并且初始有变量“#=00”的cmd窗口中,

一次调用,直到按Ctrl+c退出,其它按键就会不断的刷新变量“#=??”


解决了10楼和11楼提出的建议。


附:
一个演示程序 tit.bat
一个mach.exe的实例应用,俄罗斯方块.bat
既不用到临时文件,且效率搞高了。

2009.11.4 更新:
修正了cmd环境变量过大时出现无效的情况。
改为用“#=00”来接受变量,原因是,#号是在cmd环境变量中最前的符号了。


***附件已经更新,请重新下载***
[url]http://bcn.bathome.net/s/tool/index.html?key=mach[/url]

zjw767676 发表于 2009-10-26 21:40

没弄懂tit的作用!

523066680 发表于 2009-10-26 21:50

真爽,可以提高效率了。

小勇12 发表于 2009-10-26 21:57

麻烦举个例子说明一下

523066680 发表于 2009-10-26 22:44

首先,我放在了桌面上,提示docume~1 xxxx 一看就知道是路径问题
第一个出现路径的地方,第三行改成了
start "" "%~s0" net
继续测试。

打开后,是最近成为经典的批游戏模式(一批多功能+自调用)
批处理的头部是通过参数来辨别本次批处理所要执行的功能的,跳到指定功能区。

出现一个大框和一个小框,你把大框激活,在上面按键,白色的小框可以显示按键值。
也就是一个框负责显示,一个框负责读取键值了。
(因为批处理要做到同时刷屏的情况下又要不断读取键值比较麻烦(我不会,见过netbenton的数码雨可以),
   所以做游戏的时候经常是用一个框输入,一个框显示画面的方式,来分担信息的处理
   显然数据之间的沟通是非常重要滴~ 把信息写入文件,或者利用一些可以储存信息的命令
   如assoc ,ftype 关联无关选项等记录信息,都比较耗时和耗cpu,于是……
  )

[[i] 本帖最后由 523066680 于 2009-10-26 23:03 编辑 [/i]]

523066680 发表于 2009-10-26 22:57

额那个……
变量名和 标题只能是0和bathome 波?
估计mach是netbenton原创拉,帮bathome标题广告一番了哈哈。

[[i] 本帖最后由 523066680 于 2009-10-26 23:04 编辑 [/i]]

523066680 发表于 2009-10-26 23:07

前段时间想用ftype 或者assoc 记录信息的,这样也可以实现另一个框读取,不过
要获取信息的时候又要搞字符处理了,不干……
mach是很好的选项

netbenton 发表于 2009-10-26 23:32

谢谢523066680,解释得很棒。

一楼附件增加了一个实例应用,请大家重新下载。

仍一个不足之处,就是以start /b 运行在同一个窗口时,不能正常运行。也就是只能跨窗口操作,

plp626 发表于 2009-10-26 23:37

我觉得批处理能做到按键不用回车,支持上下左右键控制输入算是很大进步了[当然这个还得用三方],如果能有个彩屏的也人性化了,再来个多进程通信算是齐全了,

这些都还处在娱乐娱乐阶段,【话说回来,我觉得现在国内的批处理论坛都还是以娱乐消遣为主】,象兄这样娱乐技术的不多,论坛多一些如此会员一定可以改变风格

不过我觉得批处理进程通信用临时文件【把要传递的数据存到共享文件里】目前还是最佳选择

plp626 发表于 2009-10-26 23:43

[quote]原帖由 [i]netbenton[/i] 于 2009-10-26 20:58 发表 [url=http://bbs.bathome.net/redirect.php?goto=findpost&pid=39984&ptid=6175][img]http://bbs.bathome.net/images/common/back.gif[/img][/url]
既不用到临时文件,且效率搞高了。... [/quote]

用三方的话效率不会高于临时文件,临时文件还是只限于cmd一个进程,
而三方工具进程频繁地开启又退出 这样一定很耗时,

小勇12 发表于 2009-10-27 07:00

好占用内存哟哦,要是内存占用少就好了

netbenton 发表于 2009-10-27 19:27

re 10楼
我所指的是,三方通过临时文件与BAT对话,同 三方直接存取变量与BAT对话,
你说哪个快呢?



re 11楼

所有的控制台三方,运行后都会留下内存碎片,包括系统自带的ping.exe也不例外。
平均每运行25~30次左右会“吃”掉1M的内存!!
至于原因何在?就不知道了。

你说mach.exe占内存,说不过去的。

[[i] 本帖最后由 netbenton 于 2009-10-27 19:30 编辑 [/i]]

netbenton 发表于 2009-10-27 21:03

mach.exe
升级

一次打开,就会向"BatHome"窗口不断的送按键,
cup零占用(注意:测试代码中cup占用%100,是主程序批处理循环所至,而并非mach.exe所为)

zjw767676 发表于 2009-10-27 21:42

重新下载了,tit运行正常。俄罗斯方块却玩不了!

523066680 发表于 2009-10-28 09:03

批处理随便一个紧凑的循环,都很占内存的。好像是有堆积作用
@echo off
:a
ping -n 1 127.1>nul
goto :a


@echo off
:a
ping -n 2 127.1>nul
goto :a

cpu占用率差的太远了
--------------------------
对了,俄罗斯方块我这边测试也没成,在读代码中……

[[i] 本帖最后由 523066680 于 2009-10-28 09:25 编辑 [/i]]

netbenton 发表于 2009-10-28 12:42

不应该呀!?
我自己下测试来可以的。

对了,要连  "bat" 文件也要更新才行的,
因为用法不同了

还有小键灯要亮才可以"玩俄罗斯方块"的

[[i] 本帖最后由 netbenton 于 2009-10-29 07:49 编辑 [/i]]

523066680 发表于 2009-10-28 16:40

头痛…… 读到晕了。
打算要测试,在循环中显示按键值,也不知道放哪里好,看跳转看晕了。

523066680 发表于 2009-10-28 17:25

俄罗斯方块实在改不下去了哈,还是先小小的体验一下mach功能先
回忆起一个游戏模式了,一个小人停在一个板上,然后画面不断
地向上,小人必须在不掉如深渊的情况下跳到下一个板块上,
有些板块是带刺的不能跳。
o(∩_∩)o不做,很花时间的
小小体验,把输入信息字符化~[code]@echo off
if "%~1" equ "net" goto :prar1
start "key" "%~f0" net
set 0=00
title BatHome
rem 测试得知,title应该在赋值0=00后执行
  ::-action-配置一下先
  setlocal enabledelayedexpansion
  set "space="
  for /l %%a in (1,1,79) do (set space=!space! )
  set dotspace=40
  set /a do61=-1,do64=1
  ::下面是显示的循环了
:lp
  echo,!space:~0,%dotspace%!*
  for /l %%a in (1,1,3) do (ping 1 127.1>nul)
  if "!0!" equ "03" (taskkill /fi "WINDOWTITLE eq key*" /im cmd.EXE &exit)
  set /a dotspace+=do!0!
  set 0=00
goto :lp

::输入框,读取键值并把值赋予环境变量0
:prar1
mode con: cols=20 lines=2
echo;请把我置顶
mach[/code]

Batcher 发表于 2009-10-28 19:38

回复 18楼 的帖子

“是男人就下100层”游戏?

523066680 发表于 2009-10-28 19:48

回复 19楼 的帖子

这名字起的真好……

netbenton 发表于 2009-10-30 21:46

呀!真奇怪!
俄罗斯方块.bat
放在1个和4个字符为名的文件夹内时,变量环境的线性地址就不在10000H了,
其它则对;


tit.bat
却不会出现这种情况,
为什么呢?

yslyxqysl 发表于 2009-10-30 22:11

我说过有风险吧...

netbenton 发表于 2009-10-31 22:19

风险倒是没有什么风险,只是有的情况失效
如果你使用的变量环境不是很大,请放心使用mach.exe
如果过大也不会有风险,只是会失效。


已经知道是怎么回事了,是因为变量空间过大后,cmd.exe增加申请了内存,并且改变了存放的地址,特别是开启了变量延迟后,变化更大,每执行一次setlocal ... 和endlocal
都会改变当前活动变量环境的地址,看来需要确定的是存放当前活动的环境变量指针的位置。

经过一翻查找,未果。
现在可以知道的是:当环境变量空间超过一定容量后,起始地址就从:008e0000H开始,连续存放,开启变量延迟后,最新活动变量在最后,各个环境变量所占内存最小单位为10000H,可以从008e0000H开始一直接搜索到最活动环境变量为止,来找到当前活动变量段的地址,只是效率问题。
最好的方法还是能找到存放指针的位置。

yslyxqysl 发表于 2009-10-31 23:08

终于体会到C程序&&**的有多么好了

netbenton 发表于 2009-11-4 19:08

已经成功找到存放活动环境变量指针的线性地址了,
并且已经更新mach.exe
欢迎大家继续测试。

re 523066680
你的“贪吃蛇”要是用mach取键盘输入,速度可以翻倍哦

zhouyongjun 发表于 2010-4-19 14:47

标题和变量可以指定就好

523066680 发表于 2010-4-22 22:12

回复 25楼 的帖子

本顿是个很认真很热血的人,
贪吃蛇嘛,是别人的作品,我是去模仿+尝试。

终究是换了一个环境去描绘其他东西了~

页: [1]

Powered by Discuz! Archiver 7.2  © 2001-2009 Comsenz Inc.