我已经调整了一个程序来停止需要管理员权限或将数据文件写入其安装程序文件目录。这些文件不是由程序创建的,而是经过修改的:它们存在于全新的安装中,即使它们是空的(不管怎样都不是这样)。
现在我需要调整安装程序,以满足额外的要求,如果有来自先前版本的文件,我必须以某种方式保留它们,因此程序使用它们而不是默认文件。在卸载之后,之前的MSI(不是用WiX制作)会留下这些文件。
我对程序本身的解决方案是将默认数据文件直接安装到INSTALLFOLDER / programfiles中,但是如果文件存在于appdata中,请在每次运行时检查程序,否则从程序文件中复制新文件,然后启动使用新路径。我这样做是因为我仍然希望这是每用户数据,但我不能依赖安装来存储每个当前和未来用户配置文件中的文件;而且我认为这不是MSI应该做的事情。 (顺便说一下,我错了吗?)
现在安装我认为最好的效果是继续将新数据文件安装到程序文件中,但让MSI移动现有文件(如果有的话)(如果程序文件安装中没有数据文件应该继续),到appdata(所以它们将被程序找到并用于安装的用户)。如果在程序文件和appdata中找到文件,那么锦上添花就会解决冲突(我应该假设后者会更新)。
这是我的第一次尝试:
<Directory Id="AppDataFolder">
<Directory Id="appdataDirAuthor" Name="authorName">
<Directory Id="appdataDir" Name="productName">
<Component Id="dbPreserve" Permanent="yes" Guid="XXXXXX">
<CopyFile Id="dbPreserveFoo" Delete="yes" DestinationDirectory="appdataDir" SourceDirectory="dbDir" SourceName="Foo*.*" />
</Component>
</Directory>
</Directory>
</Directory>
当然我收到错误,我必须使用注册表KeyPath,而且我错过了RemoveFile。但我想要的是一次性复制,我不需要或希望操作系统跟踪它,因为我只是模仿软件本身如何在appdata中留下文件,即联合国 - 安装不会碰。
也许这更适合通过自定义操作在MSI运行之外的特殊脚本?
非常感谢提前。
答案 0 :(得分:0)
在阅读this other question的权威答案之后,我再次确认安装程序不适合做这种事情。
仅供参考,这是我将使用的Windows批处理脚本(在InstallFiles之前):
@echo off
if exist "%APPDATA%\authorName\prodName\Foo.bar" exit /b 0
set dirOrig=0
if exist "%ProgramFiles(x86)%\prodNameOld\DATABASE\Foo.bar" set dirOrig=%ProgramFiles(x86)%\prodNameOld\DATABASE
if exist "%ProgramFiles(x86)%\prodName\DATABASE\Foo.bar" set dirOrig=%ProgramFiles(x86)%\prodName\DATABASE
if "%dirOrig%"=="0" exit /b 0
xcopy "%dirOrig%\Foo.bar" "%APPDATA%\authorName\prodName\" /y
xcopy "%dirOrig%\etc.*" "%APPDATA%\authorName\prodName\" /y
del /f/q "%dirOrig%\*.*"
exit /b 0