我和我的朋友争论说命令提示符只是在 Windows 窗体环境中运行的 MS-DOS 的 GUI 版本。他完全不同意我的观点。
谁是对的?
答案1
这曾经是正确的,但现在不再正确了。
从MS-DOS # Windows 命令行界面 - 维基百科:
所有版本的 Microsoft Windows 都具有类似 MS-DOS 的命令行界面 (CLI)。这可以在同一个命令行会话中运行多个 DOS 以及各种 Win32、OS/2 1.x 和 Posix 命令行实用程序,允许在命令之间进行管道传输。用户界面和图标一直到 Windows 2000 都遵循本地 MS-DOS 界面。
消费级 Windows(最高 3.11、Win9x、WinME)以图形用户界面 (GUI) 的形式运行在 MS-DOS 之上。Windows 95、98 和 ME 集成了 MS-DOS 部分,将两个操作系统视为一个完整的软件包。命令行通过 Windows 模块 (winoldap.mod) 访问 DOS 命令行(通常是 command.com)。
新版 Windows(Windows NT)通过内核启动,其唯一目的是加载 Windows。无法以 OS/2、UNIX 或消费者 Windows 启动字符模式会话的方式在加载器系统中运行 Win32 应用程序。
因此,在 NT 系列的每个 Windows(例如 XP、Vista、7、8)中,命令提示符和 MS-DOS 在视觉上相似,但却有很大不同。
答案2
不。
(除非你对平等的定义不延伸到»*它是一个文本界面,我可以从中运行程序。*«)
单击时运行什么命令提示符开始菜单中的是 Windows 命令处理器,又名cmd.exe
。其内置命令和脚本语法(包括许多怪癖)基于command.com
CP/M 和后来的 MS-DOS 的古老语法,但除此之外,它们是完全独立的东西。此外,command.com
是一个 16 位程序,而cmd.exe
是一个原生 Windows 控制台应用程序。
在 Windows 95、98 和 ME 中情况有所不同command.com
将在 MS-DOS VM 中运行,Windows 充当虚拟机管理程序(是的,他们当时已经有了这种东西)。那里有一整台虚拟机在运行 DOS。但在 Windows NT、2000、XP、Vista 和 7 上没有。DOS 只存在于ntvdm.exe
NT 虚拟 DOS 机中,它只是一个薄薄的模拟层,用于捕获 CPU 无法直接执行的调用(这就是它运行速度更快但比 DOSBox 更差的原因)。
无论如何,它command.com
只是 DOS 的一个外壳。它并不是操作系统。
在里面,每次看到有人将黑底灰字的窗口称为 MS-DOS 时,我都会感到很尴尬。在大多数情况下,他们实际上并不知道他们指的是什么。
答案3
它们是不同的东西 -命令提示符不是 MS-DOS- 但就用户而言可以与他们做同样的事情是一样的。
所以这取决于你的观点。从技术角度来看,你朋友的说法是正确的,但从用户角度来看,你的说法是正确的(就像专家会发现其中的差异一样)。
答案4
它们不一样!
显然,很多人没有意识到 DOS 提示符和 Windows 命令提示符不是一回事。它们实际上是两个不同的程序 - 分别是 COMMAND.COM 和 CMD.EXE。
首先,由于平台(DOS 与 Windows)和解释器(command.com
vs cmd.exe
)的差异,明显的不同喜欢
- DOS 运行于全屏没有窗口模式,因此没有
mode con:cols=COL lines=ROW
调整控制台大小的命令,也没有title
命令 - DOS 不支持多任务、多用户、注册表、权限、长文件名、符号链接/硬链接、网络、Unicode、动态磁盘和高级卷支持...因此没有工具来管理这些
但也有主要差异在里面能力和句法command.com
和之间的内部命令cmd.exe
,以及两个环境中的一些外部工具。在 MS-DOS 中有
- 无标准流例如 stdin、stdout、stderr,因此像
dir 1>out.txt
、dir 2>err.txt
、这样的流重定向dir >out.txt 2>&1
不起作用 - 没有函数、代码块
()
或本地作用域,这意味着for
,if
...后面必须跟一个单身的在同一行上执行命令,没有for ... (multiple lines)
或if ... (multiple lines)
否
exit /b
或goto :eof
否
setlocal
,并且endlocal
goto
只能跳转到标签,call
只能启动另一个批处理文件,而不能调用函数或进行间接扩展命令不能像
( command1 command2 ) >output.txt
- 不间接扩张(例如
call set %%var%suffix%=string
)变量,没有延迟扩张(例如echo !var%suffix%!
) - 没有转义字符
^
。打印特殊字符会很麻烦,而且无法运行多行命令或向程序传递特殊参数 - 没有特殊格式
if
,这意味着- 否
if cmdextversion
,并且if defined
- 没有数字和不区分大小写的字符串比较
if [/i] string1 compare-op string2
- 否
- 没有命令历史记录和命令参数完成
- 没有高级字符串操作
- 不
~xxxV
变量扩展支持 - 不
%variable:~num1,num2%
支持子字符串或字符串替换%variable:str=newstr%
- 不
- 没有高级形式
set
:- 没有匹配的部分变量名(或之
set
类的东西不起作用)set com
set pro
- 没有
set "var=value"
语法 - 不
set /a
,所以你不能做算术 - 不
set /p
,这意味着读取用户输入很麻烦
- 没有匹配的部分变量名(或之
- 否
for /d
,for /r
或for /l
。否for /f
,因此从文件读取输入也很困难。DOS 中的唯一形式for
是FOR %variable IN (set) DO command [command-parameters]
%*
整个命令行没有变量- 否
findstr
,并且find
不支持 Unicode - 不特殊环境变量喜欢
%CD% %DATE% %TIME% %RANDOM% %ERRORLEVEL% %CMDEXTVERSION% %CMDCMDLINE% %HIGHESTNUMANODENUMBER%
- 没有高级目录更改能力:
- 不
pushd/popd
- 没有
cd /d
。也没有cd path with spaces
,cd "path with spaces"
因为缺乏对长文件名的支持
- 不
- 不
color
命令 - 不
forfiles
,这意味着在文件上运行命令或获取特殊字符更加复杂 - 不可以
shift /N
。每次只能移动一个参数 - 否
assoc
或ftype
(因为没有 GUI 并且必须从命令行手动打开文件,所以不需要文件关联)
很多别的内部命令也不可用:dpath
,,keys
mklink
。start
很多有用的外部命令在 Windows 中,例如,,where
(在某些 DOS 版本中),... 在 DOS 中也缺失sort
more
choice
以下是 MS 的 Rich Turner 所说的话
另外,Cmd != MS-DOS!
我还想指出上述文章中存在的一个常见误解:Cmd <> MS-DOS!
实际上:
- 微软上次发布“新”版本的 MS-DOS(Windows ME 中的 v8.0)是在 2000 年 9 月 16 日 - 距今已有 16 年(截至撰写本文时)!
- MS-DOS 是一个操作系统(尽管以今天的标准来看是一个相对简单的操作系统),其主要用户界面是命令行 shell,直到 Windows 3.x 和 9.x 出现并在 MS-DOS 上运行
- MS-DOS 的命令行 shell 的脚本语言相对简洁且功能强大,但缺少我们在现代 PowerShell、Bash 等中享受的许多更丰富、更高级的功能。
- 虽然 MS-DOS 的后续版本变得更加复杂,并用用“C”编写的新代码添加/替换了一些较旧的汇编语言,但 MS-DOS 的大部分内容仍以 x86 汇编语言编写,以提高效率,并且因为这是当时访问许多硬件设备和外围设备的唯一方法。这使得 MS-DOS 无法移植到非 x86 CPU。如果您愿意,您可以下载 MS-DOS v1.1 和 v2.0 的源代码,看看 MS-DOS 的早期版本中有多少是用 x86 汇编语言编写的(提示:几乎所有)!
https://devblogs.microsoft.com/commandline/rumors-of-cmds-death-have-been-greatly-exaggerated/
进一步阅读
- MS-DOS 6.22 的限制
- 从 MS-DOS 6.22 到 Windows 8 的命令及其可用性
- Windows 8 中的新命令(和已删除的命令)
- 现代
.bat
文件与旧的 MS DOS.bat
文件有何不同? - Windows 批处理文件:.bat 与 .cmd?
- cmd.exe:与 MS-DOS 提示符的比较
- 命令行界面不是“DOS 提示符”
总而言之,从功能上讲,它们可能有点相似,但在其他方面却有很大不同