我在Wix中构建了一个简单的安装程序,它会将一些数据文件放在预先存在的产品安装中的特定文件夹中,这样用户就不需要知道有关产品安装的任何信息就可以更新他们的数据文件。产品将其安装路径存储在环境变量(ENVVAR
)中,我在这里使用它来计算其NewData子文件夹的路径。
当我双击.msi或从命令行(msiexec /i filename.msi
)运行它时,它运行正常,文件显示在C:\ProductPath\NewData
中。但是,如果使用提升的权限(msiexec /a filename.msi
)安装,则文件将转到D:\
的根目录(甚至不是安装产品的驱动器。)
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
xmlns:util="http://schemas.microsoft.com/wix/UtilExtension"
xmlns:netfx="http://schemas.microsoft.com/wix/NetFxExtension">
<?include InstallVariables.wxi ?>
<Product Id="*"
Name="Product Name"
Manufacturer="My Company"
Version="$(var.Version)"
UpgradeCode="guidgoeshere"
Language="1033">
<Package Description="Description $(var.Version)" Comments="Install package for my product."
InstallerVersion="300" Compressed="yes" InstallScope="perMachine"/>
<Media Id="1" Cabinet="Cabname.cab" EmbedCab="yes" CompressionLevel="high"/>
<SetDirectory Id="PATHMAP" Value="[%ENVVAR]\NewData" Sequence="first" />
<!-- Describe the folder layout here. -->
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="PATHMAP" FileSource="..\New Files">
<Component Id="File1" Guid="guidgoeshere">
<RemoveFile Id="Remove_File1File" Name="$(var.File1Pattern)" On="both" />
<File Id="File1File" Name="$(var.File1)" Vital="yes" KeyPath="yes" />
</Component>
<Component Id="File2" Guid="guidgoeshere">
<RemoveFile Id="Remove_File2File" Name="$(var.File2Pattern)" On="both" />
<File Id="File2File" Name="$(var.File2)" Vital="yes" KeyPath="yes" />
</Component>
</Directory>
</Directory>
<Feature Id="FeatureId" Title="New Files for a Feature" Level="1" >
<ComponentRef Id="File1"/>
<ComponentRef Id="File2"/>
</Feature>
</Product>
</Wix>
请注意,组件中的文件删除是有意的;如果有一个文件的现有版本(可能有一个稍微不同的文件名 - 不是我的选择)我想删除并替换它。用于执行此操作的模式位于包含文件中,并且正常运行。
答案 0 :(得分:1)
命令行:msiexec.exe /a filename.msi
不会以提升的权限触发安装,而是administrative installation。请点击链接以获取说明 - 请务必填写完整说明。本质上,管理安装只是在MSI中提取嵌入文件,以便制作网络安装映像,人们可以在这里安装MSI的常规安装(在上面的链接答案中有更好的解释) - 管理安装“安装任何东西 - 它只是一个提取。
您应该能够通过提供如下所示的TARGETDIR来控制管理安装的输出目录:msiexec.exe /a filename.msi TARGETDIR=C:\MyOutputFolder\
。您的MSI可能缺少一个基本的GUI来显示管理安装的对话框序列 - 这使得在没有指定任何参数的情况下进行提取(因此默认情况下输出到盒子上的最大驱动器)。您可能需要考虑为您的MSI链接标准对话框集,例如<UIRef Id="WixUI_Mondo" />
。您可以在此处查看有关如何执行此操作的分步说明:WiX installer msi not installing the Winform app created with Visual Studio 2017。这将为您的设置提供基本的标准GUI,用于常规安装和管理安装。我认为非常有用 - 你还应该设置自己的许可协议 - 我已经更新了链接的答案以包含它。
我认为这是你的答案的终点。 使用/ a安装并使用提升的权限进行安装 - 实质上 - 它只是文件的提取。但请在该默认GUI中进行链接,以使您的MSI更加标准和更好。
关于环境变量方法的几点评论。我从来没有在环境变量中存储过这样的东西。我通常只是写在HKLM中我自己的位置,并通过自定义操作或使用MSI内置的搜索功能(最好是后者 - 从内部回读 - 依靠内置的MSI功能更好。我我有时会采用只读自定义操作,但非常反对读写自定义操作。你可以在这里看到原因:Why is it a good idea to limit the use of custom actions in my WiX / MSI setups? - 我猜是一个题外话。 WiX可以轻松定义这些搜索并将搜索结果设置为您的媒体资源:Define Searches Using Variables。
也许快速链接到&#34; The WiX toolset's "Remember Property" pattern&#34;作者:Rob Mensching(WiX创作者)。现在这已经很老了,可能有一种新的,更聪明的方法来做到这一点,我还没有意识到。
如果我是你,我宁愿从网络上下载这些更新的文件,而不是像这样将它们部署到一个&#34;数据文件夹中。使用Windows Installer。 部署用户数据文件一直存在问题,MSI及其复杂的文件覆盖规则和#34; quirks&#34;。虽然可能与您的用例不完全相关,但下面是您可以用来为您的应用程序部署数据文件的其他方法的描述 - 可能以更可靠的方式:Create folder and file on Current user profile, from Admin Profile。也许至少快速脱脂。
答案 1 :(得分:0)
有两种类型的环境变量:用户环境变量(为每个用户设置)和系统环境变量(为每个人设置)。
默认情况下,子进程继承其父进程的环境变量。由命令处理器启动的程序继承命令处理器的环境变量。
可能您可以检查机器用户以及是否为所有用户安装了产品指向本地计算机中的系统环境变量。