命令提示符和 MS-DOS 是一回事吗?

use*_*733 13 windows command-line ms-dos cmd.exe

我和我的朋友争论说,命令提示符只是 MS-DOS 的 GUI 版本,它可以在 Windows 窗体环境中运行。他完全不同意我的看法。

谁是对的?

Den*_*nis 22

这曾经是真的,但现在不是了。

MS-DOS # Windows 命令行界面 - 维基百科

所有版本的 Microsoft Windows 都有类似 MS-DOS 的命令行界面 (CLI)。这可以在同一个命令行会话中运行许多 DOS 和不同的 Win32、OS/2 1.x 和 Posix 命令行实用程序,允许命令之间的管道。用户界面和 Windows 2000 的图标都遵循本机 MS-DOS 界面。

消费者 Windows(最高 3.11、Win9x、WinME)作为运行在 MS-DOS 之上的图形用户界面 (GUI) 运行。在 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 在视觉上相似,但完全不同。

  • 事实上,我想说这“从来”都不是真的。与“cmd.exe”等效的是“command.com”,它是 MSDOS 的“小”部分。 (3认同)

Chr*_*isF 9

它们是不同的东西——命令提示符不是 MS-DOS——但就用户而言,它们可能是同一件事,因为他们做同样的事情。

所以这取决于你的观点。从技术角度来看,您的朋友是正确的,但从用户角度来看,您是正确的(有点像专家会发现的差异)。


Joe*_*oey 8

不。

(除非你对平等的定义没有延续下去»它是一个文本界面,我可以从中运行程序。 «

当您在“开始”菜单中单击“命令提示符”时运行的是 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.exeNT 虚拟 DOS 机中,它只是一个薄的仿真层,捕获 CPU 无法直接执行的调用(这就是为什么它运行得更快但比 DOSBox 更差)。

无论如何,evencommand.com只是 DOS 的一个 shell。不是操作系统。

在里面,每次看到人们将带有灰底黑字的窗口称为 MS-DOS 时,我都会感到畏缩。在绝大多数情况下,他们实际上并不知道他们指的是什么。


thu*_*ein 5

据我了解,MS-DOS是微软发布的磁盘操作系统。命令提示符是一个非图形界面,允许您与操作系统交互。

\n\n

命令提示符是大多数 Windows 操作系统中可用的命令行解释器应用程序,正式名称为 Windows 命令处理器,但有时也称为命令 shell。命令提示符是一个 Windows 程序,它模拟 MS-DOS 中提供的许多命令行功能,但它实际上并不是 MS-DOS。

\n\n

命令提示符是\xc2\xa0a MS-DOS 中command.com 的GUI 版本。cmd.exe 是一个本机 Windows 应用程序,通常在 Win32 控制台中运行。这使得它能够利用平台上本机程序可用的功能,而 DOS 程序则无法使用这些功能。

\n\n

例如,由于 cmd.exe 是 OS/2 上的本机文本模式应用程序,因此它可以在命令管道中使用真实管道,从而允许管道的两侧同时运行。因此,与 COMMAND.COM 不同,可以重定向 cmd.exe 中的标准错误。(COMMAND.COM 使用临时文件,并依次运行两侧。)

\n\n

实际上,cmd.exe 是一个 Windows 程序,充当类似 DOS 的命令行解释器。它通常是兼容的,但提供了解决 COMMAND.COM 的一些限制的扩展(以上解释由 Wikipedia 引用)。

\n


phu*_*clv 5

他们不一样!

显然很多人没有意识到 DOS 提示符和 Windows 命令提示符不是一回事。它们实际上是两个不同的程序 - 分别是 COMMAND.COM 和 CMD.EXE。

了解您的命令提示

首先,由于平台(DOS vs Windows)和解释器(command.comvs cmd.exe)的差异,会有明显的差异,例如

  • DOS 以全屏方式运行,没有窗口模式,因此没有mode con:cols=COL lines=ROW命令来调整控制台大小,也没有title命令
  • DOS 不支持多任务、多用户、注册表、权限、长文件名、符号链接/硬链接、网络、Unicode、动态磁盘和高级卷支持...因此没有工具来管理这些

但和之间内部命令的功能和语法以及两个环境中的一些外部工具也存在重大差异。在 MS-DOS 中有command.comcmd.exe

  • 没有标准流,如 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 /bgoto :eof

    • setlocalendlocal

    • goto只能跳转到一个标签,call只能启动另一个批处理文件,而不能调用函数或进行间接扩展

    • 命令不能像这样组合在一起

      (
      command1
      command2
      ) >output.txt
      
      Run Code Online (Sandbox Code Playgroud)
  • 没有变量的间接扩展(例如),也没有延迟扩展(例如)call set %%var%suffix%=stringecho !var%suffix%!
  • 没有转义字符^。打印特殊字符会很痛苦,并且不可能运行多行命令或将特殊参数传递给程序
  • 没有特殊格式if,这意味着
    • if cmdextversionif defined
    • 没有数字和不区分大小写的字符串比较if [/i] string1 compare-op string2
  • 没有命令历史记录和命令参数完成
  • 没有高级字符串操作
  • 没有高级形式set
    • 没有部分变量名称匹配set(诸如set com或 之类的东西set pro不起作用)
    • 没有set "var=value"语法
    • set /a,所以你不能做算术
    • set /p,这意味着读取用户输入很痛苦
  • for /dfor /r或者for /l。不for /f,所以从文件中读取输入也很困难。DOS 中的唯一形式forFOR %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 spacescd "path with spaces"因为缺乏长文件名支持
  • color命令
  • forfiles,这意味着在文件上运行命令或获取特殊字符更加复杂
  • shift /N。您一次只能移动一个参数
  • assocftype(因为没有 GUI 并且必须从命令行手动打开文件,因此不需要文件关联)

许多其他内部命令也不可用:dpathkeys mklinkstart。Windows 中许多有用的外部命令,where如, sort, more(在某些 DOS 版本中)choice... 在 DOS 中也缺失


这就是 MS 的 Rich Turner 所说的

另外,Cmd != MS-DOS!

我还想指出上述文章所延续的一个常见误解:Cmd <> MS-DOS!

实际上:

  • Microsoft 上次发布“新”版本的 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/


进一步阅读

总之,在功能方面它们可能有点相似,但在其他方面却有很大不同

  • 哇,这看起来是一个很好的答案 [Windows 中的 CMD 和命令提示符之间有什么区别?](https://superuser.com/questions/451816/what-is-the-difference- Between-cmd-and- Windows 中的命令提示符)也是如此 (2认同)