[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[其他] cmdex 超越capi 自定义可扩展cmd

cmdex,ex即extension。之所以说超越capi,是因为capi有很多缺陷:
  • 作者按照自己的想法对cmd进行扩展,但没有提供额外的扩展空间。
  • 语法晦涩难懂,难以使用,也背离了bat作为脚本的简洁性。
  • 借助于set命令,只能作为二等公民。
  • 兼容性差,注入的方式容易被误杀。
而cmdex虽然不直接提供扩展的命令,但提供了用于扩展的接口,使每个人都能定义自己的cmd。

特性:
  • 提供像内置命令一样的调用方式,命令执行的优先级仅次于cmd内置命令和“cmdex”(预设命令),高于外部程序。
  • 直接提供命令字和上一行命令(可能包含多条命令或不足一条命令)供处理,提供最大的自由度。
  • >,<,>>等重定向一般不需要自行处理(未充分测试)。

扩展方式:
      程序启动时加载所在目录的ext.dll,并调用其导出的ExtCallBack函数,参数含义可自行测试,例子如下:
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <windows.h>
  4. #define DLL_EXPORT __declspec(dllexport)
  5. #define HANDLED     0
  6. #define UNHANDLED   1
  7. #ifdef __cplusplus
  8. extern "C"
  9. {
  10. #endif
  11. int DLL_EXPORT ExtCallBack(const wchar_t * cmd, const wchar_t * cmdline);
  12. #ifdef __cplusplus
  13. }
  14. #endif
  15. wchar_t * mycmd = L"mycmd";
  16. int DLL_EXPORT ExtCallBack(const wchar_t * cmd, const wchar_t * cmdline)
  17. {
  18.     if(wcsnicmp(cmd, mycmd, wcslen(mycmd)) == 0)
  19.     {
  20.         wprintf(L"cmd:%s\n", cmd);
  21.         wprintf(L"lastcmdline:%s\n", cmdline);
  22.         fflush(stdout);
  23.         return HANDLED;//命令已处理
  24.     }
  25.     return UNHANDLED;//命令未处理,继续查找外部程序
  26. }
复制代码
用法随你喜欢,可以简单的添加命令,甚至可以做成一个插件管理器,把常用的第三方做成动态库供加载使用。
附件是程序本体和例子编译成的dll。
链接: https://pan.baidu.com/s/1RB4-lLK4z26I_NT3Wz9Kyg 提取码: schc
2

评分人数

回复 2# bbaa


    capix只是避免了被误杀和改善了兼容性,其他方面并不比capi优越,当然也比不上这个。    而且定位不同,capix是在扩展cmd的功能,而这个是一个提供扩展的平台,让你们随意hack cmd

TOP

回复 6# Byaidu

我上面提到可以把扩展dll做成插件管理器,这样就可以无限制扩展了,比较懒所以没有自己做

TOP

回复 7# bailong360


    cmdline就只是上一条命令而已,并不是扩展环境后的,因为bat的命令不是按行来算的,比如复合命令和转义换行,所以为了灵活性就直接暴露出来而不是我来处理
    某种意义上这样可以写出不属于bat的语法,比如带括号的函数,等号赋值等.

    实现的本质还是hook api,hook了wcsicmp和wcschr

    ps:好久没在bat吧看见你了,我贴吧id是gzhmbk

TOP

回复 10# bailong360

soga,因为bat效率实在太低了,所以这点hook影响不大

确实有利有弊,不过还是觉得从程序本体抽离出来更好,方便改动

TOP

回复 12# bailong360

试了xpsp3和8.1的,所以8.1之前应该没问题,win10没试过

TOP

回复 14# bailong360


   发帖的时候忘记说了,这个和cmd有点不同,如果自己处理命令行的话,%%也是变量延迟扩展的效果,实现可以参考nt4的源码吧

TOP

返回列表