2010-09-25 04:19:24 +0000 2010-09-25 04:19:24 +0000
25
25
Advertisement

为什么cmd在执行批处理文件后不能退出?

Advertisement

为什么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
```。
Advertisement
Advertisement

答案 (11)

31
31
31
2010-09-25 07:28:36 +0000

如果Java应用没有终止(例如你使用批处理文件来启动Java应用),那么使用start命令来启动它:-

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

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

20
20
20
2012-01-26 01:17:52 +0000

解释:

工作原理是这样的,批处理文件一次只处理一行。每条命令依次执行,批处理程序等待一条命令完成后再开始下一条。你遇到的问题是因为你正在启动的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 /?

7
Advertisement
7
7
2013-05-15 23:43:30 +0000
Advertisement

我发现我启动的一些程序会留下进程运行,如果我只是通过启动可执行文件来运行它们,控制台窗口不会关闭,直到它们终止。

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,然后添加一个刚才做的TIMEOUT,帮助很大。例如:

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

由于timeout给了你一个倒计时,所以你不需要echo你即将延迟。

5
5
5
2012-01-26 00:59:18 +0000

另外,在Windows 7下,任何时候都要使用EXIT,因为仅仅到达批处理文件的结尾并不一定会终止该文件 – – 就像早期的Windows版本一样。Windows 7可能比早期的NT版本(如Windows 2000专业版)对这一点更敏感。这在之前的一些答案中提到过,但不是全部。

个人经验的细节来支持答案。

在将StarOffice5.2的安装从Windows 2000转移到Windows 7后,我在终止该套件时得到内存空间错误。这在Windows 2000中是看不到的。

几年前,我曾写过批处理文件来自动备份和恢复soffice.ini,以便在它损坏时进行修复(经常出现问题–套件无法加载)。然而,自动备份(由批处理文件的链接触发,放置在Office/user\config\startup中)只有在5秒的延迟后才会发生。我注意到,每当我在批处理文件运行前退出套件时,套件的终止都不会出错。这让我想到了批处理文件中的一个问题。

当'EXIT'命令被放置在批处理文件的最后一行后,无论批处理文件是否已经运行,办公套件都开始无内存空间错误信息地终止。

2
Advertisement
2
2
2010-11-06 03:27:04 +0000
Advertisement

我刚刚也在处理同样的问题,在对批处理文件进行了看似随机的修改后,终于解决了–我不明白为什么,但我会把它贴在这里,以防以后对别人有帮助。

我利用了 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后,我注意到其中一些会响应它并中断批处理–而另一些不会。

所以我就把其中一个有反应的放在最后,而不是原来的样子。

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

2
2
2
2010-09-25 04:29:25 +0000

一旦应用程序完成,它应该是退出。你确定Java应用的退出是正确的吗?

1
Advertisement
1
1
2010-09-25 04:51:34 +0000
Advertisement

尝试。

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

0
0
0
2015-10-16 12:53:17 +0000

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
Advertisement
0
0
2016-01-01 06:06:20 +0000
Advertisement

我一直在寻找和寻找一个解决方案,当EXIT命令使窗口不明原因打开时,关闭批处理文件窗口。我终于偶然发现了一个解决方案。

把批处理文件末尾的EXIT去掉,然后使用。

Taskkill /IM conhost.exe /F
0
0
0
2016-07-15 10:37:30 +0000

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

我尝试了Bryan的建议,但在那台Windows 7 32位机器上没有工作,因为没有conhost.exe进程,所以我修改了如下。

Taskkill /IM cmd.exe /F

net use批处理文件并不总是正常退出,它显示 “Terminate batch job (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

网用批处理文件最终**正常退出。

0
0
0
2014-06-21 17:43:16 +0000

我是这样做的。

1.创建一个批处理文件,内容如下:

  1. 在你的出口输入流中,添加。
Advertisement

相关问题

3
28
13
7
10
Advertisement