2011-07-04 15:32:05 +0000 2011-07-04 15:32:05 +0000
56
56

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

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

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

但也有一些其他的情况:

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

我看过一篇文章关于改变_String values_显式打开时的默认行为,创建一个AutoRun条目并在以下位置操作它的内容:

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

(AutoRun项是cmd /d /k…)

我把&007作为它的值,试了一下,但这并没有改变上面提到的东西的行为….. 它只是改变了显式打开命令行窗口(Start-Run-cmd.exe)时的行为。

那么它是如何工作的呢?能否给我一些解决这个问题的思路?

答案 (11)

18
18
18
2011-07-04 17:45:20 +0000

引用微软

当最后一个附加在它上面的进程终止或调用FreeConsole时,控制台就会被关闭。

换句话说,当Win32控制台窗口内运行的最后一个程序退出时,Win32控制台窗口总是会被关闭,而你无法改变这一点。


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

8
8
8
2013-03-21 14:10:13 +0000

只要在你的批处理文件的位置打开一个命令提示符,然后手动输入批处理文件的名称,在该窗口中运行。

4
4
4
2012-11-06 13:37:01 +0000

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

cmd.exe /k cmd /c ...

要想在所有批处理文件中默认使用这个,请将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" %*

3
3
3
2014-04-26 16:55:23 +0000

看完grawity的回答后,我刚刚碰到了一个笨办法。

我的用例是在工作中设置了一个控制台环境,在这个环境中,所有比较合理的方案都被屏蔽了。我所需要的就是设置PATH和配置一些doskey别名,然后被转储到shell。

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

2
2
2
2015-12-11 17:02:56 +0000

假设你有两个批处理文件,你想在自己的实例中启动它们,并在它们的可执行文件退出时保持打开。让我们称这两个批处理文件为A.batB.bat

现在为了简单起见,你可以有一个批处理文件来启动这两个文件,让我们称它为launch_both.bat,内容为:

start cmd /k "A.bat & cmd /c"
start cmd /k "B.bat & cmd /c"

。这就需要测试一下了。

2
2
2
2013-03-21 20:02:36 +0000

与其使用pause(必要时使用pause,我更喜欢choice或timeout),不如使用这里的解决方案。

这样,如果你在Windows资源管理器中点击一个批处理文件或链接(快捷方式),你可以让批处理文件程序在退出前暂停,这样你就可以查看程序的输出和错误信息。

使用CHOICE,你可以为用户编程,让用户选择各种操作,使用TIMEOUT可以让窗口在延迟一段时间后关闭(无人值守)。如果你在命令提示符窗口中运行批处理文件,这些暂停可能会让人很烦躁。

你可以在提供的链接中阅读更多,但它的基本原理是,它使用环境变量:

%cmdcmdline%

来判断批处理文件是否从命令窗口运行。

1
1
1
2013-03-12 15:30:15 +0000

我发现最好的方法是用start来调用另一个批处理文件。

1
1
1
2013-09-24 12:30:12 +0000

这适用于5.00版本的Windows注册表编辑器。

[HKEY_CLASSES_ROOT\batfile\shell\open\command]
@="cmd.exe /k \"%1\" %*"

[HKEY_CLASSES_ROOT\cmdfile\shell\open\command]
@="cmd.exe /k \"%1\" %*"

&001

将上述cmds保存到一个类似于cmdbatfile-open.reg的文件中,然后执行它!

0
0
0
2017-03-30 08:30:11 +0000

对于使用Windows 10的用户,请注意以上答案目前在Windows 10上都不起作用。

对于Windows 10,如果你有权限使用该脚本,需要在最后添加以下代码:

read

该代码将在关闭前等待输入。

0
0
0
2019-12-31 21:58:53 +0000

OP的问题比我所需要的要复杂得多,所以这个答案是给那些来这里寻找一个简单的方法来启动一个命令行程序并在命令行程序退出后保持窗口打开的人。我的解决方案是这样的:

文件:RunNodeJS.bat*

@echo off
cd /d c:\
cmd.exe /k cmd /c node

然后我在桌面上创建了一个快捷方式,双击该快捷方式启动cmd.exe控制台,运行node命令,并在它(node命令)退出后保持打开。

0
0
0
2017-06-30 03:30:27 +0000

在回应降级的PSIXO - “这个答案在问题中已经涵盖了。- Ro Yo Mi Jan 20 ‘16 at 5:06” – 不,不是的。前面的答案是:"pause",这并没有起到作用。"暂停",这并没有起到作用。PSIXO的答案是: “& pause",这确实有效。在降级之前,请仔细分析一下。我在IDLE提示符下运行了这个,结果成功了:

>>> os.system('dir ^ & pause')
    0
    >>>

另一方面:

>>> os.system('dir ^ pause')
    1
    >>>

不成功(cmd提示符跳过,事实上返回了一个错误(1))。感谢PSIXO给我提供了我需要的答案。Henry.