如何防止命令提示符在执行后关闭?

Sk8*_*ter 60 windows command-line batch-file

我的问题是在 Windows 中,有些命令行窗口在执行后立即关闭。为了解决这个问题,我希望默认行为是窗口保持打开状态。通常,可以通过我想到的三种方法来避免这种行为:

  1. pause在批处理程序后放一行提示用户在退出前按一个键
  2. net start xycmd.exe(开始 - 运行 - cmd.exe)中运行这些批处理文件或其他命令行操作工具(甚至服务启动、重启等或类似的东西)
  3. cmd /k像这样运行这些程序: cmd /k myprogram.bat

但是还有一些其他情况用户:

  1. 第一次运行程序并且不知道给定的程序将在命令提示符(Windows 命令处理器)中运行,例如从“开始”菜单(或其他地方)运行快捷方式时,或
  2. 发现一直运行 cmd.exe 有点不舒服,并且没有时间/机会到处重写这些命令的代码以在它们之后暂停或避免显式退出。

我读过一篇关于更改cmd.exe显式打开时的默认行为的文章,创建了一个AutoRun 条目并在这些位置操作其内容:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor\AutoRun
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Command Processor\AutoRun
Run Code Online (Sandbox Code Playgroud)

(自动运行项目是_String values_...)

我把它cmd /d /k作为一个值来试一试,但这根本没有改变上面提到的东西的行为......它只是在显式打开命令行窗口时改变了它的行为(开始-运行- cmd.exe)。

那么它是怎样工作的?你能给我任何解决这个问题的想法吗?

小智 29

我有一个只能应用于.cmd.bat文件的解决方案:

打开regedit并转到以下各项:

[HKEY_CLASSES_ROOT\batfile\shell\open\command]
[HKEY_CLASSES_ROOT\cmdfile\shell\open\command] 
Run Code Online (Sandbox Code Playgroud)

现在将“默认键值”更改为cmd.exe /k "%1" %*. 现在,每个批处理脚本窗口在执行后都将保持打开状态。

请注意,这就像使用cmd.exe /c cmd.exe /k program.bat,这意味着另一个 CMD 实例将被启动到父实例中。我找不到如何覆盖第一个/c参数。

您也可以使用[exefile],但现在如果可执行文件具有 GUI,它将显示一个空的控制台框。

  • +1 表示这里唯一的解决方案实际上回答了给出的问题。不幸的是,我认为这可能是等待发生的内存泄漏。当服务启动一个新的批处理文件而不在 CMD 行中指定 CMD.EXE 时会发生什么?在这种情况下不会使用此代码吗?这不是要在非交互式桌面上创建一个新窗口并保持打开状态直到您重新启动吗? (5认同)

use*_*686 18

引用微软

当附加到控制台的最后一个进程终止或调用 FreeConsole 时,控制台将关闭。

换句话说,Win32 控制台窗口将始终在其中运行的最后一个程序退出时关闭,并且您无法更改此设置。


(对于 16 位 MS-DOS 程序,Windows 在属性对话框中提供了一个选项“退出时关闭”,但这并不是上述行为的例外:它是保持窗口打开的 NTVDM 进程。此外,这个选项是再次每个程序。)

  • @Breakthrough 问题是“我怎么做 X”,而不是“在你看来,我应该做 X”。这个答案没有帮助,它意味着 X 是不可能的,因为部分解决方案已经在别处提出。(-1) (33认同)
  • +1 理解*如何*和*为什么*控制台窗口关闭(而不是大多数人只是说“我的天啊,为什么它不能保持打开状态!!!!!!!!!!!1111one”)。它的行为符合设计,恕我直言,它应该保持这种状态。这是我们首先拥有标准流和批处理文件的主要原因。 (13认同)

Lee*_*son 9

只需在批处理文件所在的位置打开命令提示符,然后手动键入批处理文件的名称即可在该窗口中运行它。

1.导航到可执行文件所在的文件夹
2.Shift-右键单击并选择“来自此处的命令窗口”
3.键入可执行文件的名称并按回车键
4.进程应该运行,但窗口应该保持打开状态


Wer*_*ght 5

cmd.exe /k会给你一些批次的麻烦。如果批处理exit 1(没有/B),您的控制台将被关闭。一个技巧是使用:

cmd.exe /k cmd /c ...
Run Code Online (Sandbox Code Playgroud)

要默认对所有批处理文件使用此选项,请将HKEY_CLASSES_ROOT\cmdfile\shell\open\command\(default)和设置HKEY_CLASSES_ROOT\batfile\shell\open\command\(default)"%windir%\system32\cmd.exe" /k "%windir%\system32\cmd" /c "%1" %*.