标题: [原创] “内部命令”你知道多少 [打印本页]
作者: qzwqzw 时间: 2010-4-27 11:54 标题: “内部命令”你知道多少
cmd内部命令(49个)
字母序排列
ASSOC BREAK CALL CD CHDIR CLS CMDEXTVERSION COLOR COPY DATE DEFINED DEL DIR DPATH ECHO ENDLOCAL ERASE ERRORLEVEL EXIST EXIT FOR FTYPE GOTO IF KEYS MD MKDIR MOVE NOT PATH PAUSE POPD PROMPT PUSHD RD REM REN RENAME RMDIR SET SETLOCAL SHIFT START TIME TITLE TYPE VER VERIFY VOL
命令表排列
DPATH CALL CD COLOR TITLE CHDIR CLS CMDEXTVERSION DEFINED COPY PATH PROMPT PUSHD POPD ASSOC FTYPE DATE DEL DIR ECHO ENDLOCAL ERASE ERRORLEVEL EXIT EXIST BREAK FOR GOTO IF KEYS MKDIR MD NOT PAUSE RD REM MOVE RENAME REN RMDIR SET SETLOCAL SHIFT START TIME TYPE VERIFY VER VOL
command内部命令(40个)
字母序排列
BREAK CALL CD CHCP CHDIR CLS COPY CTTY DATE DEL DIR ECHO ERASE ERRORLEVELF EXIST EXIT FOR GOTO IF LH LOADHIGH MD MKDIR NOT PATH PAUSE PROMPT RD REM REN RENAME RMDIR SET SHIFT TIME TRUENAME TYPE VER VERIFY VOL
命令表排列
NOT ERRORLEVELF EXIST DIR CALL CHCP RENAME REN ERASE DEL TYPE REM COPY PAUSE DATE TIME VER VOL CD CHDIR MD MKDIR RD RMDIR BREAK VERIFY SET PROMPT PATH EXIT CTTY ECHO GOTO SHIFT IF FOR CLS TRUENAME LOADHIGH LH
别名命令
CD CHDIR
DEL ERASE
LOADHIGH LH
MD MKDIR
RD RMDIR
RENAME REN
作者: gshccr 时间: 2010-4-27 13:03
谢谢楼主分享!学习了!呵呵...
作者: yiqingnan 时间: 2010-4-27 20:07
坐坐板凳 ,谢谢分享!
作者: qzwqzw 时间: 2010-4-28 15:57 标题: 内部命令你到底知道多少?
内部命令也有很多奇怪的地方
首先内部命令在cmd和command中的入口
并不是按照字母顺序排列的
否则顶楼也不会有字母序和命令表两种排列方式
也不是命令的出现的先后顺序
或者命令的功能分类等排列的
甚至cmd和command的排序都是不一样的
也就是说同是一家产品
却采用了不一样的排列规则
其次类似CMDEXTVERSION EXIST DEFINED NOT ERRORLEVEL等
IF命令的关键词也被列为同IF一个级别的命令
而ELSE IN DO等关键词则未出现在其中
这种CMD的处理模式很值得我们思考
同时也有助于我们理解某些语句内部变量延迟的用法
再次COMMAND中的某些内部命令是无效的
即使是在COMMAND自己的命令Shell中
比如truename loadhigh lh等命令
执行时报命令无法识别的错误
因为这些COMMAND中的命令在CMD中没有入口
所以可以判断COMMAND完全是徒有其表的一副空架子
内核则基本上被NTVDM和CMD替代了
执行16位程序时借用了NTVDM的资源
执行32位程序甚至大多数内部命令时又借用了CMD的资源
比如在command中执行一个比较长时间的dir
此时打开任务管理器就可以在发现cmd的身影
而经过进程跟踪可以发现command执行诸如dir copy等这些内部命令
都是通过简单的“cmd /c 命令行”的形式把包袱甩给了cmd
所以说COMMAND只是一个“入口程序”完全不为过
最后说一说从dos到win9x再到win2k,winxp
很多内部命令发生了变化
包括原来不是内部命令的成了内部命令(比如move)
原来是内部命令的现在被排除在外(比如chcp)
有很多内部命令从无到有(比如setlocal/endlocal,pushd/popd)
也有很多内部命令从有化无(比如ctty,loadhigh)
更多的内部命令功能特性发生变化
如dir、cd之流只是锦上添花增加了一些开关和参数
而for、if之辈则是大动干戈cmd美其名曰命令扩展
甚而像break之类更是脱胎换骨重新做命令
最可叹append之族愣是移花接木做了个双面命令
内部命令转行作外部命令(有append.exe为证)
竟然还在cmd内部留了个卧底(有dpath为证)
虽然windows在官方文档中留了一个命令变迁表(ntcmds.chm::/dos_diffs.htm)
可也是半遮半露浅尝辄止欲语还休
直让人感叹“不识命令真面目,只缘身在cmd中”啊!
[ 本帖最后由 qzwqzw 于 2010-4-28 16:58 编辑 ]
作者: Demon 时间: 2012-9-7 12:03
何谓命令表排列?
作者: qzwqzw 时间: 2012-9-14 23:04
这里所说的命令表就是指cmd.exe或者command.com二进制文件内部的命令名称串
该表的排列顺序大致遵循字母序
也有一些命令与历史渊源相关,比如ASSOC FTYPE
还有一些命令名称发生了变迁,比如
DPATH 原本的名称是 APPEND 所以排序比较靠前
还有一些命令可能存在二义性名称
比如BREAK 某些情境下会叫 EXTPROC 所以排序在EXIT之后
但是总体来说
这个排列带有很大的随机性
或者可以理解为程序员们的随意性
因为这些命令表并非是同一时期由同一批程序员维护的
所以排列带了很多的个性色彩
作者: Demon 时间: 2012-9-16 23:31
这里所说的命令表就是指cmd.exe或者command.com二进制文件内部的命令名称串
该表的排列顺序大致遵循字母序 ...
qzwqzw 发表于 2012-9-14 23:04
指的是这个么?
这个排列是由编译器来决定的,不是由程序员编排的,XP和Win 7并不一样。
CMD内部的确有一个表(数组),用来把命令名称的字符串映射到对应的内部函数,但是排序并不是你给出的那样。
这才是由程序员编排的,XP与Win 7一致(Win 7多了个MKLINK命令)- DIR
- ERASE
- DEL
- TYPE
- COPY
- CD
- CHDIR
- RENAME
- REN
- ECHO
- SET
- PAUSE
- DATE
- TIME
- PROMPT
- MD
- MKDIR
- RD
- RMDIR
- PATH
- GOTO
- SHIFT
- CLS
- CALL
- VERIFY
- VER
- VOL
- EXIT
- SETLOCAL
- ENDLOCAL
- TITLE
- START
- DPATH
- KEYS
- MOVE
- PUSHD
- POPD
- ASSOC
- FTYPE
- BREAK
- COLOR
- FOR
- IF
- REM
- CMDEXTVERSION
- ERRORLEVEL
- DEFINED
- EXIST
- NOT
复制代码
作者: qzwqzw 时间: 2012-9-17 09:30
一个Good发现
从现在的分析结果来看
真正的命令入口确实如你所言
以前的分析还真是浅尝辄止
从现在的入口表来看
仍然找不到排序的规律性
不知道这是否可以归结为随意性
当然是指程序员整体而非个体
至于cmd命令名称串的排列顺序
把它解释为编译器的决定似乎有失偏颇
即使是出于优化程序的需要
对同类数据资源的排列顺序做出变更
也不应该是编译器的权限所能决定
作者: Demon 时间: 2012-9-17 10:37
一个Good发现
从现在的分析结果来看
真正的命令入口确实如你所言
以前的分析还真是浅尝辄止
从现在的 ...
qzwqzw 发表于 2012-9-17 09:30
从别名命令放在一起可以看出,应该是经过一定的编排,只不过带有某种随意性。
CMD命令名称串只不过是C字符串常量而已,字符串常量由编译器来处理,一般放到.data段或.rdata段,
虽然一般来说编译后字符串常量的顺序与程序中定义的顺序一致,但是这并不是必须的,
字符串常量在内存的哪个地方并不重要,因为在使用字符串常量的地方会被编译为相应的内存地址。
作者: 学无止境 时间: 2012-10-6 20:38
学习了@!@
作者: jains521 时间: 2012-10-17 19:45
强大..学习了..
欢迎光临 批处理之家 (http://bathome.net./) |
Powered by Discuz! 7.2 |