Sintaxis de instrucciones condicionales

En esta sección se describe la sintaxis de las instrucciones condicionales que usa la función MsiEvaluateCondition y las tablas de secuencia de acciones. Para obtener más información, consulte Ejemplos de sintaxis de instrucción condicional.

Resumen de la sintaxis de instrucciones condicionales

En esta tabla y en la lista siguiente se resume la sintaxis que se va a usar en expresiones condicionales.

Elemento Syntax
value symbol | literal | integer
operador de comparación < | > | <= | >= | = | <>
término value | value comparison-operator value | ( expression )|
factor booleano term | NOT term
término booleano Boolean-factor | Boolean-factor AND term
expresión Boolean-term | Boolean-term OR expression
símbolo property | %environment-variable | $component-action | ?component-state | &feature-action | !feature-state

 

  • Los nombres y los valores de símbolo distinguen mayúsculas de minúsculas.

  • En los nombres de variables de entorno no se hace distinción entre mayúsculas y minúsculas.

  • El texto literal debe ir entre comillas ("texto").

    Nota:

    No se puede usar texto literal que contenga comillas en instrucciones condicionales porque no hay ningún carácter de escape para comillas dentro del texto literal. Para realizar una comparación con el texto literal que contiene comillas, este debe colocarse en una propiedad. Por ejemplo, para comprobar que la propiedad SERVERNAME no contiene comillas, defina una propiedad denominada QUOTES en la tabla Property con un valor de " y cambie la condición a NOT SERVERNAME><QUOTES.

     

  • Los valores de propiedad inexistentes se tratan como cadenas vacías.

  • No se admiten valores numéricos de punto flotante.

  • Los operadores y la precedencia son los mismos que en los lenguajes BASIC y SQL.

  • No se admiten operadores aritméticos.

  • Los paréntesis se pueden usar para invalidar la precedencia del operador.

  • Los operadores no distinguen mayúsculas de minúsculas.

  • Para las comparaciones de cadenas, una tilde "~" como prefijo del operador realiza una comparación que no distingue mayúsculas de minúsculas.

  • La comparación de un entero con un valor de cadena o de propiedad que no se puede convertir en un entero siempre es msiEvaluateConditionFalse, excepto el operador de comparación "<>", que devuelve msiEvaluateConditionTrue.

Prefijos de acceso

En la tabla siguiente se muestran los prefijos que se van a usar para acceder a la información del sistema y del instalador para su uso en expresiones condicionales.

Tipo de símbolo Prefijo Value
Propiedad del instalador (ninguno) Valor de la tabla de propiedad (Property).
Variable de entorno % Valor de la variable de entorno.
Clave de la tabla Component $ Estado de acción del componente.
Clave de la tabla Component ? Estado instalado del componente.
Clave de la tabla Feature & Estado de acción de la característica.
Clave de la tabla Feature ! Estado instalado de la característica.

 

Operadores lógicos

En la tabla siguiente se muestran los operadores lógicos en expresiones condicionales, en orden de prioridad alta a baja.

Operator Significado
Not Operador unario de prefijo; invierte el estado del siguiente término.
Y TRUE si ambos términos son TRUE.
Or TRUE si uno o ambos términos son TRUE.
Xor TRUE si un término es TRUE, pero no ambos.
Eqv TRUE si ambos términos son TRUE o ambos términos son FALSE.
Imp TRUE si el término izquierdo es FALSE o el término derecho es TRUE.

 

Operadores comparativos

En la tabla siguiente se muestran los operadores de comparación que se usan en expresiones condicionales. Estos operadores de comparación solo pueden producirse entre dos valores.

Operator Significado
= TRUE si el valor izquierdo es igual al valor derecho.
<> TRUE si el valor izquierdo no es igual al valor derecho.
> TRUE si el valor izquierdo es mayor que el valor derecho.
>= TRUE si el valor izquierdo es mayor o igual que el valor derecho.
< TRUE si el valor izquierdo es menor que el valor derecho.
<= TRUE si el valor izquierdo es menor o igual que el valor derecho.

 

Operadores de subcadena

En la tabla siguiente se muestran los operadores de subcadena que se usan en expresiones condicionales. Los operadores de subcadena pueden producirse entre dos valores de cadena.

Operator Significado
>< TRUE si la cadena izquierda contiene la cadena derecha.
<< TRUE si la cadena izquierda comienza con la cadena derecha.
>> TRUE si la cadena izquierda termina con la cadena derecha.

 

Operadores numéricos bit a bit

En la tabla siguiente se muestran los operadores numéricos bit a bit en expresiones condicionales. Estos operadores pueden producirse entre dos valores enteros.

Operator Significado
>< AND bit a bit, TRUE si los enteros izquierdo y derecho tienen bits comunes.
<< True si los 16 bits altos del entero izquierdo son iguales al entero derecho.
>> True si los 16 bits bajos del entero izquierdo son iguales al entero derecho.

 

Valores de estado de características y de componentes

En la tabla siguiente se muestra dónde es válido usar los símbolos de operador de características y de componentes.

Operador <state> Dónde es válida la sintaxis
$component-action En la tabla Condition y en las tablas de secuencia, después de la acción CostFinalize.
&feature-action En la tabla Condition y en las tablas de secuencia, después de la acción CostFinalize.
!feature-state En la tabla Condition y en las tablas de secuencia, después de la acción CostFinalize.
?component-state En la tabla Condition y en las tablas de secuencia, después de la acción CostFinalize.

 

En la tabla siguiente se muestran los valores de estado de las características y componentes que se usan en expresiones condicionales. Estos estados no se establecen hasta que se llama a MsiSetInstallLevel, ya sea directamente o mediante la acción CostFinalize.

Estado Value Significado
INSTALLSTATE_UNKNOWN -1 No se realizará ninguna acción en la característica o el componente.
INSTALLSTATE_ADVERTISED 1 Característica anunciada. Este estado no está disponible para los componentes.
INSTALLSTATE_ABSENT 2 Característica o componente no presente.
INSTALLSTATE_LOCAL 3 Característica o componente en el equipo local.
INSTALLSTATE_SOURCE 4 La característica o el componente se ejecutan desde el origen.

 

Por ejemplo, la expresión condicional "&MyFeature=3" se evalúa como True solo si MyFeature cambia de su estado actual al estado de estar instalado en el equipo local, INSTALLSTATE_LOCAL.

Tenga en cuenta que no debe depender de la condición $Component1=3 para comprobar si Component1 está instalado localmente en el equipo. Esto puede producir un error si más de un producto instaló Component1. Una vez que Product1 haya instalado Component1 localmente, el instalador evalúa la condición $Component 1=3 como False durante la instalación de Product2. Esto se debe a que el instalador determina la versión del componente mediante el trazado de la clave del componente y marca el componente para la instalación si su versión es mayor o igual que el componente instalado.

Tenga en cuenta que el instalador no realizará comparaciones directas del tipo de datos Version en instrucciones condicionales. Por ejemplo, no puede usar operadores comparativos para comparar versiones como "01.10" y "1.010" en una instrucción condicional. En su lugar, use un método válido para buscar una versión, como se describe en Buscar aplicaciones existentes, archivos, entradas del Registro o entradas de archivo .ini y, después, establezca una propiedad.

Uso de propiedades en instrucciones condicionales