0

我的安装程序需要从注册表中读取一个值并将安装路径设置为该值的父级。

例如,从注册表中我得到:

D:\apps\client

然后安装程序应将应用程序安装到

D:\apps

我试过[DIR]\..\(在“目录”或“自定义操作”中),但在安装时看到以下错误:

Error 1324. The folder path '..' contains an invalid character.

我怎样才能用 WiX 做到这一点?

4

2 回答 2

3

看来你不能用纯wix做到这一点。您可以使用自定义操作类型 1。在“LaunchConditions”操作之前以立即模式执行它。在您的 wix-code 新属性中的某处初始化,例如:

<Property Id="DIRFROMREG" Value="0" Secure="yes">  

这是 C# 上的示例:

 public class CustomActions
{
    [CustomAction]
    public static ActionResult DirectorySearchAction(Session session)
    {
        try
        {
            session.Log("Directory search");
            RegistryKey reg = Registry.LocalMachine.OpenSubKey(@"...your subkey...");
            if (reg != null)
            {
                var dir=reg.GetValue("...your value...");
                /*
                    var parentdir= split here your directory
                */
                session["DIRFROMREG"] =parentdir;
                session.Log(@"directory is ");
            }
            else
            {
                session.Log(@"The registry key is not found");
            }
        }
        catch (Exception e) 
        {
            session.Log(@"Error "+e);
        }
        return ActionResult.Success;
    }
}

最后一件事:

<SetProperty Id="INSTALLLOCATION" Value="[DIRFROMREG]" After="Your custom action">NOT DIRFROMREG=0</SetProperty>

希望这可以帮助。

于 2012-08-22T05:30:29.793 回答
0

Nerielle 有一个很好的答案。我的安装都转到子文件夹,所以当我找到一个旧组件时,我需要父文件夹进行安装,所以我来这里寻求答案。
自定义操作到操作属性 ,我发现了如何获取父文件夹,因为我有一个已知的固定安装子路径。

    <!-- Set INSTALLFOLDER from SERVERINSTALLFOLDER without the \Server\ -->
    <CustomAction Id="VBScriptInstallFolderFromFoundServer" Script="vbscript">
      <![CDATA[         
        pathvalue = Session.Property("SERVERINSTALLFOLDER")
        if pathvalue <> "" Then
          Session.Property("INSTALLFOLDER") = Left(pathvalue,Len(pathvalue)-Len("\Server\"))
        End If
      ]]>
    </CustomAction>

结合定位另一个产品的安装目录

    <Property Id="SERVERINSTALLFOLDER">
      <!-- Id="C_SERVER_SERVERHOST.EXE" Guid="{xxx GUID OF my exe component xxx}" -->
      <ComponentSearch Id="ServerComponentSearch" Type="file" Guid="{xxx GUID OF my exe component xxx}">
        <DirectorySearch Id="ServerComponentDirectorySearch" Depth="0" AssignToProperty="yes" />
      </ComponentSearch>
    </Property>

并且使用Wix 记住 在注册表中存储 INSTALLFOLDER 路径的属性模式。
我现在可以更新旧版本,或者安装新版本,以获得先前安装的正确安装路径作为建议。
vbscript 可能已更改为使用路径处理功能来查找父级,而不是删除固定的子字符串以更正确地回答问题但是......
我的 InstallUISequence 和 InstallExecuteSequence :

      <!-- Save INSTALLFOLDER parameter to CMDLINE_INSTALLFOLDER -->
      <Custom Action='SaveCmdLineValue' Before='AppSearch' />
      <!-- Set INSTALLFOLDER from SERVERINSTALLFOLDER without the \Server\ -->
      <Custom Action="VBScriptInstallFolderFromFoundServer" After="AppSearch">
        SERVERINSTALLFOLDER
      </Custom>
      <!-- Set INSTALLFOLDER from parameter CMDLINE_INSTALLFOLDER -->
      <Custom Action='SetFromCmdLineValue' After='VBScriptInstallFolderFromFoundServer'>
        CMDLINE_INSTALLFOLDER
      </Custom>

最后......在产品中,我指的是我放入这些的片段:

    <!-- Install to previous install path From parameter, OR from found installation OR from registry -->
    <CustomActionRef Id='SaveCmdLineValue' />
    <PropertyRef Id='INSTALLFOLDER'/><!-- include Fragment -->
    <PropertyRef Id='SERVERINSTALLFOLDER'/><!-- include Fragment -->
    <CustomActionRef Id='VBScriptInstallFolderFromFoundServer' /><!-- include Fragment -->
于 2019-02-28T17:02:37.063 回答