如果在同一个树中多次使用WiX DirectorySearch / @ Depth,则会被
我有一个WiX安装程序,可以将一堆扩展文件安装到另一个应用程序的app目录中.为了确保文件最终位于正确的位置,我使用一堆嵌套的DirectorySearch来查找app目录.
该应用程序通常安装在此模式之后的路径中: Program Files (x86)CompanyNameProductName[version][environment][optional intermediate folder]AppFolderName 换句话说,常见的安装文件夹包括: Program Files (x86)CompanyNameProductName1.0ProdAppFolderName Program Files (x86)CompanyNameProductName1.1ProdOptionalFolderNameAppFolderName Program Files (x86)CompanyNameProductName1.2TestAppFolderName Program Files (x86)CompanyNameProductName1.2TestOptionalFolderNameAppFolderName 为了解决这个问题,我使用一组嵌套的DirectorySearch元素来分配Property的路径.如果存在可选文件夹(OptionalFolderName),则以下内容有效: <Property Id="SOMEAPPFOLDER"> <DirectorySearch Id="ProgramFilesFolder" Path="[ProgramFilesFolder]"> <DirectorySearch Id="CompanyNameFolder" Path="CompanyName"> <DirectorySearch Id="ProductFolder" Path="ProductName"> <DirectorySearch Id="EnvironmentFolder" Path="$(var.ENVIRONMENTNAME)" Depth="2"> <DirectorySearch Id="OptionalIntermediateFolder" Path="OptionalFolderName"> <DirectorySearch Id="AppFolder" Path="AppFolderName" AssignToProperty="yes"> <FileSearch Id="AppNameExe" Name="AppName.exe" MinVersion="$(var.MIN_VERSION).0" MaxVersion="$(var.MAX_VERSION).999" /> </DirectorySearch> </DirectorySearch> </DirectorySearch> </DirectorySearch> </DirectorySearch> </DirectorySearch> </Property> 但是,由于OptionalFolderName是可选的,我想使用DirectorySearch来确定app文件夹是直接位于环境文件夹下还是一个级别.为了做到这一点,我将搜索树更改为: <Property Id="SOMEAPPFOLDER"> <DirectorySearch Id="ProgramFilesFolder" Path="[ProgramFilesFolder]"> <DirectorySearch Id="CompanyNameFolder" Path="CompanyName"> <DirectorySearch Id="ProductFolder" Path="ProductName"> <DirectorySearch Id="EnvironmentFolder" Path="$(var.ENVIRONMENTNAME)" Depth="2"> <DirectorySearch Id="AppFolder" Path="AppFolderName" Depth="2" AssignToProperty="yes"> <FileSearch Id="AppNameExe" Name="AppName.exe" MinVersion="$(var.MIN_VERSION).0" MaxVersion="$(var.MAX_VERSION).999" /> </DirectorySearch> </DirectorySearch> </DirectorySearch> </DirectorySearch> </DirectorySearch> </Property> 但是,如果存在可选文件夹,则后一版本不起作用,但如果不存在则它可以正常工作.换句话说,就好像其中一个Depth属性是isgnored;我的猜测是因为我在树中的不同级别使用了两次Depth属性. 关于我如何解决这个问题的任何建议? 更新 – 从msiexec / i添加日志片段摘录[msiname] / l * v [logfile]: Action 14:38:47: AppSearch. Searching for installed applications Action start 14:38:47: AppSearch. AppSearch: Property: SOMEAPPFOLDER,Signature: AppFolder MSI (c) (00:90) [14:38:47:065]: Note: 1: 1322 2: MSI (c) (00:90) [14:38:47:065]: Note: 1: 1322 2: MSI (c) (00:90) [14:38:47:065]: Note: 1: 1324 2: [environmentname] 3: 1 MSI (c) (00:90) [14:38:47:065]: Note: 1: 1325 2: CompanyName Action ended 14:38:47: AppSearch. Return value 1. MSI (c) (00:90) [14:38:47:066]: Doing action: LaunchConditions MSI (c) (00:90) [14:38:47:067]: Note: 1: 2205 2: 3: ActionText Action 14:38:47: LaunchConditions. Evaluating launch conditions Action start 14:38:47: LaunchConditions. MSI (c) (00:A8) [14:38:47:069]: Font created. Charset: Req=0,Ret=0,Font: Req=MS Shell Dlg,Ret=MS Shell Dlg Couldn't find the AppFolderName app folder for [environment/version]. MSI (c) (00:90) [14:38:48:543]: Note: 1: 2205 2: 3: Error MSI (c) (00:90) [14:38:48:543]: Note: 1: 2228 2: 3: Error 4: SELECT `Message` FROM `Error` WHERE `Error` = 1709 MSI (c) (00:90) [14:38:48:543]: Product: [productname] -- Couldn't find the AppFolderName app folder for [environment/version]. Action ended 14:38:48: LaunchConditions. Return value 3. 解决方法
使用FileSearch时的深度行为
当FileSearch是DirectorySearch的直接后代时,深度的工作方式不同. 在正常情况下,Depth指定指定路径上方的最大文件夹级别数.但是,如果FileSearch是直接后代,则Depth指定在指定路径下查找文件的最大文件夹级别数. 换句话说,没有办法指定作为文件的直接父级的目录的深度. 例 我们来看看你粘贴的代码: <Property Id="SOMEAPPFOLDER"> <DirectorySearch Id="ProgramFilesFolder" Path="[ProgramFilesFolder]"> <DirectorySearch Id="CompanyNameFolder" Path="CompanyName"> <DirectorySearch Id="ProductFolder" Path="ProductName"> <DirectorySearch Id="EnvironmentFolder" Path="$(var.ENVIRONMENTNAME)" Depth="2"> <DirectorySearch Id="AppFolder" Path="AppFolderName" Depth="2" AssignToProperty="yes"> <FileSearch Id="AppNameExe" Name="AppName.exe" MinVersion="$(var.MIN_VERSION).0" MaxVersion="$(var.MAX_VERSION).999" /> </DirectorySearch> </DirectorySearch> </DirectorySearch> </DirectorySearch> </DirectorySearch> </Property> 在上面,第一次使用Depth允许在ProductFolder和EnvironmentFolder之间有两个目录级别,但第二次使用Depth是指AppFolder和AppNameExe之间的级别数. 解决方法 以下xml使用两个搜索来解决此问题: <!-- Locate the parent directory first --> <Property Id="SOMEAPPFOLDER"> <DirectorySearch Id="ProgramFilesFolder" Path="[ProgramFilesFolder]"> <DirectorySearch Id="CompanyNameFolder" Path="CompanyName"> <DirectorySearch Id="ProductFolder" Path="ProductName"> <DirectorySearch Id="EnvironmentFolder" Path="$(var.ENVIRONMENTNAME)" Depth="1"> <DirectorySearch Id="AppFolder" Path="AppFolderName" Depth="1" /> </DirectorySearch> </DirectorySearch> </DirectorySearch> </DirectorySearch> </Property> <!-- Now,look for the file in the above directory --> <Property Id="APPFILEEXISTS"> <DirectorySearch Id="AppFolder" Path="SOMEAPPFOLDER"> <FileSearch Id="AppNameExe" Name="AppName.exe" MinVersion="$(var.MIN_VERSION).0" MaxVersion="$(var.MAX_VERSION).999" /> </DirectorySearch> </Property> (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- windows-phone-7 – 以编程方式显示应用程序栏菜单(wp7)
- 如何在Windows上使用Java在默认图像查看器中打开图像?
- winapi – 从进程ID获取进程名称(win32)
- 如何在我的IIS Windows服务器上限制从我的网站下载速度?
- win-universal-app – 编译UWP App时出错:“保留使用Windo
- Metro XAML – LayoutTransform在哪里?
- 如何在Windows NTEmacs下使用ediff?
- 新鲜的Windows 8中,从/到Java首选项的阅读和写入失败,
- 用汇编语言访问数组的元素(windows)
- 在Windows 10上清除和管理TPM (受信任的平台模块)
- 2018-2019-2 《网络对抗技术》Exp2 后门原理与应
- Microsoft.WindowsAzure.targets“指定的路径,文
- active-directory – GPO无法应用;原因:无法访问
- 在Windows 10 Universal App上添加Youtube嵌入视
- 如何在StandardStyles.xaml中定义基元
- winapi – Windows 10中的Win32工具提示灰线错误
- windows 与Ubuntu 贡献目录,实现交互
- windows-server-2003,Windows服务器,命令行下载实
- windows-server-2008 – DHCP:在作用域内创建作
- 在.NET中调试外部DLL