25

我有一個Visual Studio安裝項目。 安裝後,它會在應用程序文件夾中創建一個卸載批處理文件。如果用戶想要卸載產品,他可以轉到「添加/刪除程序」,或者只需雙擊uninstall.cmd。內容如下:在Visual Studio安裝項目中,如何生成卸載腳本?

%windir%\system32\msiexec /x {CC3EB7BF-DD82-48B9-8EC5-1B0B62B6D285} 

GUID是Visual Studio中安裝項目中的ProductCode。

ProductCode http://i32.tinypic.com/2uhwapy.jpg

但是,爲了升級到正常工作,我必須增加版本號,每次我產生新的MSI時間。而且,如果我增加版本號,那麼我也必須爲ProductCode生成一個新的Guid。這意味着靜態uninstall.cmd文件需要更改。

如何在構建時動態生成包含ProductCode的批處理文件?

回答

2

這是我寫的創建uninstall.cmd的腳本。它在安裝過程中作爲自定義操作運行。

var fso, ts; 
var ForWriting= 2; 
fso = new ActiveXObject("Scripting.FileSystemObject"); 

var parameters = Session.Property("CustomActionData").split("|"); 
var targetDir = parameters[0]; 
var productCode = parameters[1]; 

ts = fso.OpenTextFile(targetDir + "uninstall.cmd", ForWriting, true); 

ts.WriteLine("@echo off"); 
ts.WriteLine("goto START"); 
ts.WriteLine("======================================================="); 
ts.WriteBlankLines(1); 
ts.WriteLine(" Uninstall.cmd"); 
ts.WriteBlankLines(1); 
ts.WriteLine("======================================================="); 
ts.WriteBlankLines(1); 
ts.WriteLine(":START"); 
ts.WriteLine("@REM The uuid is the 'ProductCode' in the Visual Studio setup project"); 
ts.WriteLine("%windir%\\system32\\msiexec /x " + productCode); 
ts.WriteBlankLines(1); 
ts.Close(); 

結果是一個cmd文件,其中始終包含當前的ProductCode。

這樣的缺點是? 創建uninstall.cmd的腳本仍保留在安裝目錄中。不是一個大問題,但我不喜歡安裝目錄中的垃圾。我還沒有嘗試使「createInstaller.js」自行刪除。這可能會起作用。

編輯:是的,使createInstaller.js自我刪除工作正常。

我打算接受我自己的答案!

+1

精解,但該死的哈克,我想了解一下微軟,安裝決策者I(如INNO)已自動進行反安裝文件之前嘗試過。 – Cynede 2011-05-26 04:58:50

+1

我知道這已經過去了幾年,但我想知道你究竟是怎麼使用這個的,Cheeso。你是否覆蓋了'OnAfterInstall'?如果是這樣,你如何在那裏插入腳本? – jp2code 2011-07-27 15:32:21

63

我發現這個解決方案here

「使用Visual Studio 2005/2008,你不需要編寫任何代碼添加卸載選項安裝項目(是的,我知道有些人可以編寫代碼做它)

1)在安裝項目 - >文件系統窗口 - >右鍵點擊「目標計算機上的文件系統」 - >添加一個特殊的文件夾,選擇系統文件夾;

2)進入這個系統文件夾添加從本地System32文件夾中瀏覽msiexec.exe並添加它,如下所示覆蓋此文件的默認屬性:

條件:=未安裝(確保你把 '未安裝' 完全一樣,同樣的情況下,一切), 永久:=真, 系統:=真, 傳遞:=真, 生命:=假。

3)在'用戶程序菜單'下創建一個新的快捷方式,將目標設置爲您在步驟1中創建的系統文件夾,並將其指向msiexec.exe。將快捷方式重命名爲「卸載您的應用程序」。將Arguments屬性設置爲/ x {空格} [ProductCode]。

4)構建項目,忽略msiexec應該被排除的事實警告,不要排除它或安裝項目不會生成。

'未安裝'條件和Permananet:= True確保msiexec.exe僅作爲安裝的一部分存放在系統文件夾中,如果它不存在,並且它不會在卸載時被刪除 - 因此,忽視這一警告並採取行動是非常安全的。

(基於來自SlapHead的描述)」

+1

現在,這非常方便,比我採取的方法更直接。 – Cheeso 2009-09-02 19:59:25

+8

真棒,在WinXP/Vista&Win7上適合我。值得注意的是,根據文章鏈接,如果您使用msiexec.exe版本高於目標平臺的版本有問題。這對我來說不是問題,因爲我仍然有意使用XP進行構建 - 但顯然如果您希望在Vista上構建的安裝程序能夠在XP上運行,那將是一個問題。 – 2009-11-24 12:15:01

+0

Great Post!正是我在找什麼。 – Martin 2011-12-08 05:34:39

10

我只是做了this工作:

添加uninstall.bat文件到您的項目文件內容是:

msiexec.exe /x %1 

建立一個快捷方式到批處理文件(在用戶的程序菜單說),請在快捷方式的屬性,旁邊的參數:[ProductCode]

+1

您可以使用'start msiexec.exe/x%1'來擺脫黑色窗口;但黑色的窗戶仍然閃爍。 – moala 2012-07-13 15:40:09

+0

可能是'start/B msiexec.exe/x%1'。 – MPelletier 2012-07-13 15:58:46

+0

不,也不''/ b' ... – moala 2012-07-13 16:38:33

1

在批處理文件的方式稍有不同。如果您不想顯示命令窗口,請使用wscript文件。供貨[ProductCode]如前所述參數

<job> 
<?job debug="true" error="true" ?> 
<script language="JScript"> 
    var arg = []; 
    for (var i=0; i<WSH.Arguments.length; i++) { 
     arg.push(WSH.Arguments.Item(i)); 
    } 

    if (arg.length>0) { 
     var productcode = arg[0]; 
     var v = new ActiveXObject("Shell.Application"); 
     v.ShellExecute("msiexec.exe", "/x "+productcode, "", "open", 10); 
    } 

    WSH.Quit(0); 
</script> 
</job> 
0

每次當你生成設置,然後總是改變產品代碼。創建一個卸載程序的快捷方式,你會發現命令行參數傳遞技術來排序切割。在那裏你總會寫「/ u產品代碼」產品代碼,你需要在這裏寫下。

將此代碼放在Program.cs中的主要方法文件

[STAThread] 
     static void Main() 
     { 
      bool flag = true; 
      string[] arguements = Environment.GetCommandLineArgs(); 
      foreach (string str in arguements) 
      { 
       if ((str.Split('='))[0].ToLower() == "/u") 
       { 
        if (MessageBox.Show("Do you want to uninstall job board", "Are you Sure?", MessageBoxButtons.YesNo) == DialogResult.Yes) 
        { 
         flag = false; 
         RemoveRegSettings(); 
         RemoveIniFile(); 
         string guid = str.Split('=')[1]; 
         string path = Environment.GetFolderPath(Environment.SpecialFolder.System); 
         ProcessStartInfo si = new ProcessStartInfo(path + @"\msiexec.exe", "/i" + guid); 
         Process.Start(si); 
         Application.Exit(); 
         return; 
        } 
       } 
      } 
      // 

      //************************************************ 
      Application.EnableVisualStyles(); 
      Application.SetCompatibleTextRenderingDefault(false); 
1

我意識到這個問題已經回答了,但我所做的就是創建一個包含以下內容的批處理文件:

start msiexec.exe /x %1 

使用「啓動」防止命令提示從在卸載過程中保持打開,%1由你上執行時將它傳遞給批處理文件中的第一個參數替換。

我添加了批處理文件的應用程序文件夾和創建一個指向該批處理文件的菜單快捷方式。如果您右鍵單擊該快捷方式並選擇屬性窗口。在那裏,添加以下文字Arguments屬性:

[ProductCode] 

建設和運行安裝程序後,你就會有一個調用批處理文件,並通過產品代碼,因爲它是在該版本開始菜單快捷方式的應用程序已建成。然後用戶會看到提示,詢問是否應該卸載該產品。

這種解決方案的唯一缺點是,如果用戶瀏覽到應用程序文件夾,並雙擊該批處理文件,卸載程序將給予該安裝包不存在的錯誤。

相關問題