我需要为使用 native 扩展的 AIR 桌面应用程序(air Updater 类不支持的 native 签名安装程序)进行自动静默更新,我遵循此 conversation ,所以现在我有一个bat文件,可以卸载、安装和启动完美运行的应用程序,
taskkill /IM Project.exe
taskkill /IM adl.exe
wmic product where name="Project" call uninstall /nointeractive
"%HOMEPATH%\AppData\Roaming\com.Project\Local Store\Project.exe" -silent -eulaAccepted -location "\"%PROGRAMFILES(X86)%\" -desktopShortcut
"%PROGRAMFILES(X86)%\Project\Project.exe"
taskkill /IM cmd.exe
我制作了一个运行它的java程序,并且运行得很好,甚至比我预期的还要好,它甚至不显示cmd,并且完全安静,
try {
String ls_str;
Process ls_proc = Runtime.getRuntime().exec("Bat/update.bat");
// get its output (your input) stream
DataInputStream ls_in = new DataInputStream(
ls_proc.getInputStream());
try {
while ((ls_str = ls_in.readLine()) != null) {
System.out.println(ls_str);
}
} catch (IOException e) {
System.exit(0);
}
} catch (IOException e1) {
System.err.println(e1);
System.exit(1);
}
但是我无法真正实现这个java解决方案,AIR不支持
所以我制作了一个 native 扩展来启动 .bat 文件,它可以工作,
system("cmd /C \"%HOMEPATH%\\AppData\\Roaming\\com.Project\\Local Store\\update.bat\"");
但是我对这个方法有两个问题:
- CMD 保持打开状态,
- 该软件的最新版本在后台保持卡住状态,因此 bat 文件不会关闭它...
一旦我关闭新安装的软件版本,所有这些都会消失......
那么我应该尝试改进java程序,找到实现它的方法吗?或者有更好的方法使用 native 扩展吗?
有人可以帮我解决这个问题吗?预先感谢您
<小时/>编辑
现在,我所做的是,我使用一个简单的 vbs 文件来运行批处理文件,
CreateObject("Wscript.Shell").Run "update.bat",0,True
并通过 native 扩展启动 vbs,这是一个安静的好结果,但现在我在执行期间有一个空白的 cmd,我想隐藏它......一个非常令人疲惫的解决方法......
我可以使用它一段时间,但我真的想改进它..
最佳答案
一个快速但肮脏的冷冻解决方案是更换:
system("cmd /C \"%HOMEPATH%\\AppData\\Roaming\\com.Project\\Local Store\\update.bat\"");
与:
system("start cmd /C \"%HOMEPATH%\\AppData\\Roaming\\com.Project\\Local Store\\update.bat\"");
编辑
要解决这两个问题,您可以避免使用批处理文件,并使用 ShellExecute
native API function 直接从 native 应用程序执行批处理文件中当前的命令。 .
以下内容应放置在 native C 应用程序中,并且应执行批处理文件当前正在执行的操作(也许需要进行一些调整)。您需要包含windows.h
应用程序中的 header ( #include <windows.h>
)。
ShellExecute( NULL, "open", "taskkill.exe", "/IM Project.exe", NULL, SW_HIDE );
ShellExecute( NULL, "open", "taskkill.exe", "/IM adl.exe", NULL, SW_HIDE );
ShellExecute( NULL, "open", "wmic.exe",
"product where name=\"Project\" call uninstall /nointeractive",
NULL, SW_HIDE );
ShellExecute( NULL, "open",
"%HOMEPATH%\\AppData\\Roaming\\com.Project\\Local Store\\Project.exe",
"-silent -eulaAccepted -location \"%PROGRAMFILES(X86)%\" -desktopShortcut",
NULL, SW_HIDE );
ShellExecute( NULL, "open",
"%PROGRAMFILES(X86)%\\Project\\Project.exe", NULL, NULL, SW_HIDE );
注意:为了简单起见,我没有包含错误管理代码。如果您想要一个强大的应用程序,您应该检查 ShellExecute
的返回值。检测任何错误并采取相应行动。请参阅ShellExecute
文档。
关于java - Bat文件自动更新空气 native 应用程序而不显示cmd,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19066573/