如何在批处理文件执行后自动关闭cmd窗口?

126

我正在运行一个批处理文件,其中包含以下两行:

start C:\Users\Yiwei\Downloads\putty.exe -load "MathCS-labMachine1"
"C:\Program Files (x86)\Xming\Xming.exe" :0 -clipboard -multiwindow

这个批处理文件用于启动Xming应用程序,然后启动PuTTY应用程序,以便我可以通过SSH连接到我的大学计算机实验室。

然而,如果我运行此文件并且Xming尚未打开,一旦我从PuTTY终端退出,cmd窗口仍然保持打开状态。只有当我已经运行了Xming时,关闭PuTTY终端时cmd窗口才会关闭。我已经尝试将exit添加到批处理文件的最后一行,但无济于事。


1
"C:\Program Files (x86)\Xming\Xming.exe" 是 putty.exe 的参数,还是一个独立的命令? - bpoiss
如果第二行是第二个命令,请尝试在其前面也加上“start”。 - Gray
1
@BernhardPoiss 这是一个单独的命令,而不是 putty.exe 的参数。如果我把这行放在最前面,它会卡住并且无法打开 putty。如果我在它前面加上 start,Windows 会显示“找不到'C:\Program',请确保输入正确。” - yiwei
恭喜!这个问题已经获得了第一百个赞。 - Syed M. Sannan
12个回答

169

将批处理文件修改为同时START两个程序,而不是先START一个程序再CALL另一个程序。

修改批处理文件以START两个程序,而不是START一个程序并CALL另一个程序。

start C:\Users\Yiwei\Downloads\putty.exe -load "MathCS-labMachine1"
start "" "C:\Program Files (x86)\Xming\Xming.exe" :0 -clipboard -multiwindow

如果您以此方式运行,程序启动后不会保留任何CMD窗口。


38
当你在路径中使用双引号时,需要添加一个第一个参数为 "" ,因为这时标题是必需的。第二个命令应该是 start "" "C:\Program Files (x86)\Xming\Xming.exe" :0 -clipboard -multiwindow,否则它会尝试打开一个名为 C:\Program Files (x86)\Xming\Xming.exe 的命令窗口,并尝试执行带有 -clipboard -multiwindow 参数的 :0 - Patrick Meinecke
4
如果命令是一个内部的 cmd 命令或者批处理文件,那么命令处理器将使用 /K 开关运行 cmd.exe。这意味着在命令运行后窗口会保持打开状态。 - CAD bloke
4
你提到的问题可以通过使用cmd.exe /C "start cmd.exe /C [...].bat ..."来解决。 - Thorsten Schöning
1
@patrick-meinecke 感谢您添加关于“”的评论,我很沮丧这给我带来了问题。我读了您的评论,然后有了一个灵光一闪的时刻。 - Michael Eakins
非常感谢,这真的很有帮助!+1 - thebunnyrules
显示剩余3条评论

41

通常情况下,批处理文件最后一行只需要写exit。如果你想要确保文件已经运行完毕,并且DOS窗口在2秒后关闭,你可以添加以下几行:

timeout 2 >nul
exit

但是,如果您的批处理文件打开了另一个窗口,那么exit 命令将无法工作,因为只要第二个窗口打开,旧的DOS窗口也将显示出来。

解决方案: 比如说有一个非常好用的免费程序叫做BgInfo,它会显示关于计算机的所有信息。假设它在名为C:\BgInfo 的目录中,那么可以使用以下代码从批处理文件运行它,并使用/popup 开关关闭DOS窗口:

start "" "C:\BgInfo\BgInfo.exe" /popup
exit

拥有“/popup”实际上给我带来了一个错误。删除它后一切正常。 - Dmitry Efimenko

13

使用批处理脚本打开VSCode后关闭cmd窗口

如果您已经安装了随VSCode一起安装的code命令:

echo | code . | exit /b

如果你以管理员身份运行脚本:

cd /d %~dp0
echo | code . | exit /b

使用start /b通常可以让命令行窗口关闭,以便其他程序正常运行。


5
那正是我所需的,之后完美运作。 - JorgeLDB
1
我不得不在它后面添加另一个exit命令,并最终关闭了Anaconda命令提示符! - saastn
1
我找了很久的解决方案来关闭我的 vscode 批处理脚本,非常感谢你!!! - Wumba

10

要立即关闭当前的cmd窗口,只需将以下命令/行添加为最后一个:

move nul 2>&0

试图将nul移动到任何地方,并将 stderr 重定向到 stdin ,会导致当前的窗口cmd.exe被关闭

这与关闭批处理文件或使用goto :EOFExit / b 退出不同

我甚至发了一个问题来寻找一个能解释这种行为的答案。 是否有Bug?执行:move nul 2>&0会立即关闭当前cmd窗口


1
在我的情况下,我必须执行以下操作 "2>&0 > /dev/null &"。但是好主意。谢谢。 - Marek Malczewski
唯一有效的方法...对于那些建议使用exit /b或cmd /c的答案感到遗憾。谢谢! - Billy Cao
问题在于退出代码将会小于“成功完成”。但是如果退出代码是一致的,你可以考虑解决这个问题。在启动命令之前加上cmd /c似乎可以解决这个问题,同时在之后加上exit /b也可以。 - Jon Grah
@JonGrah 您好,感谢您的评论,请仔细阅读标题:如何在批处理文件执行后自动关闭cmd窗口? 看到“批处理文件执行后”并不意味着已经成功执行了bat文件,因此我理解剩下的就是关闭窗口。您同意吗?否则,我将更改当前的问题,然后会发布其他与您的答案兼容的代码,从而专注于添加一个或多个命令,而不仅仅是像您提出的那样关闭窗口。 - Io-oI

10

如果你想将命令分离成每个文件一个命令,你可以这样做:

cmd /c start C:\Users\Yiwei\Downloads\putty.exe -load "MathCS-labMachine1"

而在另一个文件中,你可以这样做

cmd /c start "" "C:\Program Files (x86)\Xming\Xming.exe" :0 -clipboard -multiwindow

在运行 exe 文件后,命令 cmd /c 将关闭命令提示符窗口。


2
"cmd /c" 运行良好,解决了我的问题。 - jack jin

2

这对我很有帮助。我只是想在退出游戏后自动关闭命令窗口。我只需要在我的桌面上双击 .bat 文件即可,无需快捷方式。

taskkill /f /IM explorer.exe
C:\"GOG Games"\Starcraft\Starcraft.exe
start explorer.exe
exit /B

1
你可以尝试有些危险的方法:taskkill /IM cmd.exe。这种方法危险是因为它会关闭当前打开的命令提示符窗口及其之前打开的所有命令提示符窗口。
或者,你可以添加一个验证步骤来确认你是否选择了正确的cmd.exe,并通过进程ID(PID)来关闭它,例如:
set loc=%time%%random%
title=%loc%
for /f "tokens=2 delims= " %%A in ('tasklist /v ^| findstr /i "%loc%"') do (taskkill /PID %%A) 

如果您想先检查它(并且可能已安装pstools),请用(pslist &&A)(tasklist /FI“PID eq %% A”)替换(taskkill /PID %% A)

1
我做的事情如下所示:
start ""
** code
exit

这对我有用


0

我原本有这个程序,然后我加了 EXIT,一开始并没有作用。我想应该是需要遵循另一个回复中提到的“被调用程序退出”建议。现在它可以正常运行了,但不确定是什么原因导致的。值得注意的是,我正在调用数据文件 .html,而不是处理它的程序 browser.exe。我没有编辑任何其他内容,但使用批处理文件访问这些网页文档的主要访问页面会更加整洁。只需在根文件夹中放置 title.batcontents.batindex.bat,其余内容放在子文件夹中即可。

即:contents.bat 如下:

cd subfolder
"contents.html"
exit

如果我为这些项目更改批处理文件图标以适应它们所在的上下文,那么它看起来也更好,但这是另一回事,在子文件夹中隐藏批处理文件,并在根文件夹中创建自定义图标快捷方式,将用于自定义的图像也隐藏。


0
有时候,你可以通过引用 Windows 的“快捷方式”文件来启动应用程序,而不是使用“.bat”文件,这样就不会出现剩余提示问题。但它不像批处理文件那样灵活。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接