如何在执行批处理文件后保持控制台打开?

如何在执行批处理文件后保持控制台打开?

当我手动运行 Apache Tomcat startup.bat 文件时,cmd 控制台保持打开状态,当我在 java 代码中运行该文件时,控制台关闭。(我正在尝试自动化项目中的某些流程)。对于 Windows,当 Tomcat 作为应用程序运行时,控制台似乎在 .bat 运行后必须保持打开状态。

我怎样才能在我的 Java 代码中实现这一点?谢谢

答案1

Startup.bat依赖于两个环境变量:CATALINA_HOME 和 JRE_HOME(或 JAVA_HOME)。
您必须设置 JRE_HOME 或 JAVA_HOME,否则您将无法通过双击运行启动。
这只剩下 CATALINA_HOME。如果未设置,启动脚本将尝试猜测它,但这仅在从当前目录(或准确地说是其父目录)执行时才有效。如果您尝试从其他目录运行它并且未设置 CATALINA_HOME,它将失败(并显示一条消息)。
如果这是您的问题,您应该在 cmd 窗口顶部看到类似的消息:

CATALINA_HOME 环境变量未正确定义 运行该程序需要此环境变量

您可能遇到的另一个问题是路径中包含空格。您的路径看起来没有,但它可能对其他人有用,所以我将包含这条信息。
当您的命令包含空格时,您需要引用您的start命令,对吗?应该这样做: "cmd.exe /c start \"my path to tomcat bin/startup.bat\""
错误。您最终会盯着标题为我的 tomcat bin/startup.bat 路径
start将第一个引用的参数作为标题……真好。正确的形式是:
"cmd.exe /c start \"\" \"my path to tomcat bin/startup.bat\""

可是等等

这两个问题实际上都会阻止 Tomcat 窗口出现 - 你说呢关闭, 所以确实开始然后死去。嗯……这很可能是因为已有一个进程正在监听端口 8080。也许您的 Java IDE 启动了 Tomcat?或者启动了另一个在 8080 上监听的服务器?如果是这个原因,您应该会在 Tomcat 日志中看到类似的行(它们存储在CATALINA_HOME/logs):

java.net.BindException:地址已在使用中:JVM_Bind

如果这是您的问题,那么您要么需要停止第一个实例,要么重新配置您的服务器进程,以便每个进程监听不同的端口。

注意:我使用以下步骤从 Java 启动 Tomcat,效果很好:

    Runtime r=Runtime.getRuntime();
    r.exec("cmd.exe /c start startup.bat",          //path to executable
            null,                                   // env vars, null means pass parent env
            new File("my path to tomcat/bin")); // working directory 

答案2

检查 .bat 文件的文件属性(右键单击),应该有保持控制台打开的选项。据我记得,这是最后一个选项卡。

答案3

进入你的tomcat/bin文件夹。编辑startup.bat文件并注释掉倒数第二行

call "%EXECUTABLE%" run >..\logs\OutputFile.log 2>&1 start %CMD_LINE_ARGS% run >..\logs\OutputFile.log 2>&1

REM在开头使用 将其注释掉。

rem call "%EXECUTABLE%" run >..\logs\OutputFile.log 2>&1 start %CMD_LINE_ARGS% run >..\logs\OutputFile.log 2>&1 

那么控制台将保持打开状态。如果注释了此行,则表示关闭控制台并将输出写入某个外部日志文件。

相关内容