wix
  • installation
  • 2014-07-25 63 views 1 likes 
    1

    試圖讓維克斯安裝程序來殺死一個進程,從我在網上找到它看起來這是要走的路:WindowsFolder財產EXE地址的一部分不工作

    <Directory Id="TARGETDIR" Name="SourceDir"> 
        <Directory Id="WindowsFolder" Name="WINDOWS"/> 
    
    <Property Id="QtExecCmdLine" Value='"[WindowsFolder]System32\taskkill.exe" /F /IM Foo.exe'/> 
    <CustomAction Id="KillTaskProcess" BinaryKey="WixCA" DllEntry="CAQuietExec" Execute="immediate" Return="ignore"/> 
    

    這個問題我有正在建設的項目將引發以下錯誤抱怨Windows屬性:

    The 'QtExecCmdLine' Property contains '[WindowsFolder]' in its value which is an illegal reference to another property. If this value is a string literal, not a property reference, please ignore this warning. To set a property with the value of another property, use a CustomAction with Property and Value attributes. 
    

    我已經試過[#WindowsFolder]相反,它消除了錯誤,但沒有解決問題。 使用完整的地址(C:\ Windows \ System32 \ taskkill.exe)而不是值的工作,但我想避免這一點。

    回答

    2

    我不認爲你可以用你的方式引用一個目錄(例如「[WindowsFolder]」)。這種類型的註釋用於引用屬性的值。

    WindowsInstaller已經提供了公共屬性,它代表任何給定系統上的系統文件夾。 你可以在32位機器上使用[SystemFolder]得到c:\ Windows \ System32(注意在64位機器上這會給你c:\ Windows \ SysWow64)。
    因此,在64臺機器可以使用[System64Folder],這將給你C:\ Windows \ System32下

    那麼你的代碼看起來像

    <Property Id="QtExecCmdLine" Value='"[SystemFolder]taskkill.exe" /F /IM Foo.exe'/> 
    

    或者

    <Property Id="QtExecCmdLine" Value='"[System64Folder]taskkill.exe" /F /IM Foo.exe'/> 
    


    我在一個安裝包中執行類似的操作,該安裝包同時支持32位32位32位32位32位32位數字存儲器秒。這會使事情稍微複雜化。
    爲了解決這個問題我會嘗試用你的代碼如下:

    <Property Id="TASKKILLFILEPATH"/> 
    <Property Id="QtExecCmdLine" Value='"[TASKKILLFILEPATH]" /F /IM Foo.exe'/> 
    

    然後,添加自定義操作正確設置任務擊殺文件路徑

    <CustomAction Id='SetTASKKILLFILEPATH32' Property='TASKKILLFILEPATH' Value='[SystemFolder]\taskkill.exe' Return='check' /> 
    <CustomAction Id='SetTASKKILLFILEPATH64' Property='TASKKILLFILEPATH' Value='[System64Folder]\taskkill.exe' Return='check' /> 
    

    在InstallExecuteSequence您可以運行相應的

    <InstallExecuteSequence> 
         <Custom Action='SetTASKKILLFILEPATH64' After='AppSearch'>VersionNT64</Custom> 
         <Custom Action='SetTASKKILLFILEPATH32' After='AppSearch'>Not VersionNT64</Custom> 
    </InstallExecuteSequence> 
    

    BTW VersionNT64:基於系統類型的自定義操作是另一個WindowsInstaller提供的屬性。

    這可能有點矯枉過正,我希望有一種更簡單的方法可以讓別人共享,但我知道這是一個有效的解決方案。希望這至少能帶領你朝着正確的方向前進。

    0

    爲什麼不使用VBScript來終止進程?這是一個標準腳本:

    strComputer = "." 
    Set objWMIService = GetObject("winmgmts:" _ 
        & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2") 
    Set colProcessList = objWMIService.ExecQuery _ 
        ("Select * from Win32_Process Where Name = 'Notepad.exe'") 
    For Each objProcess in colProcessList 
        objProcess.Terminate() 
    Next 
    
    相關問題