Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Properties 如果在安装时未设置属性,为什么在卸载时忽略这些属性?_Properties_Wix_Uninstallation_Windows Installer - Fatal编程技术网

Properties 如果在安装时未设置属性,为什么在卸载时忽略这些属性?

Properties 如果在安装时未设置属性,为什么在卸载时忽略这些属性?,properties,wix,uninstallation,windows-installer,Properties,Wix,Uninstallation,Windows Installer,我已经创建了一个安装程序,它使用wixsql扩展提供的sqlstring元素安装数据库。以下是代码示例: <ComponentGroup Id="DatabaseCreation" Directory="INSTALLFOLDER"> <Component Id="CreateDatabase" Guid="SOMEGUID" KeyPath="yes"> <sql:SqlString Id="CreateDB" Sequence

我已经创建了一个安装程序,它使用wixsql扩展提供的sqlstring元素安装数据库。以下是代码示例:

<ComponentGroup Id="DatabaseCreation" Directory="INSTALLFOLDER">
  <Component Id="CreateDatabase" Guid="SOMEGUID" KeyPath="yes">
    <sql:SqlString
      Id="CreateDB"
      Sequence="1"
      ExecuteOnInstall="yes"
      ContinueOnError="no"
      SqlDb="MasterDB"
      SQL="DECLARE @dbname nvarchar(128)
      SET @dbname = N'{[SQLDATABASE]}'

      IF(NOT EXISTS 
          (SELECT name 
          FROM master.dbo.sysdatabases
          WHERE ('[\[]' + name + '[\]]') = @dbname
          OR name = @dbname
          )
        )
      CREATE DATABASE {[SQLDATABASE]}"
      />
  </Component>
  <Component Id="DropDatabase" Guid="ANOTHERGUID" KeyPath="yes">
    <sql:SqlString 
      Id="DropDB" 
      Sequence="10000" 
      SqlDb="MasterDB" 
      ExecuteOnUninstall="yes" 
      ContinueOnError="no" 
      SQL="DECLARE @dbname nvarchar(128)
      SET @dbname = N'{[SQLDATABASE]}'

      IF(EXISTS 
          (SELECT name 
          FROM master.dbo.sysdatabases
          WHERE ('[\[]' + name + '[\]]') = @dbname
          OR name = @dbname
          )
        )
      DROP DATABASE {[SQLDATABASE]}"/>
    <Condition>
      <![CDATA[DROPDATABASE = "1"]]>
    </Condition>
  </Component>
</ComponentGroup>
数据库按预期创建。但是使用命令卸载包

msiexec /x package.msi DROPDATABASE="1" /l*v uninstall.log
不会按预期删除数据库。奇怪的是,该属性似乎已设置,如uninstall.log中所述:

[...] MSI (s) (44:68) [14:42:12:442]: Command Line: DROPDATABASE=1 REMOVE=ALL CURRENTDIRECTORY=C:\install CLIENTUILEVEL=2 CLIENTPROCESSID=2532[...]
[...] MSI (s) (44:68) [14:42:12:462]: PROPERTY CHANGE: Adding DROPDATABASE property. Its value is '1'.[...]
[...]Property(S): MsiHiddenProperties = CreateDatabase;DropDatabase;ExecuteSqlStrings;RollbackCreateDatabase;RollbackExecuteSqlStrings[...]
[...]Property(S): DROPDATABASE = 1[...]
现在来看最有趣的部分:使用以下命令安装软件包时:

msiexec /i package.msi DROPDATABASE="1" /l*v install.log
msiexec /x package.msi DROPDATABASE="0" /l*v uninstall.log
使用以下命令卸载程序包:

msiexec /i package.msi DROPDATABASE="1" /l*v install.log
msiexec /x package.msi DROPDATABASE="0" /l*v uninstall.log
删除数据库。我无法理解为什么会发生这种情况。这里,为DROPDATABASE属性传递了值“0”,但代码明确指出,只有当该属性的值设置为值“1”时,才会删除数据库。可以在日志文件中再次看到该值的赋值:

[...]MSI (s) (44:44) [14:49:12:587]: PROPERTY CHANGE: Adding DROPDATABASE property. Its value is '0'.[...]

为什么卸载时忽略DROPDATABASE属性?MsiHiddenProperties从何而来?如何设置卸载的属性?

默认情况下,只有在安装过程中才会评估
组件的
条件。如果希望在每次执行安装包时评估
条件
,则需要在
组件
元素上设置
Transitive='yes'
属性

但是,根据我的经验,在卸载过程中,如果MSI安装了
组件
,那么在卸载MSI时,它将被删除


MsiHiddenProperties
来自您正在使用的SQL自定义操作。它们阻止Windows Installer记录SQL字符串,因为有时SQL字符串中有密码,您不希望在日志文件中使用纯文本形式的密码,从而导致安全漏洞。

默认情况下,只有在安装过程中才会评估
组件的
条件。如果希望在每次执行安装包时评估
条件
,则需要在
组件
元素上设置
Transitive='yes'
属性

但是,根据我的经验,在卸载过程中,如果MSI安装了
组件
,那么在卸载MSI时,它将被删除

MsiHiddenProperties
来自您正在使用的SQL自定义操作。它们阻止Windows Installer记录SQL字符串,因为有时SQL字符串中有密码,并且您不希望在日志文件中使用纯文本形式的密码,从而导致安全漏洞