Answers:
说明:
下面是它的工作原理; 批处理文件一次只处理一行。每个命令依次执行,并且批处理处理器在开始下一个命令之前等待一个命令完成。您遇到的问题是因为您正在启动的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,然后添加我刚刚执行的操作的超时,会很有帮助。例如:
ECHO I'm about to launch the program...
START "" "c:\my dir\myfile.exe"
TIMEOUT 5
由于超时为您提供了倒数计时,因此您无需ECHO您将要延迟的时间。
另外- 在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套件始终在没有内存空间错误消息的情况下终止。
我只是在处理相同的问题,在对批处理文件进行了随机更改之后,它终于解决了自己的问题-我不知道为什么,但是我会在这里发布,以防日后对他人有所帮助。
我使用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
到每行之后,我注意到其中一些人对此做出了响应并会中断批处理,而其他人则没有。
因此,我只将响应式之一放在末尾,而不是原来的方式。
正如我说的,我不知道为什么,但是很高兴这一切结束了。
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的建议,但由于该目录没有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
网络使用批处理文件最终将正常退出。
nohup
en.wikipedia.org/wiki/Nohup