Board logo

标题: 老病新药:非中文环境下进入中文目录 [打印本页]

作者: willsort     时间: 2005-9-2 17:36    标题: 老病新药:非中文环境下进入中文目录

To All:

      在不加载任何汉字系统或平台的纯DOS环境下,如何进入中文目录,这是一个老问题了。在使用启动盘恢复系统时可能会遇到它,如果Ghost镜像所在的目录是个中文名,一张普通的Win98启动盘肯定是没有中文环境支持的,这时候,我们该怎么办?

      一个经典且流行的解决办法是dir>file,然后再edit file,将其中的中文乱码部分保留下来,然后在前面加上cd空格,保存为enter.bat,然后回到DOS下,就可以enter进入中文目录了。

      然而这不是“老病新药”的初衷,我的题目是,如何只用内部命令进入中文目录,所以edit被无情的抛弃了。

      题目的详细描述如下:

      1、目标磁盘D:下仅存在一个目录,名为“测试”,如何在命令行仅使用DOS内部命令进入此目录。

      2、D:下存在两个目录,分别名为“测试”和“test”,其他同1;

      3、D:下存在两个目录,分别名为“测试”和“测试2”,其他同1;

      4、D:下存在两个目录,名均为中文,其中仅有一个目录中包含一名为test.dat的文件,如何在命令行仅使用DOS内部命令进入此目录;

      5、D:下存在三个目录,名均为中文,仅有一个目录中包含一名为 test.dat 的文件,其他同4;

      6、D:下存在三个目录,分别名为“测试1”、“测试2”、“测试3”,如何在命令行仅使用DOS内部命令进入“测试2”目录;

      7、D:下存在三个目录,分别名为“测试一”、“测试二”,“测试三”,如何在命令行仅使用DOS内部命令进入“测试三”目录;

      Last:在批处理中实现以上需求,批处理中仍然不能使用任何外部命令。

[ Last edited by willsort on 2006-4-18 at 23:25 ]
作者: chujiafu     时间: 2005-9-4 18:42
的确是个挑战。学习……
作者: Climbing     时间: 2005-9-4 19:38
嘿嘿,debug + for + find,估计着可以解决,但没有什么实用价值。

研究这个问题我认为也没有什么太大的实用价值。纯技术性的吧。
作者: willsort     时间: 2005-9-4 19:54
Re Climbing:

      debug和find都是外部命令,是在题目限制之外的。

      至于题目的实用性,在遇到用单纯的DOS/Win98引导盘(只含引导必须文件)进入系统中的中文目录是有用的,这种情况我过去曾遇到过许多次。

      题目的难度应该不是很大,我将着手再增加几个子题。

[ Last edited by willsort on 2005-9-4 at 20:32 ]
作者: Climbing     时间: 2005-9-4 20:47
说实在的,DOS有哪些内部命令我都搞不太清楚,不能用debug和find,那只好用prompt了,还是等着你公布答案学习吧,嘿嘿
作者: willsort     时间: 2005-9-4 21:10
Re Climbing:

      DOS的内部命令就是COMMAND.COM内部支持的命令,这个查阅MS-DOS的帮助文档就可以得到了。此题目所用到的内部命令不会很多,也不会有很偏僻的用法,大约就是dir/cd/copy等几个命令,可能会用到一些简单的批处理,prompt我到没有考虑过。

      另外,需要注意的是,前面的问题子项都是互相独立的,没有顺序性,也没有要求全部实现,我自己也只有大概的思路,而且除了最后一个子项外,其他都是要求在命令行实现的,这就增加了许多操作上的自由度。
作者: badcfqtd     时间: 2005-9-4 23:13


  Quote:
Originally posted by willsort at 2005-9-2 17:36:
To All:

     在不加载任何汉字系统或平台的纯DOS环境下,如何进入中文目录,这是一个老问题了。在使用启动盘恢复系统时可能会遇到它,如果Ghost镠...

不知道是怎么的,我的机子老是出毛病,不听话。我按你的老方法作了个试验结果是得到这样的信息:The filename,directory name,or volume label syntax is incorrect. 这句话的意思大致是说,文件名,目录名或者标签句法不正确,这是什么原因呢?

[ Last edited by badcfqtd on 2005-9-4 at 23:15 ]
作者: willsort     时间: 2005-9-5 12:41
Re  badcfqtd:

      请贴出你的enter.bat的详细内容。
作者: badcfqtd     时间: 2005-9-5 17:14
不用了,谢谢.俺了瑞在MS-DOS下的确不能用.不过,我在咱联盟下载的DOS711居然没有EDIT.EXE难怪老是提示错误命令.不过,把WINXP的那个EDIT.EXE复制过去能用也就将就用了.

[ Last edited by badcfqtd on 2005-9-5 at 18:01 ]
作者: willsort     时间: 2005-9-6 19:31
Re All:

      我先给出第1题的我的方案吧,按顺序在命令行下执行以下命令:
  d:
  cd \
  copy con enter.bat
  cd (键入Ctrl+Z或者键入“F6”键,不含括号)
  dir /ad /b>>enter.bat
  enter
[ Last edited by willsort on 2005-9-8 at 11:21 ]
作者: chenhui530     时间: 2005-9-8 10:24
我公布下下面的几个问题的方法
由于没有DOS环境所以请大家测试一下
问题2:
attrib +h +s +a /d /s
attrib -s -h test
copy con 123.bat
::输入"cd"+"空格"然后按F6
dir /adhsa /b>>123.bat
call 123.bat

问题3:
copy con 234.bat
::输入set a=再按F6
dir /ad /b>>234.bat
call 234.bat
del 234.bat
if exist %a%2 goto cd_
attrib +s +h +a /s /d *
attrib -s -h %a%
copy con 234.bat
::输入"cd"+"空格"再按F6
dir /adsha /b *>>234.bat
call 234.bat

:cd_
cd %a%
pause
问题4:
copy con 234.bat
::输入set a=再按F6
dir /ad /b>>234.bat
call 234.bat
del 234.bat
if exist %a%\test.dat goto cd_
attrib +s +h +a /s /d *
attrib -s -h %a%
copy con 234.bat
::输入"cd"+"空格"再按F6
dir /adsha /b *>>234.bat
call 234.bat

:cd_
cd %a%
pause
问题6:
copy con 234.bat
::输入set a=再按F6
dir /ad /b>>234.bat
call 234.bat
del 234.bat
attrib +h +r +a /s /d *
attrib -h -r -a %a%
copy con 234.bat
::输入"cd"+"空格"再按F6
dir /adhar /b *>>234.bat
call 234.bat
pause
作者: willsort     时间: 2005-9-8 11:31
Re chenhui530:

      确实与我的思路不同,不过其中的attrib是外部命令,不符合题目限制条件。而goto命令在命令行也是不起作用的,如果你的解答是批处理,那么在copy con 语句后跟cd 或者set 无法得到你所期望的效果的。

      至于测试,你可以在Windows命令行下做同样测试,只要不是中文环境即可。XP下可以command启动命令行,或者cmd启动后用chcp 437更改代码页。目录的地址也可以由D:盘根更改为其它子目录,只要解答不依赖于特殊路径即可。

      现给出我的第二题的方案(在MSDOS7.1测试通过):
  d:
  cd\
  echo cd %1>callcd.bat
  copy con enter.bat
  callcd (键入Ctrl+Z或F6,不输入括号)
  dir /ad /o-n /b>>enter.bat
  enter

───────────────── 版主提示 ─────────────────
帖中红色并带下划线的言论内容,目前被认定为是不恰当的,敬请注意!
具体讨论参见本主题22-26楼的回复帖
───────────────── 版主提示 ─────────────────


[ Last edited by willsort on 2006-4-19 at 15:11 ]
作者: chujiafu     时间: 2005-9-10 06:42
Re willsort兄:
          现在看来,你的方案的应用还是有限的。因为在通常情况下,D:盘有N个目录和N个文件。而你的只是仅一个目录、两个目录、三个目录。

[ Last edited by chujiafu on 2005-9-10 at 06:53 ]
作者: willsort     时间: 2005-9-10 10:14
Re chujiafu:

      任何复杂的问题都是简单的部分组成的,如果能解决好这些简单的部分,那么其任何复杂的组成都应该不能难倒我们。

      我的题目中所限定的一个、两个和三个目录,只是为了简化问题的复杂性,但是它已经涵盖了问题的不少方面,只要能够活学活用,就应该可以解决大部分的实际应用问题。即使所在路径有多个目录和多个文件,也可以通过各种方法来过滤出我们需要的目标。
作者: willsort     时间: 2005-9-16 10:05
Re All:

      现给出第3题的我的方案:
  d:
  cd \
  copy con enter.bat
  cd (键入Ctrl+Z或者键入“F6”键,不含括号)
  dir ???? /ad /b>>enter.bat
  enter

作者: luxuriant1770     时间: 2005-9-16 20:20
難題啊,我一直沒找到答案.............
作者: brglng     时间: 2005-9-16 23:31
如果可以用外部工具的话用一个mousclip就解决问题了
作者: xjmxjm1234     时间: 2006-4-18 21:58
原来是围绕着 dir 命令来的啊
问题6:
  d:
  cd \
  copy con enter.bat
  cd (键入Ctrl+Z或者键入“F6”键,不含括号)
  dir ????2 /ad /b>>enter.bat
  enter

[ Last edited by xjmxjm1234 on 2006-4-19 at 08:10 ]
作者: xjmxjm1234     时间: 2006-4-18 22:19
至于问题4和5:
用了 dir/s/b test.dat  但总是带test.dat
用了 truename  但总是在根目录
好难,公布答案吧!
作者: xjmxjm1234     时间: 2006-4-18 22:27
资料:所有内部命令

  Quote:

Internal (内部命令): ( 注:这些是msdos7.X中支持的内部命令)
Break  设置对键盘中断某程序执行的命令的检查。即对ctrl -C 的检查。
Call   呼叫另一个批处理,或可执行文件,或command
CD / ChDir  进入目录(退出目录)
CHCP  修改或显示当前的代码页
Cls  清屏
Copy  复制,拷贝
CTTY  将控制台输入和输出改向其它设备
Date   显示或设置系统日期
Del / Erase  删除文件
Dir  列出文件和目录列表
Echo 显示控制开关。
Exit  退出command环境。(该command环境是在DOS提示符中执行另一个新的command的拷贝而创建的,也叫dos SHELL?)
For  用于运行一指定命令或一系列的命令. 通常用在批处理文件中,但也能用于命令提示符后。
GoTo 转向语句
If  条件语句
LfnFor  当运行FOR命令时支持长文件名。
Lock  锁定对磁盘的直接读取。
MD / MkDir  创建目录
Path  路径
Pause  暂停
Prompt  设置提示符格式
RD / RmDir  删除目录
Rem & ::   注释
Ren / Rename  改名,重命名
Set   设置
Shift  位移,在批处理文件中用作改变可替换参数的位置。
Time  显示和设置时间
Truename 显示长文件名格式和8.3格式之间的对应关系,或subst命令创建的虚拟盘
Type  在屏幕上显示文本文件的内容
Unlock 解锁对磁盘的直接读取
Ver  显示msdos的版本号
Verify  校验。以保证写入磁盘的内容可读。
Vol 显示磁盘的卷标和序列号。


作者: willsort     时间: 2006-4-18 23:11
Re xjmxjm1234:

      兄对第6题存在误解,题中目录名数字均为全角,在非中文环境下无法输入。

      现公布第4题我的解答,主要利用了命令行的交互特性,需要用户控制。如果在批处理中,且不使用外部命令,则需要使用复杂的技巧来实现判断选择,还没有考虑得很完善。

  Quote:
d:
cd \
dir /ad /on /p /s /w
(用户交互:观察命令输出中test.dat位于哪个目录中)
copy con enter.bat
cd (键入Ctrl+Z或者键入“F6”键,不含括号)
(如果test.dat在第一个目录,则 dir /ad /b /on>>enter.bat)
(如果test.dat在第二个目录,则 dir /ad /b /o-n>>enter.bat)
enter

[ Last edited by willsort on 2006-4-19 at 17:56 ]
作者: zhangxue     时间: 2006-4-19 09:47
有点不明白为何在根目录就可以,在第二层目录就失败。
作者: willsort     时间: 2006-4-19 14:07
Re zhangxue:

      请注意解答中的第二行"cd \",它是将当前目录切换为题目中的测试目录——根目录,如果你的测试目录在子目录下,则需要用 cd subdir 之类的语句进行切换。
作者: zhangxue     时间: 2006-4-19 14:41
我并没有cd\,图1,2是在根目录测试,有两个目录:(1)System Volume Information;(2)新建文件夹。测试成功。

图三是在test目录进行测试,里面只有一个目录:新建文件夹。测试失败。

[ Last edited by zhangxue on 2006-4-19 at 14:45 ]
附件 1: Snap1.jpg (2006-4-19 14:41, 28.91 K, 下载附件所需积分 1点 ,下载次数: 1)


附件 2: Snap2.jpg (2006-4-19 14:41, 16.62 K, 下载附件所需积分 1点 ,下载次数: 1)


附件 3: Snap3.jpg (2006-4-19 14:52, 28.5 K, 下载附件所需积分 1点 ,下载次数: 1)



作者: zhangxue     时间: 2006-4-19 14:48
简单的说就是在根目录下,可以用cd ?????进入名为“新建文件夹”的目录。
但是却不能在test目录中用cd ?????来进入名为"新建文件夹"的目录。
作者: willsort     时间: 2006-4-19 15:00
Re zhangxue:

      已经证实,以上的我的一系列解答,在NT CMD环境下无效,感谢 zhangxue 兄的提醒。

      其原因是因为,NTCMD将无法识别其编码的字符串均转换成为了由问号组成的字符串,这导致字符串的内码发生变化,当然就无从进入相应的目录了。

      在根目录下的测试成功,是因为NTCMD在根目录下使用类似cd ?????的命令形式时,会将?????作为通配符进行匹配,由此导致cd ?????会进入第一个匹配的目录中,即第一个含有5个或5个以内字符的子目录。而在其他各级子目录下NTCMD无此特性。

      另外,建议zhangxue兄在转贴命令行输出内容时,仅复制和粘贴输出的文字信息,以节省论坛有限的附件空间资源。复制方法,在命令行窗口中,点击右键,选择“标记”,然后拖动鼠标选择复制区域,选定后按回车即复制完成,然后再粘贴到论坛帖中即可。

[ Last edited by willsort on 2006-4-19 at 15:05 ]
作者: xjmxjm1234     时间: 2006-4-19 17:45
真的很难啊,是不是要用 shift 命令啊,我不大会哦
在 cmd.exe 里 ? 表示一个字符(一个汉字)
而在 dos 里 ? 表示一个字节哦(半个汉字) 不一样的
作者: zereyzerey     时间: 2006-4-25 20:16    标题: 只要有edit.com就可以

我以前常遇到这样的问题,如果你要进C盘某一中文目录。你就先要进其他盘。只要不是C盘就可以了。然后运行edit然后在[open]菜单下打开你要进的中文目录。虽然是乱码,但是不是可以进。见到你想要的文件后(例如ghost.exe)。再按[Esc]键退出,再退出edit.com,在提示符下再打 c:[回车],你就会发现进了刚才用edit.com浏览的中文目录了。虽然有点复杂,但是可行性是100%。你们可以试试。
作者: kcdsw     时间: 2006-4-27 19:50
chcp ??

活动的代码页?
作者: xjmxjm1234     时间: 2006-4-28 22:02
可是只用内部命令就很难了.
作者: wang6610     时间: 2006-4-30 07:36
不错
作者: xjmxjm1234     时间: 2006-4-30 20:01
怎么不公布答案了啊,好期待啊!
作者: martin325     时间: 2006-5-4 16:29
突破楼主的限制,组合使用CTMOUSE.EXE与MOUSCLIP.exe,要使用MouseClip时,只要运行Clip.BAT就行。

由于多次加载CTMOUSE.EXE的话,可能导致死机,故在Clip.BAT中加了if exist的判断。

经本人在纯DOS下测试:
如果Ghost.exe在中文目录下,只要运行Clip.BAT,用鼠标右键复制Ghost所在目录的中文乱码,在前加上“CD”,就可以进入该中文目录,即可运行Ghost.EXE,非常方便与快速。

注意在中文目录里运行Ghost,请不要加载显示长文件名的doslfn,至少经我测试,加载DOSLFN 0.40d 的话,运行Ghost就出错,不知为何?

Clip.BAT的内容如下:

@echo off
if exist %mouse1% goto step1
LH CTMOUSE.EXE >NUL
set mouse1=CTMOUSE

:step1
if exist %mouse2% goto step2
LH MOUSCLIP.EXE >NUL
set mouse2=MOUSCLIP

:step2
echo The MouseClip is ready.
作者: martin325     时间: 2006-5-4 16:38
运行Ghost出错的信息提示为:
Message: Cannot create a File Preservation Metadata File at path "."
作者: martin325     时间: 2006-5-4 16:39
GHOST所在的中文文件夹的目录名为“新建文件夹”
作者: xjmxjm1234     时间: 2006-5-6 13:38
斑竹呢?快公布答案啊!