|
改动非常多,代码框架基本形成,不会再发生很大变化,功能增强了许多,还有一些功能正在加入。
最近很忙,帮助没时间写,会编程的可拿去测试,用VS2003发的源代码。
可执行文件为控制台调试版,用“wtcmd learn”进入交互界面。
==========================================================================
在下一个版本中将包含文件/注册表读写、exe/dll资源的读取,也将支持读取一个如*.reg/*.inf等文件,对其作一个替换,将结果导出到临时目录,再加载。即相当于文件的预处理,我们知道*.inf文件尚可包含一个当前目录,而*.reg文件却只能写死路径,这样我们往往要在导入*.reg文件后再用 pecmd 进行修改,非常不方便,这一功能将解决这一问题。
将支持从内部/外部执行vbscript/javascript代码,DLL函数的调用,……
还将提供一个 browse 命令,不仅能浏览文件、文件夹,也能像改变快捷方式图标的对话框那样,浏览*.ico/*.exe/*.dll中的图标。
总之功能多多,更易使用,敬请期待!
==========================================================================
wtcmd(by shoulea) v1.1 readme
wtcmd 已经全面更新了!
新亮点1:人性化的语法
------------------------------------------------------------------
继 makeargv 这个重要函数之后,我又实现了一个名为 parsargv 的函数,它的使用使 wtcmd 的语法变得十分优美,而且命令的编写也更加容易了!
再次考虑 1.0 beta1 中消息框示例,那时我们的代码是:
wtcmd mess "Hello, world!" -c hello -i i -m oc -t 5000
现在这个代码仍受支持,不过我们可以有更加漂亮的方式:
wtcmd mess "Hello, world!" --caption=hello --icon=infomation --mode=OKCancel --timeout=5000
两个代码表示了完全相同的意思,但后者具有更好的可读性。
wtcmd 像 Unix 的命令行工具那样处理命令行参数,用“--”引导长选项,用“-”或“+”引导短选项。
对同一命令几乎总是可以同时使用全名(像上面的第二个代码)和缩写(如第一个代码),仅个别全名无缩写,全名与缩写可以混合使用。如可用下面代码实现同上面相同的效果:
wtcmd mess "Hello, world!" -c hello -i i --mode=OKCancel -t 5000
命令的选项(指被“--”“-”或“+”所引导的参数)和普通可以用任意顺序指定,也就是说,上面的代码又可写作:
wtcmd mess -c hello "Hello, world!" --mode=OKCancel -t 5000 --icon=information
大小写的限制完全去除,现在选项的名字或其缩写也可用大写字母,如:
wtcmd mess -C hello "Hello, world!" --MODE=okcancel -t 5000 --icon=INFORMATION
新亮点2:形象的语法
------------------------------------------------------------------
数字、字符串和列表是重要的工具,对它们的处理方式直接决定命令文件的易写性和可读性,wtcmd 1.1 使用形象的语法对它们进行处理。
先看数字。calc 命令提供了对四则运算的完全支持,并可用括号任意嵌套。看下面的代码:
wtcmd calc x = (3 + 2) * 7 ; mess $x
您将看到正确结果:35
再来看字符串。wtcmd 对字符串提供了最灵活的支持,可以用各种方法作用到目标字符串上,从而生成新的字符串,如:取子串,查找,替换,像 bat 用 %~dpnx1 的方式提取路径的各部分。
wtcmd s = "012345" --left=3 ; mess $s
这取出了左边的 3 个字符。
wtcmd s = "AxaxxAyxxa" "ax" "*" --replace ; mess $s
这将串中的子串“ax”全部换成了“*”。
wtcmd s = "%windir%\system32\notepad.exe" --get=dnx ; mess $s
一个完整的路径分为“驱动器 driver -- d”“路径 path -- p”“名字 name -- n”“扩展名 extension -- x”四部分,上面只指定了“dnx”,因而结果为“C:notepad.exe”(假定非 PE,系统盘为 C)。
再看列表。可以向列表增元素,删除元素,也可用新元素替换部分元素。默认使用换行符“\n”作为分隔符(尤其是对操作符“<<”和“>>”,即 wtcmd 希望您逐行处理数据,这样高效而方便),但对于“<<”和“>>”之外的操作,您可以使用 --delimitor 选项或其缩写 -d 指定一个分隔符。
wtcmd mess $path ; path : --add D:\Programs --delimitor=";" ; mess $path
通过两个消息框,您将看到 --add 操作向 path 搜索路径列表增加了一个新元素“D:\Programs”。
将下面的代码存为 d:\a.txt,用命令 wtcmd d:\a.txt 观看效果。
list = ""
list << "当前的临时目录为:"
list << "%temp%"
mess $list
<< 向列表增元素(使用换行符作为分隔符,而且不能改变),从而构造了一个具有两行文字的消息框。另请注意,现在同时接受“%”和“$”引导的环境变量展开。
新亮点3:强大的语法
------------------------------------------------------------------
wtcmd 现在完全支持了 C 语言支持的各种流程控制语句,while/for/if/switch 四种语句都得到了支持!
与 1.0 的配对方案 while ... loop 和 if ... end 不同,1.1 仅用关键字 sub/while/for/if/switch 开头,用同一个关键字 end 结尾。
看看 while 循环:
i = 0
while i < $#
calc i += 1
mess ${$i}
end
将上述代码存为 d:\a.txt,用命令“wtcmd d:\a.txt a b c”观看效果,可以看到它用消息框显示了传递的参数“a b c”。
注意:$# 是传递的参数个数,而${$i} 是变量的多重展开,与 1.0 是一样的用法,只是不再支持随机数生成“$?”,作为替代,可用“num = --random”在变量 num 中获取一个随机数。
实际上,要想列举参数,可以用更棒的方法:
for --argv
mess $_
end
除了参数,也可以用 for 语句在其他列表上作循环,也可以传递 --reverse 选项,这样可以反向遍历列表:
for --reverse
mess $_
end
注意,其中列举参数是默认的操作,因此上面并没有再写出 --argv。上面两个代码中的“$_”即是列表中的当前元素。
if 语句现在是完整的语句(lmle 曾指出没有为 if 设计 else,其实是当前自己思路被搞混了,现在经过思考终于将其搞定了),甚至可以有 else if。
x = 5
if $1 > x
mess "传递的数比 x 大。"
else if $1 < x
mess "传递的数比 x 小。"
else
mess "传递的数与 x 相等。"
end
将代码存为 d:\a.txt,用命令“wtcmd d:\a.txt 5”观看效果。(非常抱歉,由于“-”作为负号与选项引导字符冲突,暂时不能传递负数,这将在将来得到修正。)
switch 语句是另一个很好用的语句:
switch $1
case "apple" "pear"
mess "您传递的是一种水果。"
case "panda" "cat"
mess "您传递的是一种动物。"
default
mess "抱歉,不能作出判断。"
end
不用我再说怎样观看效果了吧!
其他地方的改进
------------------------------------------------------------------
本次更新主要是核心的更新,80% 的代码经过了改进。最大的一点是现在可以同时编译为 ANSI 版本和 Unicode 版本,当然我们更喜欢 Unicode 版本,之所以使其也能以 ANSI 方式编译,是希望如果 DOS 或其他地方可能需要 wtcmd,改动的地方更小,实际上 util 中的代码,绝大部分现在已经可在 DOS 上用 Turbo C 编译了!
当然命令方面并非完全没有改进,实际上正由于 parsargv 的亮相,所有命令的选项分析都重新写过了,即是前面说的使得语法更优美。
由于 parsargv 使得命令选项的处理更容易,命令有了更多的灵活性,如 1.0 中用 file 命令删除文件时,如果以“\”开头,如“\pagefile.sys”会导致所有盘下的 pagefile.sys 被删除,现在这是一个可选的功能。
rm \pagefile.sys
只删除当前盘下的 pagefile.sys,即“%CurDrv%\pagefile.sys”,而:
rm \pagefile.sys --extension
或
rm \pagefile.sys -x
与原来的做法具有相同的效果。
注意,原来的 FILE 命令其功能被分到了三条命令中:rm -- 删除(remove),cp -- 复制(copy),mv -- 移动(move)。
总之,wtcmd 正变得越来越易于使用,欢迎继续关注,并提出宝贵的意见与建议!
wtcmd v1.1 by shoulea
7:25 2010-10-2
=======================================================================
calcexpr by shoulea
经过一天的努力,终于实现一个强大的表达式计算函数。
可以支持以下运算符的混合运算:
基本的算术运算 + - * / ^
专门用于整数的运算 div mod
计算平方根 sqrt x
计算绝对值 |x|
截去小数部分 [x]
支持一元的+和-算符;
任意深度的括号嵌套;
可读取环境变量的值用于计算;
内置 pi 和 e 两个常数。
这一模块就不加入到 wtcmd 中了,因为我打算重新构造 wtcmd,写一个更强的核心。
calcexpr by shoulea
19:24 2010-9-18
==================================================================
wtcmd(by shoulea) v1.0 beta2 readme
实现了环境变量的读写及四则运算,现在可以演示循环和子程序的使用了。
还将运行库检测内存泄露的头文件<ctrdbg.h>包含了进来,如果解释器运行过程发生内存错误,则调试版解释器可给出诊断信息,这样可使解释器更为健壮。
示例1:使用 envi 的列表读写功能枚举参数
------------------------------------------------------------------
envi list = "$*"
while -s "$list"
envi list > item -b
mess "$item"
loop
将此代码存为“d:\no1.txt”,用命令“wtcmd d:\no1.txt a b c”进行测试,这将显示三个对话框,内容分别为“a”“b”“c”。
此程序将变量 list 初始化为传递给命令文件的参数表,然后用“envi >”命令每次读一个参数,当遍历了所有参数后,循环结束。
$* 代表传递的所有参数,如对“load a.txt a b c”,则 $* 即为“a b c”。
$* 是一个特殊的环境变量,解释器用环境变量 arg1、arg2、……对其进行展开。
展开 $* 涉及到参数的连接,如果参数有空格,则展开的结束未必与最初传递的一致,而且引号将对envi命令对参数的解释产生影响,因此这种枚举方法只适合传递的简单参数,最好不含空格。
示例2:使用变量的多重展开功能枚举参数
------------------------------------------------------------------
envi i = 0
while i < $#
incr i
mess "${arg$i}"
loop
将此代码存为“d:\no2.txt”,用命令“wtcmd d:\no2.txt a b c”进行测试,显示的消息框与上例相同。
此例相比于上例,更简洁也更安全,即使参数传递了空格,它也同样可以工作。
代码将变量 i 初始化为0,而后循环,即到其值超过传递的参数个数,命令“incr i”使变量 i 的值加一。
最有意思的是“${arg$i}”它实现参数的读取。由于 cmd.exe 默认用 % 引导环境变量,而 % 不能体现出层次关系,故改用 $ 引导环境变量,如果有简单变量 name,则使用“$name”即可。
如果想要反复展开,可将变量名部分放到“{}”中,如本例中有“{}”,解释器先展开 $i,这次有值1、2、3、……,然后再对“{}”执行一次展开,这一次展开的是“arg1”、“arg2”、……这正是传递的参数。
示例3:使用循环、四则运算及列表追加元素功能
------------------------------------------------------------------
envi item = "$? mod 5" -e
envi list = $item
while item != 0
mess "$item 不为零,是否继续?" -m yn -iq -c Continue?
if no
break
end
envi item = "$? mod 5" -e
envi list < $item -b
loop
mess "己结束,所得随机序列为:\n $list" -ii -c Finish!
*** 此文件不必传递参数,您可以直接将“no3. random seq.txt”拖动到“wtcmd_debug.exe”上进行测试。
*** 调试版本的解释器为控制台应用程序,可以看到更为详细的解释过程。
每次遇到变量“$?”,解释器都用一个0~32767间的一个值将其展开,而本例中使用了取余运算符,这样每次都生成一个0~4的随机数。
当生成的随机数不为0时,循环将进行,并显示一个消息框询问是否产生更多的随机数,可以选“no”退出循环。
程序每次用命令“envi <”将元素追加到列表中,其中的“-b”用于指定分隔符,默认的分隔符为“;”,而“-b”将使得以空格作分隔符。
示例4:子程序设置、返回值及其检测
------------------------------------------------------------------
envi t = "$? mod 10" -e
call Example $t
if yes
mess "子程序返回了“是”。" -ii
exit
end
mess "子程序返回了“否”。" -is
_sub Example
if $1 > 5
return yes
end
return no
_end
此例有一个名为 Example 的子程序,它对传入的第一个参数进行检测,如果传入的值比 5 大,则返回“是 yes”,否则返回“否 no”。
注意:return 命令是 exit 命令的别名,两者是一样的。
程序的开始处,生成0~9的一个随机数,将其传递给 Example 进行判断,根据返回值显示不同的消息框。
下一步要实现 pecmd 中 team、find、ifex、forx 的等效命令,以使命令文件更简洁,在不使用命令文件时也能使用循环。
wtcmd v1.0 beta1 by shoulea
19:55 2010-9-15
==================================================================
wtcmd(by shoulea) v1.0 beta1 readme
发一个新的命令解释器,欢迎感兴趣的使用测试,并提出您宝贵的意见与建议。
程序目前实现的主要在核心部分,即命令文件/子程序调用,命令仅实现了几条,这种状况将迅速得到改善。
在下面的示例中,您可以使用与 pecmd 相同的方式使用本程序:命令文件(配置文件)或命令行直接调用。
下面请您将 wtcmd.exe 复制到系统目录:%SystemRoot%\System32,并打开命令提示符。
示例1:显示一个消息框
------------------------------------------------------------------
wtcmd mess "Hello, world!" -c hello -i i -m oc -t 5000
您将看到一个具有“确定”和“取消”的消息框,其消息为“Hello, world!”,窗口标题为“hello”,5秒之后如果你不选择,对话框将自动关闭。
与 pecmd 大量使用符号进行分隔不同,wtcmd 使用了类 Unix 的命令行风格,使用选项指定参数,这可以更加灵活(也许有人会认为这会使命令更加冗长)。
在上一例中,“-c hello”指定了对话框的标题,“-c”中的“c”代表“caption”;
“-i i”中第一个“i”表示要指定对话框图标,而第二个“i”表示使用信息图标(information),一共有四种图标,你可以使用以下方式进行尝试:
-i i 信息图标 information
-i q 问号图标 question
-i s 停止图标 stop
-i w 警告图标 warning
也可将“-i i”完全省略,这样将没有图标。
“-m oc”指定了对话框的模式,其中的“oc”代表“确定 OK”与“取消 Cancel”,还有其它模式,请参考以后发公布的帮助文档,或者您也可以查看源代码。
注意:由于正处于测试阶段,这样缩写可能会发生改变,也欢迎对缩写提出宝贵建议,以便缩写的使用更为合理。
“-t 5000”表示如果5秒不选择,对话框将关闭。
通过这个例子您看到了 wtcmd 与 pecmd 的不同,并对本解释器有了一个感性的认识。
说明,每条命令都返回一个状态码,它可以被检测(对于 mess 命令,我们可以用这来判断用户的选择),详见后面的例子。
示例2:创建一个文件夹快捷方式
------------------------------------------------------------------
wtcmd link d:\system c:\ -f
此命令将在 d: 下创建一个文件夹快捷方式,其目标为 C 盘。文件夹快捷方式终于得到了支持,普通快捷方式还是文件夹快捷方式,完全取决于其中的选项“-f”。
link 命令提供了 pecmd 相同的功能,但它使用选项予以指定,如下面的命令同样创建了文件夹快捷方式,但改变了图标:
wtcmd link d:\system c:\ -f -i shell32.dll,7
是的您已发现选项常常可以省略,而且能以任意的顺序指定,如下面的命令与上命令效果相同:
wtcmd link d:\system c:\ -i shell32.dll,7 -f
从这一点上讲,wtcmd 可以比 pecmd 更为灵活,增加选项、扩展起来也更加容易。
需要注意的是尽管解释器通常不区分大小写,但选项引导字符,如上面的“-i”和“-f”是区分大小写的(这样实现起来更容易一些)——因此建议对命令等均使用小写——欢迎对此发表意见。
示例3:挂载 WIM 镱像
------------------------------------------------------------------
wtcmd moun d:\minint.wim Z:\Programs\minint
功能与 pecmd 差不多,不过多解释。
您可以使用“-w”选项使得镱像可写:
wtcmd moun d:\minint.wim Z:\Programs\minint -w
为了卸载镱像,可以简单地传递一个目录:
wtcmd moun Z:\Programs\minint
可以使用“-c”选项提交(commit)可写镱像发生的改变:
wtcmd moun Z:\Programs\minint -c
wtcmd 对于卸载作为增强,你可以传递一个“-e”选项,e 代表“empty”,传递此选项时,解释器将尝试删除挂载目录的父目录或父目录的父目录等等中的空目录。
如本例假设执行
wtcmd moun d:\minint.wim Z:\Programs\minint
前 Z 盘下并不存在 Programs 文件夹,则
wtcmd moun Z:\Programs\minint -e
在卸载了镱像后,除删除 minint 目录外,Programs 目录也会被删除。您会发现这一功能有时是有用的。
示例4:删除文件
------------------------------------------------------------------
wtcmd file -d \pagefile.sys
这一命令将删除所有驱动器下的“pagefile.sys”。wtcmd 增强了 pecmd 的 FILE 命令,以“\”开头的对象被认为与所有驱动器下的路径匹配。这一增强可能很有用,然而也可能有危险性,欢迎发表意见。
您可能奇怪,为什么前面的选项都在后面,而这里的选项“-d”却跑到了前面呢?
实际上我打算保持两种风格,一种是如“mess”、“link”和“moun”这种命令,它们的“参数 arguments”个数是固定的,这样将“选项 options”放到后面可避免头重脚轻;
另一种是 file 这类命令,它们可以接受多个“参数 arguments”,而且选项一般更简单一些,将选项放到前面,起类似“子命令”的作用。
wtcmd file -d \pagefile.sys \*.tmp
除删除“pagefile.sys”外,还将删除各驱动根目录下的“tmp”文件。
示例5:使用命令文件
------------------------------------------------------------------
将下面文本存为“d:\first.txt”
# This is a comment.
mess "共传递了 $# 个参数。" -t 5000
执行命令:
wtcmd load d:\first.txt a b c
您将获得一个消息框,告诉您传递了 3 个参数。
为了使命令文件(pecmd 所称配置文件)更为灵活,wtcmd 支持加载命令文件和调用子程序时传递参数,参数的个数用“$#”予以提取。
还有一系方法读取传递的参数,等待更详细的文档。
示例6:使用条件语句
------------------------------------------------------------------
条件语句 if 和循环语句 while 只能在命令文件中使用,将下面的文本存为“d:\second.txt”
mess "是否要设置页面文件?" -i q -m yn -t 30000 -c question
if return yes
mess "正准备设置页面文件..." -t 3000
# more code
end
执行命令:
wtcmd load d:\second.txt
将会看到一个对话框,如果选择“是”,将看到第二个对话框。
解释器还可以使用 while 循环语句,不过由于处理变量的 envi 命令还未完善,暂不给出示例。
wtcmd 目前才刚写出来,如果您什么的意义或建议,欢迎提出。刚出来的东西我们可以对其进行大量修改,以符合习惯,待以会成熟了,再改就比较困难了。
wtcmd 并不兼容 pecmd 配置文件,不过有许多地方是按 pecmd 的习惯来设计的。wtcmd 目前功能十分有限,您应该仅将其作为 pecmd 的补充来使用。
承诺永久公开 wtcmd 源代码,您可以修改以符合自己的需求,但修改后必需公开修改前后的源代码,并不能以 wtcmd 命令名解释器,源代码的任何部分也不能用于商业用途。
wtcmd 的构架十分灵活,可以这样说,任何一个主函数为原型“int wmain(int argc, wchar_t *argv[]);”的 C 程序均可通过修改 wtcmd 源代码的 3 处直接集成到解释器中。
老九长期致力于 pecmd 的维护,热切期待您的宝贵意见!
wtcmd v1.0 beta1 by shoulea
23:53 2010-9-13
[ 本帖最后由 shoulea 于 2010-11-24 23:20 编辑 ] |
-
image.jpg
(95.79 KB, 下载次数: 88)
-
-
wtcmd v1.0 beta1.rar
39.57 KB, 下载次数: 221, 下载积分: 无忧币 -2
wtcmd(by shoulea) v1.0 beta1
-
-
wtcmd(by shoulea) v1.0 beta2.rar
44.27 KB, 下载次数: 146, 下载积分: 无忧币 -2
-
-
calcexpr.rar
107.08 KB, 下载次数: 157, 下载积分: 无忧币 -2
-
-
wtcmd(by shoulea) v1.1.rar
45.12 KB, 下载次数: 239, 下载积分: 无忧币 -2
-
-
wtcmd v1.3 beta1.rar
65.35 KB, 下载次数: 90, 下载积分: 无忧币 -2
|