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

从Java生成的批处理文件启动程序,java,windows,http,batch-file,restart,Java,Windows,Http,Batch File,Restart,我想办法让我用Java编写的程序自我更新。最后一个JAR通过Launch4j工具包装在一个EXE文件中。 您需要了解这段代码: System.getProperty("java.class.path").replaceAll("\\;\\.$", "") 提供EXE的实际路径。我测试了它,它似乎一直在工作。这对于这个问题很重要 现在,基本上程序ping一个网页并读取一系列值,其中哪一个是程序的最新版本。如果更大,程序将通知用户进行更新。因此,程序下载远程数据(更新的EXE文件)并将其存储在当前

我想办法让我用Java编写的程序自我更新。最后一个JAR通过Launch4j工具包装在一个EXE文件中。 您需要了解这段代码:

System.getProperty("java.class.path").replaceAll("\\;\\.$", "")
提供EXE的实际路径。我测试了它,它似乎一直在工作。这对于这个问题很重要

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

我可以简单地启动下载的EXE文件和系统。退出当前的EXE文件和系统,但我不能这样做,因为我的程序可以使用智能卡:如果两个或多个程序使用相同的智能卡,新的智能卡将无法工作(我不知道为什么,我甚至每次都重新启动提供程序,但这是另一回事)。因此,我防止用户启动程序的多个IStance

(我的客户不太聪明,无法在每次需要时手动打开该程序,因此我需要覆盖关闭按钮,使其停留在traybar中,并在每次需要时醒来。我甚至让它在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
“batchFile”变量是一个文件对象。 问题是新下载的程序没有启动。出现一个控制台窗口,显示“taskkill”和“ping”的结果(我最终将使它们静音),但程序不会启动。如果我手动启动批处理文件,它会启动。 为什么?我真的不明白这种行为。 你有什么建议吗

提前谢谢

TL;灾难恢复版本:
Java程序执行的批处理文件不会启动写入其中的exe文件。为什么?

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

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


对于Java来说,类似这样的东西在很多年前就作为WebStart技术开发出来了,在Java 9中被标记为不推荐使用,随后被删除。同时,还有您可能想要签出的项目。

您是否尝试过在批处理文件中的exe路径前面使用
start
call
?谢谢您的评论。我尝试了“start”和“call”,但是当Java调用它们时,它们都不起作用!也许您可以通过读取从Java中运行时执行的批处理文件的输出来发现问题?命令行应该输出它不执行程序的原因,并且您应该能够以这种方式读取它。如果我在EXE文件行之后“echo%ERRORLEVEL%”,它会给我2,因此找不到指定的文件?为什么?文件存在!我必须在Java调用中指定什么吗?我不知道。要启动的程序或其路径是否包含空格?
Runtime.getRuntime().exec("cmd /c start " + batchFile.toString());