总结

总结

直到现在,我从来没有想过(也从来没有观察到)cmdcommand是两码事。好吧,是吗?

看一下这张照片:

32 位 Windows 7 中的 cmd.exe 和 command.com 的屏幕截图

cmd实际上,每当我想使用命令行时,我通常都会从“运行”对话框打开(对于 Git/VIM)。因此,我自定义了显示位置、字体、颜色等。今天,我改变了一下,输入了command“运行”而不是“运行” cmd,发现我的窗口上出现了一些新的东西。其窗口中有“DOS”。

cmd因此,显然和之间应该有区别command。我想知道

  1. 它们之间的区别。
  2. 为什么微软将它们分开(Unix和Linux默认只有一个shell,Bash)。

答案1

总结

当你运行 32 位控制台程序时,它由 执行cmd;当你运行 16 位控制台程序时,它由 执行command

细节

Windows XP 包含一个支持旧式 16 位应用程序的子系统。

旧的 16 位应用程序既可以用作 DOS 程序,也可以用作 Windows 程序。DOS 程序本质上是控制台应用程序,运行方式类似于命令提示符。但是 32 位 Windows 控制台应用程序非常相似,外观相同。

命令处理器/解释器cmd有几个用途:

  • 执行 32 位文本 Windows 控制台程序
  • 提供和处理各种命令行功能(dircopy等)
  • 解释并执行批处理文件(DOS兼容.bat文件和NT兼容.cmd文件)

当你运行一个旧的 16 位控制台程序时,它由 NTVDM(Windows NT 虚拟 DOS 机)执行。它提供了一个模拟的 DOS 系统(因此虚拟DOS机) 类似于运行专用的虚拟机软件,只是模拟层更简单。command是一个 16 位版本的命令解释器,它比cmd.exe实际的 Windows 程序更接近实际的 DOS(并且具有 Windows PE 标头,而不像command.com它具有 DOS MZ 标头)。

command用途与 相同,cmd只是它仅支持 16 位程序。此外,它不支持.cmd文件,内置命令较少,语法也更有限(cmd是一种较新、较现代、较先进的命令行解释器,类似于4DOS)。

但是,它支持图形 DOS 程序(如旧游戏),但运行它们的成功取决于视频卡驱动程序和程序的性质。有许多网站提供各种花招让 DOS 游戏在 Windows 上运行(尽管在 Vista 及更高版本上的成功率通常比在 XP 上更有限)。

需要注意的是,64 位版本的 Windows 已经完全放弃了对 16 位程序的支持,因此command根本不包括,所以 DOS 和 Windows 16 位程序都无法运行,而是会抛出(误导)错误信息


技术说明

command.com具有.com与 DOS 程序向后兼容的扩展名,但与大多数其他 Windows 版本的外部 DOS 命令一样,在内部,它实际上是 Windows PE.exe文件。这提供了一个有趣的观察结果:虽然 Windows 使用扩展名作为如何处理大多数文件类型的指标,但对于可执行文件,它会忽略扩展名并查看其内容(否则如果将其.exe视为 ,则将不起作用.com)。这个问题与此影响有关。

答案2

与 DOS 程序 COMMAND.COM 不同,cmd.exe 是通常在 Win32 控制台中运行的本机 Windows 应用程序。这使它能够利用平台上本机程序可用的功能,而 DOS 程序则无法使用此功能。

还...

OS/2 和 Windows NT 版本的 cmd.exe 都具有比 command.com 的笼统的“错误的命令或文件名”(在命令格式错误的情况下)更详细的错误消息。

这是来自这一信息量维基百科文章。

提到了如何将旧的 command.com 命令纳入新的 cmd.exe 功能...例如...

deltree (command.com) 的功能以 /s 参数的形式纳入 rd (cmd.exe)

因此,请随意阅读。

答案3

它们是不同的 shell,因此语法和许多其他东西都不同。其他答案中提供了一些很好的信息,因此这里是对语法差异的总结。有关更多详细信息,请阅读我的答案:命令提示符和 MS-DOS 是同一个东西吗?

  • command.com不支持使用以下命令进行分组()
  • command.com没有函数或局部作用域
  • command.com没有转义字符,^位于cmd.exe
  • command.com不支持if cmdextversionand if defined,也不支持数字和不区分大小写的字符串比较if [/i] string1 compare-op string2
  • command.com没有命令历史记录和命令参数完成
  • command.com不支持间接扩张(例如call set %%var%suffix%=string)变量或延迟扩张(例如echo !var%suffix%!
  • command.com不支持高级字符串操作:否~xxxV多变的,没有子字符串%variable:~num1,num2%或字符串替换%variable:str=newstr%
  • set中的命令不command.com支持部分变量名匹配,并且没有set /aset /pset "var=value"
  • command.com不支持%*扩展到整个命令行
  • command.com没有for /dfor /rfor /lfor /f
  • command.com没有特殊环境变量喜欢%CD% %DATE% %TIME% %RANDOM% %ERRORLEVEL% %CMDEXTVERSION% %CMDCMDLINE% %HIGHESTNUMANODENUMBER%
  • command.com没有pushd/popdcd /d。显然它不支持cd path with spacescd "path with spaces"喜欢cmd.exe
  • command.com没有colortitle命令

相关内容