首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用/I而不是/X参数设置UninstallString

使用/I而不是/X参数设置UninstallString
EN

Stack Overflow用户
提问于 2012-04-23 20:53:20
回答 3查看 5.5K关注 0票数 7

我有一个MSI,它是我用一个WiX脚本动态构建的,它正在被很好地安装。然而,UninstallString一直都有一个指向msiexec.exe的/I (“斜眼”)参数,我认为它是一个/X。我读到过关于UninstallString here的文章,上面说这个注册表项是由Windows Installer设置的。我将通过WiX或我发出的install命令将什么传递给Windows Installer,这将导致UninstallString始终具有/I (“斜眼”)参数?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-05-02 23:06:59

我崩溃了,并就此与MS支持人员进行了交谈。答案是将MSI中的ARPNOMODIFY属性设置为1,以生成使用/X参数的UninstallString。

/I参数表示您可以在appwiz.cpl清单中使用"Change“和"Repair”选项。希望这对其他面临这个问题的人有所帮助。

下面的MSDN文章详细描述了ARP属性。

http://msdn.microsoft.com/en-us/library/windows/desktop/aa367590(v=vs.85).aspx

http://msdn.microsoft.com/en-us/library/windows/desktop/aa367591(v=vs.85).aspx

http://msdn.microsoft.com/en-us/library/windows/desktop/aa367592(v=vs.85).aspx

票数 8
EN

Stack Overflow用户

发布于 2012-04-26 06:53:06

您必须在WiX安装程序中创建一个ARPAltRegistryEntries组件来设置UninstallString。将参数设置为/I而不是预期的/X允许您使用自己的卸载UI。下面是一个示例:

代码语言:javascript
复制
<DirectoryRef Id="TARGETDIR">
    <!-- Create alternative ARP entry that lets us launch uninstall with
        full UI.  Setting ARPSYSTEMCOMPONENT above hides WI generated key
                that uses the product GUID.-->
    <Component Id="ARPAltRegistryEntries" Guid="">
        <RegistryKey Root="HKLM" Key="SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Your Product"                                      Action="createAndRemoveOnUninstall">                   
            <RegistryValue Type="string" Name="UninstallString" Value="MsiExec.exe /i[ProductCode] REMOVE=ALL"/>
        </RegistryKey>
    </Component>
</DirectoryRef>
票数 2
EN

Stack Overflow用户

发布于 2014-12-03 03:23:26

这个问题是针对Wix项目提出的,但是如果有人正在使用visual studio的安装项目,那么其中一个解决方案就是按照@joe Baltimore的建议,添加一个编译后vb脚本,将ARPNOMODIFY更改为1。

"setnomodify.vbs":如下所示,

  1. 创建VB脚本文件

代码语言:javascript
复制
    Option Explicit

    Const msiOpenDatabaseModeTransact = 1
    Dim argNum, argCount:argCount = Wscript.Arguments.Count

    Dim openMode : openMode =  msiOpenDatabaseModeTransact

    'This script adds a type 51 custom action into a given MSI database that
    'ensures the ARPNOMODIFY is set to 1


    ' Connect to Windows installer object
    On Error Resume Next
    Dim installer : Set installer = Nothing
    Set installer = Wscript.CreateObject("WindowsInstaller.Installer") :
    CheckError

    ' Open database
    Dim databasePath:databasePath = Wscript.Arguments(0)
    Dim database : Set database = installer.OpenDatabase(databasePath, openMode) : CheckError

    ' Process SQL statements
    Dim query, view, record, message, rowData, columnCount, delim, column

    query = "INSERT INTO `Property` (`Property`, `Value`) VALUES ('ARPNOMODIFY', '1')"
    Set view = database.OpenView(query) : CheckError
    view.Execute : CheckError

    database.Commit

    If Not IsEmpty(message) Then Wscript.Echo message
    Wscript.Quit 0

    Sub CheckError
      Dim message, errRec
      If Err = 0 Then Exit Sub
      message = Err.Source & " " & Hex(Err) & ": " & Err.Description
      If Not installer Is Nothing Then
        Set errRec = installer.LastErrorRecord
        If Not errRec Is Nothing Then message = message & vbLf & errRec.FormatText
      End If
    Fail message
    End Sub

    Sub Fail(message)
      Wscript.Echo message
      Wscript.Quit 2
    End Sub 

  1. 使用正确的文件夹路径将此脚本路径添加为安装程序项目的生成后事件,如下所示:

PostBuildEvent = cscript "$(ProjectDir)setnomodify.vbs“"$(BuiltOuputPath)"

现在,每当您构建安装程序安装项目时,ARPNOMODIFY将被设置为1,并且已安装应用程序的Unistallstring在注册表中将具有"/X“而不是”/I

您也可以通过使用ORCA并将ARPNOMODIFY作为1添加到MSI的"Property“表中来手动完成此操作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10280952

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档