不。

不。

我和我的朋友争论说命令提示符只是在 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.comCP/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 更差的原因)。

无论如何,它command.com只是 DOS 的一个外壳。它并不是操作系统。

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

答案3

它们是不同的东西 -命令提示符不是 MS-DOS- 但就用户而言可以与他们做同样的事情是一样的。

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

答案4

它们不一样!

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

了解你的命令提示符

首先,由于平台(DOS 与 Windows)和解释器(command.comvs cmd.exe)的差异,明显的不同喜欢

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

但也有主要差异在里面能力句法command.com和之间的内部命令cmd.exe,以及两个环境中的一些外部工具。在 MS-DOS 中有

  • 无标准流例如 stdin、stdout、stderr,因此像dir 1>out.txtdir 2>err.txt、这样的流重定向dir >out.txt 2>&1不起作用
  • 没有函数、代码块()或本地作用域,这意味着
    • forif...后面必须跟一个单身的在同一行上执行命令,没有for ... (multiple lines)if ... (multiple lines)

    • exit /bgoto :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
  • 没有命令历史记录和命令参数完成
  • 没有高级字符串操作
  • 没有高级形式set
    • 没有匹配的部分变量名(或之set类的东西不起作用)set comset pro
    • 没有set "var=value"语法
    • set /a,所以你不能做算术
    • set /p,这意味着读取用户输入很麻烦
  • for /dfor /rfor /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 并且必须从命令行手动打开文件,所以不需要文件关联)

很多别的内部命令也不可用:dpath,,keys mklinkstart很多有用的外部命令在 Windows 中,例如,,where(在某些 DOS 版本中),... 在 DOS 中也缺失sortmorechoice


以下是 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/


进一步阅读

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

相关内容