java - Bat文件自动更新空气 native 应用程序而不显示cmd

标签 java c windows batch-file air

我需要为使用 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/

相关文章:

java - Java BouncyCaSTLe 中的确定性 AES-CTR?

c - 为乘法动态分配矩阵 C

c++ - 如何通过程序发送返回(输入按钮)字符

Java 相当于 mongodb 中的 scala 查询

java - 如何在java中声明一个辅助方法,在本地使用能够引用变量

c - 如何在函数中将C指针设置为数组

windows - 如何在 Windows 中控制(虚拟)音频设备的输入流?

python - 使用 python 将一些键发送到非事件窗口

java - 用图像(.png)填充 ShapeRenderer 矩形?

c - C 中的循环语句