2014-11-24 105 views
0

我一直在嘗試使用msiexec實現msi安裝並將自定義參數傳遞給它。Wix安裝程序在第一次運行後失敗的自定義操作

msiexec /i somefile.msi /l*v output.txt IPADDRESS="127.0.0.1" PORT="9999" 

現在我有下面的代碼來完成獲取IPADDRESS和PORT並將它們寫入文件的工作。下面是我的代碼:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using Microsoft.Deployment.WindowsInstaller; 

namespace SetupCA 
{ 
    public class CustomActions 
    { 
     [CustomAction] 
     public static ActionResult WriteFileToDisk(Session session) 
     { 
      session.Log("Begin WriteFileToDisk"); 

      string ipAddress = session["IPADDRESS"]; 
      string port = session["PORT"]; 
      string temp = @" 
{{ 
""ip"" : ""{0}"" , 
""port"" : ""{1}"" 
}}"; 
      string config = string.Format(temp, ipAddress, port); 
      session.Log("Config Generated was " + config); 
      System.IO.Directory.CreateDirectory("C:\\somefolder"); 
      try{ 
       System.IO.File.Delete("C:\\somefolder\\some.config"); 
      } 
      catch(Exception e){ 

      } 
      System.IO.File.WriteAllText(@"C:\somefolder\some.config", config); 
      session.Log("Ending WriteFileToDisk"); 

      return ActionResult.Success; 
     } 
    } 
} 

編輯:全維克斯代碼 我已經使用在維克斯生成​​的dll文件給出:

<?xml version="1.0" encoding="UTF-8"?> 
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"> 
<Product Id="*" Name="CustomWixInstallerWithCustomAction" Language="1033" Version="1.0.0.0" Manufacturer="Developer" UpgradeCode="ba9015b9-027f-4451-adb2-e38f9168a850"> 
    <Package InstallerVersion="200" Compressed="no" InstallScope="perMachine" /> 

    <MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." /> 
    <MediaTemplate /> 

    <Feature Id="ProductFeature" Title="CustomWixInstallerWithCustomAction" Level="1"> 
     <ComponentGroupRef Id="ProductComponents" /> 
    </Feature> 
</Product> 

<Fragment> 
    <Directory Id="TARGETDIR" Name="SourceDir"> 
     <Directory Id="ProgramFilesFolder"> 
      <Directory Id="INSTALLFOLDER" Name="CustomWixInstaller" /> 
     </Directory> 
    </Directory> 
</Fragment> 

<Fragment> 
    <ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER"> 
    <Component Id="SomeRandomEXE"> 
    <File Source ="some.exe" /> 
    </Component> 
    </ComponentGroup> 
<Binary Id="SetupCA" SourceFile="SetupCA.CA.dll"/> 
<CustomAction Id="WRITEFILETODISK" Execute="immediate" BinaryKey="SetupCA" DllEntry="WriteFileToDisk" /> 
<InstallExecuteSequence> 
    <Custom Action="WRITEFILETODISK" Sequence="2"></Custom> 

</InstallExecuteSequence> 
</Fragment> 

一切工作正常,當我安裝msi使用上面給出的命令。文本文件在參數期間給出的內容的文件夾中生成。但是當我使用相同的命令時,這些參數不會被提取並寫入文件中。但如果我卸載它使用:

msiexec /x file.msi 

並再次運行,它的工作原理。這裏有什麼問題?

+0

很抱歉,但對我來說是不明確的,你想什麼。尤其是,對於使用上面給出的命令,「一切正在正常工作......」的意思是......但是當我使用相同的(???)命令時......「。第二:你試圖做什麼,只需將命令行中給出的ip和端口記錄到另一個配置文件中?或者你想從配置文件中取出兩個msi屬性?第三,也是最重要的。 msi日誌文件說什麼,是您的自定義操作是否啓動。沒有這些信息,我們什麼都不會說。 – Philm 2014-11-24 13:09:57

+0

由程序編譯的DLL在Wix中的Custom Action內部使用,它應該獲取給予msifile的參數並在某些配置文件中寫入這些參數。當我使用上面的命令運行msi文件時,它會正確完成所有工作並創建配置文件。當我第二次運行相同的命令等等,這些參數不會被提取,配置文件看起來像{「ip:」「,」port「:」「}。如果我卸載使用下面給出的msifile命令並安裝它我的代碼有問題 – Pant 2014-11-24 14:37:53

+2

@SarvagyaPant你不能反覆執行相同的安裝程序,MSI會檢測到它已經安裝並中止安裝,如果我沒有錯,如果是這種情況,你需要配置你的安裝程序的行爲正確 – Rolo 2014-11-25 01:09:45

回答

1

羅洛已首先給出正確答案的評論:

更詳細:
如果你調用一個MSI安裝第二次,你不能指望它,做同樣的過程中尚屬首次。 首先調用(如果一切順利),它會進行安裝,第二次調用,它幾乎不會執行任何操作,因爲它承認產品已安裝。

卸載它之間或使用「重新安裝=所有」參數(與其他選項,如REINSTALLMODE,也許),然後修復/重新安裝完成。

即使您的自定義操作適用於「第二次通話」,也沒有任何價值。這就像試圖在牆上打開燈開關一樣。有人可能會說:「我已經將開關連接到了Arduino,每次有人開燈時,都會發出警報聲,但不幸的是,如果我在燈仍然亮着的情況下再次打開燈開關,它不會工作......「

希望這個例子有助於展示微星背後的想法。

- 而且到:

你想要的東西,有經驗的MSI人不會使用自定義操作。 「IniFile表」是爲了這樣的事情。對於整個MSI空間而言,內置功能可能比自定義動作更可靠,從而只允許一個示例在延遲自定義動作中工作,例如,在某些安全情況下是必需的一個簡單的自定義操作無法輕鬆讀取這些場景中的屬性。

http://msdn.microsoft.com/en-us/library/aa369282%28v=vs.85%29.aspx

http://blogs.technet.com/b/alexshev/archive/2008/04/03/from-msi-to-wix-part-15-installable-items-ini-files.aspx

+0

感謝您的洞察力。儘管我必須使用自定義操作,但使用Inifile Table的想法也不錯。 – Pant 2014-11-28 04:49:57

+0

如果我必須使用Inifile,我該如何執行該任務。 – Pant 2014-11-28 05:01:55

+0

你好!你不需要執行任何操作,只需填寫IniFile表。我已經給出了一些鏈接,谷歌搜索會發現更多info.MSI正在爲您在正確的地方執行它。如果您對內部細節感興趣,請查看MSI的執行順序(您已經下載了Orca,Insted或其他任何情況下的建議),並且您會發現'WriteIniValues'操作。 – Philm 2014-11-28 16:33:19

0

沒有看到你的整個WiX文件,很難告訴你哪裏出了問題。有很多元素可能會阻止它。但從聽起來像,我不認爲自定義操作是在重裝的情況下發射。

在我的其他答案,這得到了你這麼遠你的另一個問題,我建議對:

 session.Log("Begin WriteFileToDisk"); 

在你customAction。這正是調試的原因。在第二次運行安裝程序時,是否在輸出日誌中看到這些行(用於開始和結束)?

最後,一個可能幫助你的工具將成爲ORCA.exe工具。
http://msdn.microsoft.com/en-us/library/aa370557%28v=vs.85%29.aspx

該工具可讓您打開您的msi文件,並查看所有已安裝的配置。因此,您可以查看是否爲您的自定義操作設置了條件。

+0

我已經添加了完整的wix代碼,看看是否有幫助 – Pant 2014-11-25 04:08:52

+0

對於第二次運行同樣的MSI,我得到的語句Begin WriteFileToDisk並結束WriteFileToDsik在日誌中我沒有得到的是傳遞給MSI的參數 – Pant 2014-11-25 04:10:43

+0

如果正在寫入開始和結束,那麼自定義操作正在運行,但也許在修復模式下?我不確定。 ,屬性也應該設置爲修復模式,但也許它們不是? – Joe 2014-11-25 19:29:59

相關問題