如何根据给定路径中是​​否存在文件来创建MSI属性?

时间:2013-06-26 12:04:47

标签: visual-studio windows-installer setup-project

在我的安装应用程序中显示某些UI控件的条件之一是基于文件是否存在。

此检查无法通过自定义操作完成,因为即使OnBeforeInstall事件在安装后发生,我想要更改的对话框也会在此之前显示。

如果我使用的是WiX,那就很简单了

<Property Id="FILEEXISTS">
   <DirectorySearch Id="CheckFileDir"
                 Path="[CommonAppDataFolder]Manufacturer\Product"
                 Depth="0">
      <FileSearch Id="CheckFile"
              Name="Filename.ext" />
   </DirectorySearch>
</Property>

如果没有WiX怎么办?

2 个答案:

答案 0 :(得分:1)

您可以将WiX代码放入合并模块项目中,然后在安装项目中使用它。

Redemption of Visual Studio Deployment Projects

FWIW,IMO,安装项目真是太可怕了。微软在VS2012中将其杀死,用户语音网站上有成千上万的抱怨是那些对安装人员一无所知的人带回来的。

如果是我,由于您正在进行自定义UI工作,我将花费2000美元购买InstallShield Professional的单个副本,并使用Windows Installer XML采用合并模块。当然,这一切都可以通过WiX完成,但节省的时间是值得的。

Augmenting InstallShield using Windows Installer XML - Certificates

答案 1 :(得分:0)

您需要为MSI文件构建一个JScript。或者你可以在Orca手动完成。

var installer = WScript.CreateObject("WindowsInstaller.Installer");
var filespec = WScript.Arguments(0);
var msiOpenDatabaseModeTransact = 1;
var database = installer.OpenDatabase(filespec, msiOpenDatabaseModeTransact);

Execute("INSERT INTO `AppSearch` (`Property`, `Signature_`) VALUES ('FILEEXISTS', 'CheckFile')");
Execute("INSERT INTO `DrLocator` (`Signature_`, `Parent`) VALUES ('CheckFile', 'CheckFileDir')");
Execute("INSERT INTO `DrLocator` (`Signature_`, `Path`, `Depth`) VALUES ('CheckFileDir', '[CommonAppDataFolder]Manufacturer\\Product', 0)");
Execute("INSERT INTO `Signature` (`Signature`, `FileName`) VALUES ('CheckFile', 'Filename.ext')");

function Execute(sql) {
    view = database.OpenView(sql);
    view.Execute();
    view.Close();
}