0

我需要为使用本机扩展的 AIR 桌面应用程序进行自动静默更新(air Updater 类不支持的本机签名安装程序)我遵循了这个对话,所以现在我有一个 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 不支持

所以我做了一个本机扩展,它将启动 .bat 文件,它可以工作,

system("cmd /C \"%HOMEPATH%\\AppData\\Roaming\\com.Project\\Local Store\\update.bat\"");

但我对这种方法有两个问题:

  • CMD 保持打开状态,
  • 该软件的最后一个版本在后台保持冻结状态,因此 bat 文件没有关闭它...

一旦我关闭新安装的软件版本,所有这些都会消失...

那么我应该尝试改进java程序,找到实现它的方法吗?还是有更好的方法使用本机扩展?

谁能帮我这个 ?先感谢您


编辑

现在,我所做的是,我正在使用一个简单的 vbs 文件来运行批处理文件,

CreateObject("Wscript.Shell").Run "update.bat",0,True

并通过本机扩展启动 vbs,这是一个安静的好结果,但现在我在执行期间有一个空白的 cmd,我想隐藏它......一个非常累人的解决方法......

我可以使用它一段时间,但我真的想改进它..

4

1 回答 1

0

一个快速而肮脏的冷冻解决方案是更换:

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机 API 函数直接从本机应用程序执行当前批处理文件中的命令。

以下内容应放置在本机 C 应用程序中,并且应该执行您的批处理文件当前正在执行的操作(可能需要进行一些调整)。您需要windows.h在应用程序中包含标题 ( #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文档。

于 2013-09-28T12:08:42.070 回答