2013-09-28 47 views
0

我需要爲使用本機擴展(AIR Updater類不支持的本機簽名安裝程序)的AIR桌面應用程序進行自動無提示更新conversation,所以現在我有一個bat文件卸載,安裝並啓動該作品完美的應用程序,Bat文件自動更新空中原生應用程序而不顯示cmd

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\""); 

但我有2個用這種方法的問題:

  • 的CMD打開撐,
  • 該軟件的最新版本保持凍結的背景下,這樣的bat文件沒有關閉它...

這一切都將當我關閉軟件的新安裝的版本中消失......

所以我要儘量提高Java程序,找到一個方法來實現它?還是有更好的方式使用本地擴展?

任何人都可以幫助我嗎?謝謝你在前進


編輯

現在,我所做的是,我用一個簡單的VBS文件,將運行該批處理文件,

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

和啓動vbs通過本機擴展,這是一個安靜的好結果,但現在我有一個空白cmd在執行過程中,我想隱藏...一個相當疲憊的解決方法...

我可以用這個工作了一段時間,但我真的想改善它..

+0

替代方案可能是NativeProcess - 它允許您運行CMD,但您不需要通過ANE。請參閱http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/desktop/NativeProcess.html – 2013-09-28 19:07:46

+0

@LeeBurrows是的,我知道,但這些命令將關閉應用程序,卸載它,安裝新的版本,並運行它,所以我不能真的從它運行CMD –

回答

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\""); 

編輯

要解決這兩個問題,你可以避免批處理文件,並執行當前在你的蝙蝠的命令ch文件直接從您的本地應用程序使用ShellExecute native API function

以下內容應放置在本地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文檔。

+0

謝謝,這解決了凍結,現在當cmd仍然打開,它在這一行C:\ Program Files文件(x86)\ Adob​​e \ Adob​​e Flash Builder 4.6>「C:\ Program Files文件(x86)\ Project \ Project.exe」,它會運行這個命令taskkill/IM cmd.exe只有當我關閉項目時,我試圖在bat文件命令之前開始,它將關閉cmd,但打開另一個以.exe作爲標題的路徑... –

+0

@KhalilBhm根據命令行引用,「start」可能會混淆。嘗試'system(「start \」\「cmd/C ...'注意''start'後面的空引號對 –

+0

我知道,我剛剛在bat文件上試過了,'start」%PROGRAMFILES(X86) %\ Project \ Project.exe「'並添加'exit',但是隻會打開一個新的cmd,正如我告訴過你的,文件路徑爲標題 –