我的问题是,在 Windows 中,有些命令行窗口在执行后会立即关闭。为了解决这个问题,我希望默认行为是窗口保持打开状态。通常,可以使用我想到的三种方法来避免这种行为:
- 在批处理程序后面添加
pause
一行,提示用户在退出前按下某个键 - 在(开始 - 运行 - cmd.exe)中运行这些批处理文件或其他命令行操作工具(甚至启动服务、重新启动等
net start xy
或类似操作)cmd.exe
- 像这样运行这些程序
cmd /k
:cmd /k myprogram.bat
但还有一些其他情况,用户:
- 第一次运行该程序,但不知道给定的程序是否会在命令提示符(Windows 命令处理器)中运行,例如从“开始”菜单(或其他地方)运行快捷方式时,或者
- 一直运行 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 将保持批处理进程打开,直到您退出,此时批处理没有子进程并且也会退出。