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

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

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

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

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

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

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

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor\AutoRun
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Command Processor\AutoRun

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

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

那么它是如何工作的?你能给我一些解决这个问题的想法吗?

答案1

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

打开regedit并转到以下每一个:

[HKEY_CLASSES_ROOT\batfile\shell\open\command]
[HKEY_CLASSES_ROOT\cmdfile\shell\open\command] 

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

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

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

答案2

引用微软

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

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


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

答案3

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

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

答案4

grawity读完答案后,我只是想到了一个愚蠢的解决方案。

我的用例是在工作中设置一个控制台环境,其中所有更合理的解决方案都被阻止。我所需要的只是设置 PATH 并配置一些 doskey 别名,然后将其转储到 shell。

我的解决方案(刚刚在 Win7 上测试过)是将其添加cmd为批处理文件的最后一行。这将运行一个嵌套的命令提示符,该提示符继承了其父级的环境。该子 shell 将保持批处理进程打开,直到您退出,此时批处理没有子进程并且也会退出。

相关内容