繁体   English   中英

从 Java 生成的批处理文件启动程序

[英]Launch program from batch file generated by Java

我想出了一种方法来让我用 Java 编写的程序自行更新。 最终的 JAR 通过 Launch4j 工具被包装在一个 EXE 文件中。 你需要知道这段代码:

System.getProperty("java.class.path").replaceAll("\\;\\.$", "")

给了我 EXE 的实际路径。 我测试了它,它似乎总是有效。 这对于问题很重要。

现在,基本上该程序 ping 一个网页并读取一系列值,其中一个是该程序的最新版本。 如果它更大,程序会通知用户进行更新。 因此,程序下载远程数据(更新的 EXE 文件)并将它们存储在当前运行的 EXE 文件中,其文件名通过上述方法获得。 它有效,但问题来了。

我可以简单地启动下载的 EXE 文件并 System.exit 当前的文件,但我不能这样做,因为我的程序与智能卡一起工作:如果两个或更多程序使用相同的智能卡,新的将无法工作(我不知道为什么,我什至每次都重新启动提供程序,但这是另一个故事)。 所以我阻止用户启动程序的多个实例。

(我的客户不太聪明,每次需要时都手动打开程序,所以我需要覆盖关闭按钮以使其停留在托盘栏中,并在每次需要时唤醒。我什至让它在 Windows 启动时启动)。

所以我必须关闭程序的当前实例,然后再次启动。 我怎么做? 我编写了一个批处理文件,它基本上如下所示:

@echo off
taskkill /f /pid <pid of the exe program>
ping 127.0.0.1 -n 3 (this is a way to wait. I will eventually lower the waiting)
C:\Users\Mark\Desktop\program.exe (string generated by the method above. It should launch the program)
exit

写入磁盘后,我通过 Java 执行它:

Runtime.getRuntime().exec("cmd /c start " + batchFile.toString());

“batchFile”变量是一个文件对象。 问题是新下载的程序没有启动。 出现一个控制台窗口,显示“taskkill”和“ping”的结果(我最终会将它们静音),但程序没有启动。 如果我手动启动批处理文件,它会。 为什么? 我真的不明白这种行为。 你有什么建议吗?

提前致谢!

TL;DR版:我的Java程序执行的批处理文件没有启动里面写的exe文件。 为什么?

我感觉您正在尝试覆盖当前正在运行的可执行文件 (EXE)。 AFAIK Windows 会锁定此类文件,因此您的更新永远不会发生。

解决您的问题:我会将您的申请一分为二。 一部分确保另一部分具有最新版本,然后执行该最新版本。

对于 Java,类似这样的东西已经在多年前作为 WebStart 技术开发出来,在 Java 9 中被标记为不推荐使用,并在此后被删除。 同时,您可能想查看https://openwebstart.com/项目。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM