2011-02-08 15 views
5

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> 

Respuesta

4

Por lo general, esto sucede cuando la propiedad se utiliza como una carpeta basada en propiedades. En este caso, la acción CostFinalize establece automáticamente la propiedad en una ruta válida (por ejemplo, "C: \"), por lo que Windows Installer puede usar la carpeta.

Dado que esta ruta se genera automáticamente, no puede estar seguro de que será "C: \" en todas las máquinas cliente, por lo que no debe usar este valor en su condición. En su lugar, puede intentar esto:

  • uso una propiedad personalizada para su carpeta
  • utilizar un tipo 51 custom action (conjunto de propiedades con formatos de texto) para establecer esta propiedad a una ruta predeterminada válida (por ejemplo, "[ProgramFilesFolder] MyCompany \ MyProduct ")
  • utilizar otra propiedad para la búsqueda
  • utilizar otro tipo de acción 51 a medida para establecer la propiedad de carpeta para su búsqueda de propiedades

por ejemplo, si su sí el arco está IS_INSTALLED su carpeta puede usar IS_INSTALLED_PATH. IS_INSTALLED_PATH se puede establecer en una ruta predeterminada y después de la acción de AppSearch puede establecerlo en IS_INSTALLED si la búsqueda encontró algo.

esta manera se puede utilizar para el acondicionamiento:

IS_INSTALLED 

o

NOT IS_INSTALLED 
+0

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. –

+0

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. –

0

Understaing AppSearch puede ser un poco difícil. Recomiendo ignorar la condición por un momento y registrar la instalación para verificar que AppSearch está configurando correctamente las propiedades que desea. Primero solucione los problemas que encuentre en ese extremo. Cuando funciona, la propiedad se establecerá en el valor del registro o la ruta al directorio.

Entonces usted debe ser capaz de utilizar:

<Condition>IS_INSTALLED/> <!-- it's not important what the value is, just that it exists --> 
<Condition>Not IS_INSTALLED/> 

Por cierto, me gustaría evitar el uso de la DIRINSTALACIÓN propiedad. En mis instaladores (InstallShield) que tiene un significado especial como el principal punto focal de la instalación.

0

Otro enfoque podría ser esto, en esta se puede continuar con la secuencia de instalación si desea establecer el InstallDir a cualquier parte de lo contrario, si SystemDir y RegisteryDir no son los mismos

<Property Id="RegisteryDir" Secure="yes"> 
<RegistrySearch Id='InstallDir' Type='directory' 
Root='HKLM' Key='Software\Company\Product\Install' Name='InstallPath'/> 
</Property> 
<Property Id='SystemDir' Secure='yes'> 
<DirectorySearch Id='IsInstalled' Path='[RegisteryDir]' /> 
</Property> 
<CustomAction Id="SET_INSTALL_DIR" Property="INSTALLDIR" Value="[SystemDir] /> 

<InstallExecuteSequence> 
<Custom Action='SET_INSTALLDIR' After='AppSearch'> 
SystemDir AND SystemDir=RegisteryDir 
</Custom> 
</InstallExecuteSequence> 
Cuestiones relacionadas