En WiX DirectorySearch
se puede utilizar para determinar si existe un directorio específico en la computadora de destino. Pero no entiendo si existe una forma consistente de determinar que existe un directorio que no contiene.Detección de la presencia de un directorio en el momento de la instalación
Por ejemplo:
<Property Id="INSTALLDIR" Secure="yes">
<RegistrySearch Id='InstallDir' Type='directory'
Root='HKLM' Key='Software\Company\Product\Install' Name='InstallPath'/>
</Property>
<Property Id='IS_INSTALLED' Secure='yes'>
<DirectorySearch Id='IsInstalled' Path='[INSTALLDIR]' />
</Property>
Cuando existen tanto la clave de registro y el directorio, la propiedad IS_INSTALLED
se establece en el camino devuelta por DirectorySearch
.
Cuando el directorio no existe, IS_INSTALLED
parece estar configurado a "C: \".
es una condición como:
<Condition>NOT (IS_INSTALLED = "C:\")</Condition>
una manera confiable de detectar que se encontró el directorio? ¿Hay una mejor manera?
Respuesta: Aquí es código de WiX basado en mrnxs answer que aceptaba patrones RegLocator y DrLocator de
<Property Id="PRODUCT_IS_INSTALLED" Secure="yes">
<RegistrySearch Id='RegistrySearch1' Type='directory'
Root='HKLM' Key='Software\Company\Product\Version\Install' Name='Path'>
<DirectorySearch Id='DirectorySearch1' Path='[PRODUCT_IS_INSTALLED]'/>
</RegistrySearch>
</Property>
<CustomAction Id='SET_INSTALLDIR'
Property='INSTALLDIR'
Value='[PRODUCT_IS_INSTALLED]'/>
<InstallExecuteSequence>
<Custom Action='SET_INSTALLDIR' After='AppSearch'></Custom>
</InstallExecuteSequence>
Hola Cosmin, gracias por los detalles. El problema que tengo es que uno de tus pasos esencialmente me deja con mi pregunta inicial. Usted dice "... puede configurarlo en IS_INSTALLED si la búsqueda encontró algo". AppSearch parece encontrar siempre "algo" incluso si es la raíz de la unidad del sistema operativo. –
La propiedad de búsqueda se establece en la unidad raíz solo si esa propiedad está asociada a una carpeta en su MSI. Si elimina esa asociación (por ejemplo, al usar otra propiedad para la carpeta), la propiedad de búsqueda debe estar vacía cuando no encuentra nada. Básicamente, la propiedad de búsqueda debe ser utilizada solo por la búsqueda para asegurarse de que esté configurada de la manera que desee. –