为什么cmd在执行批处理文件后不能退出?
为什么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
```。
为什么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
```。
如果Java应用没有终止(例如你使用批处理文件来启动Java应用),那么使用start
命令来启动它:-
start "" "C:\Program Files (x86)\Java\jre6\bin\javaw.exe" -Xmx1024M -Xms1024M -jar Jilko.jar
这将启动java应用,并继续执行批处理文件,而无需等待java应用完成。
解释:
工作原理是这样的,批处理文件一次只处理一行。每条命令依次执行,批处理程序等待一条命令完成后再开始下一条。你遇到的问题是因为你正在启动的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 /?
。
我发现我启动的一些程序会留下进程运行,如果我只是通过启动可执行文件来运行它们,控制台窗口不会关闭,直到它们终止。
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你即将延迟。
另外,在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'命令被放置在批处理文件的最后一行后,无论批处理文件是否已经运行,办公套件都开始无内存空间错误信息地终止。
我刚刚也在处理同样的问题,在对批处理文件进行了看似随机的修改后,终于解决了–我不明白为什么,但我会把它贴在这里,以防以后对别人有帮助。
我利用了 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
后,我注意到其中一些会响应它并中断批处理–而另一些不会。
所以我就把其中一个有反应的放在最后,而不是原来的样子。
正如我所说,我不知道为什么,但很高兴这一切都结束了。
尝试。
cmd /c "C:\Program Files (x86)\Java\jre6\bin\javaw.exe" -Xmx1024M -Xms1024M -jar Jilko.jar
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窗口关闭了。很简单。
我在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
网用批处理文件最终**正常退出。