根据 RegistrySearch 的结果设置目录
Set Directory from result of RegistrySearch
我正在尝试将一些文件添加到我使用 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,我需要一个目录,但我的问题是设置一个目录元素以包含 RegistrySearch 结果的目录。
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="IISROOT" Name/SourceName/FileSource="?"/>
<!-- ... -->
</Directory>
据我所知,如果目录尚不存在且其他源属性已被弃用,我应该只使用 Name,因此(据我所知)我需要使用 SourceName
或 FileSource
。我都试过了,引用 IISROOT
,带方括号和不带方括号,并更改 属性 和目录名称以查看它们是否相同或不同,但结果是文件始终是在 C:
中创建的。我也尝试过使用 Name="."
,但这并没有改变任何东西。日志总是只说 IISROOT
目录元素设置为 C:\
,但不说我的 属性 设置是否正确(从检查 RegEdit,我认为它是正确的,但是我不能 100% 确定)。
我看到过类似的问题,但答案通常是我目前的实现。如何将我的目录元素设置为 RegistrySearch
?
的结果
您应该指定一个默认目录,通常在 ProgramFilesFolder
下作为后备,以防注册表搜索没有 return 值。因为当注册表搜索起作用时,它通常会覆盖它。这样:
<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>
我正在尝试将一些文件添加到我使用 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,我需要一个目录,但我的问题是设置一个目录元素以包含 RegistrySearch 结果的目录。
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="IISROOT" Name/SourceName/FileSource="?"/>
<!-- ... -->
</Directory>
据我所知,如果目录尚不存在且其他源属性已被弃用,我应该只使用 Name,因此(据我所知)我需要使用 SourceName
或 FileSource
。我都试过了,引用 IISROOT
,带方括号和不带方括号,并更改 属性 和目录名称以查看它们是否相同或不同,但结果是文件始终是在 C:
中创建的。我也尝试过使用 Name="."
,但这并没有改变任何东西。日志总是只说 IISROOT
目录元素设置为 C:\
,但不说我的 属性 设置是否正确(从检查 RegEdit,我认为它是正确的,但是我不能 100% 确定)。
我看到过类似的问题,但答案通常是我目前的实现。如何将我的目录元素设置为 RegistrySearch
?
您应该指定一个默认目录,通常在 ProgramFilesFolder
下作为后备,以防注册表搜索没有 return 值。因为当注册表搜索起作用时,它通常会覆盖它。这样:
<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>