为什么批处理文件执行后cmd无法退出?


25

为什么批处理文件执行后cmd无法退出?

我试过了:

"C:\Program Files (x86)\Java\jre6\bin\javaw.exe" -Xmx1024M -Xms1024M -jar Jilko.jar

@echo off
"C:\Program Files (x86)\Java\jre6\bin\javaw.exe" -Xmx1024M -Xms1024M -jar Jilko.jar
exit

Answers:


31

如果Java应用程序没有终止(例如,您正在使用批处理文件来启动Java应用程序),请使用start命令来启动它:-

start "" "C:\Program Files (x86)\Java\jre6\bin\javaw.exe" -Xmx1024M -Xms1024M -jar Jilko.jar

这将启动Java应用程序并继续执行批处理文件,而无需等待Java应用程序完成。


20

说明:

下面是它的工作原理; 批处理文件一次只处理一行。每个命令依次执行,并且批处理处理器在开始下一个命令之前等待一个命令完成。您遇到的问题是因为您正在启动的Java应用程序(Jilko.jar)是一个窗口化程序,即使在启动它的行之后,该程序仍会继续运行。如果它是执行某些操作然后终止的工具,则批处理文件将继续执行下一个命令(如果没有更多命令,则退出)。因为程序仍在运行,所以批处理处理器将一直等到窗口关闭后再继续。您可以通过退出Java程序来查看实际情况:带有批处理文件的控制台窗口随即关闭。


解:

您需要进行修复,以指示批处理程序启动程序并继续运行而无需等待:

start "" "C:\Program Files (x86)\Java\jre6\bin\javaw.exe" -Xmx1024M -Xms1024M -jar Jilko.jar

正如Terrance所提到的""是用于控制台窗口的标题。但是,仅当命令不在引号中时,它才是可选的。否则是必需的。您可以在其中放置某些内容,也可以保留空白,但是如果该命令用引号引起来,则必须使用该命令,否则命令解释器会将带引号的命令视为标题,并打开一个控制台,等待在那里做某事。

您可以使用以下命令代替,但是引号更加简单和安全,因为不能保证每个系统上的短名都一样。

start C:\Progra~2\Java\jre6\bin\javaw.exe -Xmx1024M -Xms1024M -jar Jilko.jar

start命令是生成进程的内置命令(基本上就像从“开始”菜单运行程序一样)。因此,在这种情况下发生的事情是批处理处理器运行了start命令,该命令又运行了指定的程序并终止(它本身,而不是生成的程序)。这样,批处理器将按预期继续运行。它还具有一些有用的选项,例如以最小化(/min)或最大化(/max)运行程序,以低优先级(/low)运行程序,等等。有关start /?详细信息,请参见。


我们可以考虑像nohup en.wikipedia.org/wiki/Nohup
Muhammad Hewedy一样

不。(除非您想与nohup和&进行比较)。
Hennes

7

我发现我启动的某些程序使进程保持运行状态,并且如果我只是通过启动可执行文件运行它们,则直到它们终止,控制台窗口才会关闭。

START程序可以解决此问题,但是START的旧问题仍然存在。您不能只使用:

START "c:\my dir\myfile.exe"

START的第一个参数仍然是窗口名称。如果您忽略它,则只需打开一个CMD控制台框,其窗口名为您尝试启动的窗口。在上述实例中,我现在有一个控制台窗口,其窗口标题为“ c:\ my dir \ myfile.exe ”。不是我想要的!

要省略窗口名称,只需使用一对双引号定义一个空字符串,例如:

START "" "c:\my dir\myfile.exe"

最后,使用EXIT命令结束批处理文件以确保其关闭。

此方法似乎在Windows 7和8中始终有效。

对于故障排除,我发现添加我将要执行的操作的ECHO,然后添加我刚刚执行的操作的超时,会很有帮助。例如:

ECHO I'm about to launch the program...
START "" "c:\my dir\myfile.exe"
TIMEOUT 5

由于超时为您提供了倒数计时,因此您无需ECHO您将要延迟的时间。


5

另外- 在Windows 7下始终使用EXIT ,因为仅到达批处理文件的末尾并不一定会终止它-与早期Windows版本中一样。Windows 7可能比早期的NT版本(例如Windows 2000 Professional)对此更为敏感。某些(但不是全部)以前的答案中提到了这一点。

详细的个人经验支持答案:

将StarSuite5.2安装从Windows 2000转移到Windows 7之后,终止套件时出现内存空间错误。在Windows 2000中看不到。

多年前,我编写了批处理文件来自动备份和还原soffice.ini,以便在损坏时进行修复(通常会造成问题-套件无法加载)。但是,自动备份(通过指向批处理文件的链接触发,放置在Office52 \ user \ config \ startup中)仅在大约5秒钟的延迟后发生。我注意到,只要在批处理文件运行之前退出套件,套件的终止就不会出错。这指出了批处理文件中的问题。

在将“ EXIT”命令作为批处理文件的最后一行放置之后,无论批处理文件是否已运行,office套件始终在没有内存空间错误消息的情况下终止。


2

应用程序完成后,应该退出。您确定Java应用程序正常退出了吗?


2

我只是在处理相同的问题,在对批处理文件进行了随机更改之后,它终于解决了自己的问题-我不知道为什么,但是我会在这里发布,以防日后对他人有所帮助。

我使用SysInternals Pskill实用程序和sleep实用程序,因为XP Home在命令行功能方面没有太多内容。


这是完成后实际上关闭的批处理文件:

@echo off
start /min C:\Progra~1\PsTools\pskill.exe explorer.exe
start /min C:\Progra~1\PsTools\pskill.exe Powermenu.exe
start /min C:\Progra~1\PsTools\pskill.exe PWGen.exe
start /min C:\Progra~1\PsTools\pskill.exe redshiftgui.exe
start /min C:\Progra~1\PsTools\pskill.exe clipx.exe
sleep 2
start explorer.exe
sleep 3
start C:\Progra~1\ClipX\clipx.exe
sleep 1
start C:\Progra~1\Powermenu\PowerMenu.exe
sleep 1
start /min C:\Progra~1\PWGen\PWGen.exe
sleep 1
start C:\Progra~1\RedshiftGUI\redshiftgui.exe && exit

如果我更改了最后几行,则cmd窗口将保持打开状态,直到我单击角落的“ X”为止:

start C:\Progra~1\RedshiftGUI\redshiftgui.exe
sleep 1
start /min C:\Progra~1\PWGen\PWGen.exe && exit

即使当我尝试调用pskill杀死自己时,cmd.exe进程也会从任务管理器中消失,并且pskill会从cmd.exe内部报告该cmd.exe进程已被杀死,但cmd.exe窗口仍会停留直到我单击了角落的“ X”:

start C:\Progra~1\RedshiftGUI\redshiftgui.exe
sleep 1
start /min C:\Progra~1\PWGen\PWGen.exe
sleep 1
C:\Progra~1\PsTools\pskill.exe cmd.exe

在添加&& exit到每行之后,我注意到其中一些人对此做出了响应并会中断批处理,而其他人则没有。

因此,我只将响应式之一放在末尾,而不是原来的方式。

正如我说的,我不知道为什么,但是很高兴这一切结束了。


1
这是不必要的
surfasb 2012年

&&出口对我
有用


0

这是我的做法:

  1. 创建具有以下内容的批处理文件:

    java -Xms512M -Xmx512M -jar yourFileName.jar -o true
    EXIT
    
  2. 在退出输入流中,添加:

    System.exit(1);
    

0

Windows 2003默认情况下在“控制面板”中没有“用户帐户”。我写了一小段来打开用户帐户:

@echo off  
rundll32.exe %SystemRoot%\system32\netplwiz.dll,UsersRunDll  
exit

一切正常,打开了“用户帐户”,但“ CMD”窗口也保持打开状态。经过一些研究之后,我在第2行的开头添加了“ START”,如下所示:

@echo off  
Start "" rundll32.exe %SystemRoot%\system32\netplwiz.dll,UsersRunDll o
exit

现在,“用户帐户”窗口打开,保持打开状态,“ CMD”窗口关闭。十分简单。


0

我一直在寻找一种解决方案,以便在EXIT命令出于未知原因而使该窗口保持打开状态时关闭批处理文件窗口。我终于偶然发现了一个解决方案。

从批处理文件的末尾删除EXIT并使用:

Taskkill /IM conhost.exe /F

0

我在Windows 7 32位计算机上创建了一个net use批处理文件,该批处理文件的cmd执行后不会退出。我在另一台Windows 7 64位计算机上运行相同的批处理文件,该批处理文件的cmd正常退出。

我试过了 Bryan的建议,但由于该目录没有conhost.exe进程,因此在该Windows 7 32位计算机上不起作用,因此我对其进行了如下修改:

Taskkill /IM cmd.exe /F

网络使用批处理文件并不总是正常退出,而是随机显示“终止批处理作业(Y / N)”确认。

根据这个线程我修改了批处理文件,如下所示:

@echo off

if "%~1"=="-FIXED_CTRL_C" (
   REM Remove the -FIXED_CTRL_C parameter
   SHIFT
) ELSE (
   REM Run the batch with <NUL and -FIXED_CTRL_C
   CALL <NUL %0 -FIXED_CTRL_C %*
   GOTO :EOF
)

net use \\Server\folder

Taskkill /IM cmd.exe /F

网络使用批处理文件最终将正常退出。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.