当我尝试CD\
从我们的地图驱动器时,我得到:
错误:'cd\' 不被识别为内部或外部命令、可操作程序或批处理文件。
但有了空间(cd \
),它就起作用了,
T:\bat>cd\
‘cd\’ 不被识别为内部或外部命令,也不是可运行的程序或批处理文件。
T:\bat>cd \
T:\>
谁能告诉我这是为什么?
答案1
CmdPi
的回答重复了人们普遍接受的观点,即微软的命令解释器的工作方式与 UNIX shell 类似。这是 20 世纪 80 年代每个人都用脚投票的方式。但事实上他们没有这样做,现在仍然没有这样做。
命令名称可以并且可以分离命令尾部用相当多的字符来表示,而不仅仅是用空格。例如,可以使用等号或逗号。 path=C:\DOS
是命令和尾部。 也是dir,dos
。最著名的是,可以使用句号。因此,echo.
在命令脚本中回显空白行的著名技巧。不太为人所知的是echo;
,echo+
、echo=
、echo(
、echo,
、echo[
、echo]
、echo\
和echo/
都会做同样的事情(尽管对其中一些来说并非总是如此)。
实际上,有一个 DOS API 调用 ( int 21h,ax=6505h
) 可用于获取所谓的“文件名终止字符”的完整字符列表。并且 DOS 命令解释器使用它来确定哪些字符终止命令名称并开始命令尾部。(非 DOS 操作系统的 Microsoft 命令解释器可能只是硬连线字符集。)
反斜杠就是其中的一个字符,在从 Microsoft 的command
MS-DOS 到 Microsoft 的cmd
Windows NT 的命令解释器(包括 IBM/Microsoft 的cmd
OS/2)中,都可以执行该命令cd\
,结果是命令解释器将目录更改为\
。命令尾是否包含终止符实际上因命令而异。对于 命令cd
是这样的。对于dir
和path
命令则不是。(是的,Microsoft 命令解释器中的命令行解析器根据要运行的内置命令而表现不同。)
但这从未真正被记录下来。正如我所说:大多数人在 20 世纪 80 年代用脚投票接受了 UNIX shell 范例,即使诸如参数解析和引用之类的东西是一个巨大的阴谋虚构,根本不是由命令解释器实现的,而是由 DOS 的几种编程语言实现的运行时库实现的;并且您会发现大多数文献都自信地指出空格将名称与尾部分开,即使事实并非如此。 echo.
通常被描述为一种怪癖和技巧,很少被描述为 Microsoft 的命令解释器已经使用大约三十年的整体语法的一个例子。
我建议遵循 20 世纪 80 年代的趋势,不要依赖这种鲜为人知的语法。使用空格。这是人们记录的内容。这是 IBM 和 Microsoft 等公司自己记录的内容。这是民间智慧所说的情况。这是 UNIX 爱好者所期望的。☺
我的命令解释器遵循了 IBM 文档中的语法图表和描述。但是,您会发现 FreeCOM 实现了这种记录不多的行为,JP Software 的命令解释器和command
OpenDOS 也是如此。JP Software 的文档建议使用空格,并将使用其他终止字符描述为“非法”。但是,它是官方文档中真正说明有替代方案的少数地方之一。
进一步阅读
- 乔纳森·德·博因·波拉德(2010)。 与其他命令解释器的区别. 32 位命令解释器用户指南。
- “命令名称和参数”. TCC/Take Command 帮助。 JP 软件。
- ‘lib/is_fnamec.c’. FreeCOM 源。SourceForge。
- ‘shell/command.c’. FreeCOM 源。SourceForge。
答案2
CD 是命令,\ 是参数。
您必须用空格将两者分开。