威克斯 - 让上级目录(wix - getting parent directory)

2019-09-21 09:49发布

我的安装程序需要读取注册表中的值和安装路径设置为该值的母公司。

例如,从注册表获取:

D:\apps\client

然后安装程序应该安装应用

D:\apps

我试过[DIR]\..\ (在“目录”或“CustomAction”),但看到安装时出现以下错误:

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

我如何与维克斯做到这一点?

Answer 1:

看来,你不能用纯威克斯做到这一点。 您可以使用自定义操作类型1 。 前“LaunchConditions”行动在即时模式下执行。 在喜欢你的WiX代码新的属性初始化的地方:

<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>

希望这可以帮助。



Answer 2:

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>

并与维克斯记得特性模式存储在注册表中的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 -->


文章来源: wix - getting parent directory