【问题标题】:Set Directory from result of RegistrySearch根据 RegistrySearch 的结果设置目录
【发布时间】:2015-08-14 19:27:56
【问题描述】:

我正在尝试将一些文件添加到我通过 RegistrySearch 找到的目录中。我相信我的 RegistrySearch 是正确的:

<Property Id="IISROOT">
    <RegistrySearch Id="IIS_RegDir"
                    Type="directory"
                    Root="HKLM"
                    Key="Software\Microsoft\InetStp"
                    Name="PathWWWRoot" />
</Property>

我想使用 IISROOT 属性作为对应该添加文件的目录的引用。

<DirectoryRef Id="IISROOT">
    <Component Id="cmp_testBAT" Guid="">
      <File Id="fil_testBAT" KeyPath="yes" Source="$(var.myDir)\test.bat" />
    </Component>
</DirectoryRef>

我知道这行不通,因为如果我想使用 DirectoryRef,我需要一个 Directory,但我的问题是设置一个 Directory 元素以包含 RegistrySearch 结果的目录。

<Directory Id="TARGETDIR" Name="SourceDir">
   <Directory Id="IISROOT" Name/SourceName/FileSource="?"/>
   <!-- ... -->
</Directory>

根据我的阅读,我应该只使用 Name 如果目录不存在,并且其他源属性已被弃用,所以(据我所知),我需要使用 SourceNameFileSource。我都试过了,引用IISROOT,带方括号和不带方括号,并更改属性和目录名称以查看它们是否相同或不同,但结果始终是文件已创建在C:。我也尝试过使用Name=".",但这并没有改变任何东西。日志总是只说IISROOT 目录元素设置为C:\,但不要说我的属性是否设置正确(通过检查 RegEdit,我认为它是正确的,但我不能 100% 确定)。

我看到有人问过类似的问题,但回答通常是我目前的实现。如何将我的 Directory 元素设置为 RegistrySearch 的结果?

【问题讨论】:

    标签: xml wix windows-installer


    【解决方案1】:

    您应该指定一个默认目录,通常在ProgramFilesFolder 下作为备用目录,以防注册表搜索未返回值。因为当注册表搜索工作时,它通常会覆盖它。这样:

    <Fragment>
        <Directory Id="TARGETDIR" Name="SourceDir">
            <Directory Id="ProgramFilesFolder">
                <Directory Id="INSTALLFOLDER" Name="MyApp">
                    <Directory Id="IISROOT" Name="IISFOLDER" />
                </Directory>
            </Directory>
        </Directory>
    </Fragment>
    

    那么你可以这样使用IISROOT目录(即使在不同的文件中):

    <Fragment>
        <ComponentGroup Id="ProductComponents">
            <Component Id="Component_User" Guid="*" Directory="IISROOT">
                <File Name="My Test App.exe" />
            </Component>
        </ComponentGroup>
    </Fragment>
    

    【讨论】:

    • 这是在安装文件夹中创建一个名为IISFOLDER 的文件夹。这是否表明我的 RegistrySearch 没有返回我想要的结果?
    • 是的,你是对的,我使用 Name="PathWWWRootA" 对其进行了测试,它创建了 IISROOT。 :)
    • 一个建议:您可以添加一个条件来验证是否设置了该值。如果没有,请引发错误并阻止安装您的应用。
    • 抱歉,但很难说 RegistrySearch 失败的原因。调试它的一种方法是将结果输出到自定义对话框中的文本控件。
    • 感谢您的建议(我从未想过使用自定义对话框进行调试)。很高兴能够看到我的财产价值,即使这样做的唯一方法感觉非常迂回。
    猜你喜欢
    • 2021-12-19
    • 1970-01-01
    • 2013-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-13
    相关资源
    最近更新 更多