中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » WinPE、PowerShell及其它命令行系统专区 » [讨论]CMD自动完成特性对中文文件和目录名存在问题
作者:
标题: [讨论]CMD自动完成特性对中文文件和目录名存在问题 上一主题 | 下一主题
willsort
元老会员

Batchinger


积分 4432
发帖 1512
注册 2002-10-18
状态 离线
『楼 主』:  [讨论]CMD自动完成特性对中文文件和目录名存在问题

To All:

      最近,在与 namejm 兄讨论完善一个关于定期备份的批处理时,遇到了一个问题,在此提出请各位指教。

      在使用 cmd /f:on 开启自动完成特性后发现,如果测试目录下存在中文名的目录或文件,那么使用Ctrl+D或Ctrl+F可以正常完成这个目录或文件名,但是在继续使用Ctrl+D或Ctrl+F完成,并且下一个目录或文件的名字长度短于已完成的目录或文件名,则在显示新目录或文件的名字后,旧的目录和文件名并未完全消失,而会残留一定的痕迹。

      例如,测试文件夹仅有两个文件,分别名为“长文件名”和“短名”,则在cmd /f:on 开启自动完成后,第一次按下Ctrl+F会显示“长文件名”,而第二次按下Ctrl+F会显示“短名 名”。

      需要说明的是,旧文件残留的痕迹不会影响新文件的正常识别。

      据分析,这应该是自动完成未能正确处理多字节字符(包括中文)文件名所造成的。在上述的测试中,第二次自动完成前,它仅仅清除了上一次显示的前三个汉字,宽度相当于6个英文字符。这似乎是cmd将上一次完成的文件名按Unicode规则将字符串长计算为4,再加上回车所代表的0d/0a两个字符,共6个。也就是说cmd以6个英文的空白字符重写了原来的文件名,以清除其显示内容,而可能未考虑到多字节字符的显示宽度要数倍于英文字符。

[1][原创][XP]文件备份器[V1.9 06-06-06]
http://www.cn-dos.net/forum/viewthread.php?tid=20747&fpage=1



※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2006-6-8 01:19
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
electronixtar
铂金会员





积分 7493
发帖 2672
注册 2005-9-2
状态 离线
『第 2 楼』:  

呵呵,在XP以上的cmd中不需要 /f:on 用 Tab / Shift+Tab 也可以实现相应功能的~~和 *nux一样~~




C:\>BLOG http://initiative.yo2.cn/
C:\>hh.exe ntcmds.chm::/ntcmds.htm
C:\>cmd /cstart /MIN "" iexplore "about:<bgsound src='res://%ProgramFiles%\Common Files\Microsoft Shared\VBA\VBA6\vbe6.dll/10/5432'>"
2006-6-8 21:50
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
namejm
荣誉版主

batch fan


积分 5226
发帖 1737
注册 2006-3-10
来自 成都
状态 离线
『第 3 楼』:  

  electronixtar真是个有心人,这么隐蔽的功能也找得到,PF。

  但是用 Tab / Shift+Tab 同样会产生Ctrl+F或Ctrl+D的文件名残留问题,其他问题由于想不到测试的办法而没有发现。

  嘿嘿,CMD真是越来越有趣了。

2006-6-9 07:54
查看资料  发短消息 网志   编辑帖子  回复  引用回复
willsort
元老会员

Batchinger


积分 4432
发帖 1512
注册 2002-10-18
状态 离线
『第 4 楼』:  

Re electronixtar:

      大略Google搜索了一下关于自动完成的信息。

      在非微软网站的信息中,所见皆明言或暗示自动完成默认是关闭的,需要cmd /f或者cmd /f:on开启。

      在微软网站发布的信息中,大多文章转贴了CMD的帮助信息,“文件和目录名完成不按默认值启用。”或者“ile and Directory name completion is NOT enabled by default.”

      在TechNet中找到一些有用的信息:

      与自动完成相关的注册表资源有两个子键和四个表项:

HKLM\Software\Microsoft\Command Processor\CompletionChar
HKLM\Software\Microsoft\Command Processor\PathCompletionChar
HKCU\Software\Microsoft\Command Processor\CompletionChar
HKCU\Software\Microsoft\Command Processor\PathCompletionChar

      正常状态下,这四个表项中只要有一项的值为控制字符,则自动完成将开启。PathCompletionChar仅完成目录名,CompletionChar完成文件名和目录名。在同时设置的情况下,HKCU的设置优先于HKLM。使用 cmd /f 后,自动完成字符将固定为Ctr+D/Ctrl+F,不受HKCU/HKLM的键值控制。

      关键是默认值的问题,因为CompletionChar如果是0x0,0xD,或者大于>=0x20的字符,则自动完成将关闭(实际上是因为不符合激活条件而无法被激活)。而关于默认值的表述,在TechNet的文章中[1][2]出现了矛盾。[1]的默认值为0x9,即Tab,[2]的默认值为0x40,即disabled。

      另外,TechNet的相关文章是位于Windows Server 2003技术库的,对XP和2000不具有指向性。在我的现在XP系统中,CompletionChar为0x9,但是我的系统并非原版,而是优化过的版本,我自己也曾修改过CompletionChar。也无法排除ServicePack或者HotFix是否曾经对其进行了修改。

      所以,这个问题仍然需要进一步验证。

[1] CompletionChar  Entry
http://technet2.microsoft.com/Wi ... a1033.mspx?mfr=true

[2]Command Processor\CompletionChar
http://technet2.microsoft.com/Wi ... a1033.mspx?mfr=true



※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2006-6-9 16:51
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
3742668
荣誉版主





积分 2013
发帖 718
注册 2006-2-18
状态 离线
『第 5 楼』:  

在很早的时候,发现在命令提示符下输入ALT+9就会得到当前目录下的某个文件名,后来才知道ALT+9就是TAB,然后依次发现ESC可以取消当前的输入,F1到F9都有不同的功能,不过大多数都与DOSKEY有关系。
    后来有一天也发现了willsort所述问题,当时百思不得其解,直到有一天发现了chr(13)的作用才豁然开朗:
With Wscript.StdOut
    .Write "你好,这里是中国DOS联盟脚本版"
    Wscript.Sleep 1000
    .Write chr(13) & "error"
end With
保存为  测试.vbs  后,运行cmd,输入cscript //b //nologo就可以看到结果了。
    如果不是用write方法而是用writeline方法的话会自动转到下一行而不会出现此现象。

   此帖被 +1 点积分    点击查看详情   
评分人:【 yayumyself 分数: +1  时间:2007-2-28 13:43


2006-6-11 17:49
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
willsort
元老会员

Batchinger


积分 4432
发帖 1512
注册 2002-10-18
状态 离线
『第 6 楼』:  

Re 3742668:

      你说的chr(13),应该就是回车符(0x0d),在DOS的语义中,它只回车不换行,换行是由换行符控制的(0x0a;chr(10))。

      而回车、换行的排列组合不同造成了MSOS/Unix/Mac这三大系统纯文本格式的不同。MSOS是0d0a,Unix是0a,Mac是0d。

      但这与自动完成的问题尚有不同。如果依照上述观点,“longname”之后的“sname”应该显示“sname  e”,而非“sname”。而如果文件名中夹杂有中英文字符,你就更容易看到问题所在了。

      而按照它可以按长度清除而非按区块清楚的模式来看,它最有可能采用的清除算法就是将原缓冲区字符全部置换为空白字符,或者重新生成一个由空白字符组成的等长字符串,然后再次于原位输出(类似于.Write)。而因为编译系统采用Unicode编码,不同显示宽度的英文和中文字符,有相同的字节长度和字符长度,所以出现错误就可以预料了。

   此帖被 +1 点积分    点击查看详情   
评分人:【 yayumyself 分数: +1  时间:2007-2-28 13:45




※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2006-6-11 19:28
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
cxm2000
初级用户




积分 141
发帖 22
注册 2004-6-7
状态 离线
『第 7 楼』:  

都是高人啊

2006-6-15 19:19
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
lxmxn
版主




积分 11386
发帖 4938
注册 2006-7-23
状态 离线
『第 8 楼』:  


5楼版主的脚本比较有趣,但是还是没搞懂,以为显示了"你好,这里是中国DOS联盟脚本版"之后回回车换一行继而显示“error”,但结果却不是我想象的那样,而是在同一行显示,而且后面的“这里是中国DOS联盟脚本版”还保留着,与自动完成的残缺现象和相象,3742668版主可以解释一下这个“chr(13)”在这个脚本里面的作用吗?


2006-10-8 05:57
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
hario
新手上路





积分 6
发帖 2
注册 2008-1-21
状态 离线
『第 9 楼』:  

我认为是添加空格。

2008-1-21 22:18
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

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


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



论坛跳转: