cmd-quit 和 exit 的区别

cmd-quit 和 exit 的区别

如果您输入telnetcmd,则必须输入quit才能退出,但如果您输入wmic,则quit和都exit可以。

Welcome to Microsoft Telnet Client

Escape Character is 'CTRL+]'

Microsoft Telnet> exit
Invalid Command. type ?/help for help
Microsoft Telnet> quit    
C:\windows\system32>

C:\windows\system32>wmic
wmic:root\cli>quit

C:\windows\system32>

C:\windows\system32>wmic
wmic:root\cli>exit

C:\windows\system32>

此外,Ctrl+C应该中止正在运行的进程或终止批处理作业,但Ctrl+C也会退出wmic但不会telnet

为什么会有这么多混乱?为什么不能有一个统一的标准?

答案1

原因是应用程序是分开的。Telnet 会在您的终端中启动 telnet.exe 程序,您输入的所有内容都发生在 telnet.exe 中,而不是在 cmd.exe(您的命令提示符)中。您的命令提示符只是您向 telnet 发送 telnet 命令的界面。

wmic.exe 是一个单独的程序,它有自己的一组命令,它的退出命令可能与其他程序不同。您可以查看在命令提示符中运行的每个程序的命令列表,其中有一些标准,但它们不是“必然的”。

如果您要在命令提示符内启动 python 会话,则 ctrl+c 将会中断 python 活动,但 exit() 将是运行以退出的命令。

如果您需要更多解释,请告诉我,基本上每个程序(telnet.exe,nslookup.exe,wmic.exe)都有自己独特的命令集,并且它们并不总是标准化的,因为每个程序都涉及不同的开发人员或团队或随着时间的推移而发生的变化。

如上面的评论所述,telnet 也是许多供应商使用的较旧的标准化服务,而 wmic 是 Microsoft 开发的产品,这是查看标准化命令时要考虑的另一件事 - 例如,Microsoft 开发的工具(wmic 等)更有可能具有标准化命令,而跨平台工具(telnet、ssh 等)在各个平台(Mac、*nix、Windows)上的行为相同,但不符合 Apple 开发或 Microsoft 开发的通用/最佳实践。

答案2

以下是 Windows SDK 的文档。至于为什么,因此程序可以定制其工作方式 Ctrl + C 也是字符代码 3,即控制代码 etx - 文本结尾。还请记住,CMD这只是一个普通的控制台程序,就像wmic或 一样ftp

控制台控制处理程序

每个控制台进程都有自己的控制处理程序函数列表,当进程收到 CTRL+C、CTRL+BREAK 或 CTRL+CLOSE 信号时,系统会调用这些函数。最初,每个进程的控制处理程序列表仅包含一个调用 ExitProcess 函数的默认处理程序函数。控制台进程可以通过调用 SetConsoleCtrlHandler 函数来添加或删除其他 HandlerRoutine 函数。此函数不会影响其他进程的控制处理程序列表。当控制台进程收到任何控制信号时,它会按照最后注册、最先调用的原则调用处理程序函数,直到其中一个处理程序返回 TRUE。如果没有处理程序返回 TRUE,则调用默认处理程序。

该函数的dwCtrlType参数标识接收到了哪个控制信号,返回值指示该信号是否被处理。

有关控制处理程序函数的示例,请参阅注册控制处理程序函数。

CTRL+C 和 CTRL+BREAK 信号

CTRL+C 和 CTRL+BREAK 组合键由控制台进程进行特殊处理。默认情况下,当控制台窗口具有键盘焦点时,CTRL+C 或 CTRL+BREAK 被视为信号(SIGINT 或 SIGBREAK)而不是键盘输入。默认情况下,这些信号会传递给连接到控制台的所有控制台进程。(分离的进程不受影响。)系统会在每个客户端进程中创建一个新线程来处理事件。如果正在调试进程,该线程会引发异常。调试器可以处理异常或继续处理未处理的异常。

CTRL+BREAK 始终被视为信号,但应用程序可以通过两种方式更改默认的 CTRL+C 行为,以防止调用处理程序函数:

SetConsoleMode 函数可以禁用控制台输入缓冲区的 ENABLE_PROCESSED_INPUT 输入模式,因此 CTRL+C 被报告为键盘输入而不是信号。

当使用 NULL 和 TRUE 值作为其参数调用 SetConsoleCtrlHandler 时,调用进程将忽略 CTRL+C 信号。使用 NULL 和 FALSE 值调用 SetConsoleCtrlHandler 可恢复正常的 CTRL+C 处理。忽略或不忽略 CTRL+C 信号的此属性由子进程继承,但任何进程都可以启用或禁用它,而不会影响现有进程。

CTRL+CLOSE 信号

当用户关闭控制台时,系统会生成 CTRL+CLOSE 信号。连接到控制台的所有进程都会收到该信号,从而使每个进程都有机会在终止之前进行清理。当进程收到此信号时,处理程序函数可以在执行任何清理操作后执行以下操作之一:

调用ExitProcess来终止进程。

返回 FALSE。如果所有已注册的处理程序函数均未返回 TRUE,则默认处理程序将终止该进程。

返回 TRUE。在这种情况下,不会调用其他处理程序函数,并且会弹出一个对话框询问用户是否终止该进程。如果用户选择不终止该进程,则系统不会关闭控制台,直到该进程最终终止。

将有关此主题的评论发送给 Microsoft

建造日期:2006 年 10 月 2 日

答案3

全部quitq退出telnetshell。

并退出shell exitquitwmic

exit退出cmd.exe,即 Windows 命令提示符 shell。

因此,这取决于您所在的位置以及您要退出的内容,因为 shell [如接受命令的交互式程序] 有自己的命令。

相关内容