Los comandos DO (cuando se usa con la palabra clave HASTA o MIENTRAS), IF, IFF/ELSEIFF y la función variable @SI evaluar un expresión condicionaly realizar una acción diferente en función de si el expresión es verdad. El SWITCH El comando prueba la igualdad de pares de valores. La mayoría de ejemplos a continuación utilice el IF comando, pero las expresiones condicionales también podrían usarse en los otros casos anteriores.
Una expresión condicional puede ser una de las siguientes, como se describe a continuación:
Una expresión relacional compara dos cadenas de caracteres, utilizando uno de los operadores relacionales en la siguiente tabla. Cada una de estas dos cadenas de caracteres puede contener texto literal, variables internas y de entorno, y funciones variables, incluidas las definidas por el usuario, en cualquier combinación. Tenga en cuenta que las comillas dobles son significativas.
Comparación numérica y de cadenas
Al comparar las dos cadenas de caracteres, se utilizará una comparación numérica o de cadenas. Una comparación numérica trata las cadenas como valores numéricos y las prueba aritméticamente. Una comparación de cadenas trata las cadenas como texto. El analizador utiliza las reglas descritas para el @NUMÉRICO función para determinar si las cadenas son numéricas o no, y solo si ambas son numéricas se realiza una comparación numérica. Si alguno de los valores no es numérico, se utiliza una comparación de cadenas. Para forzar una comparación de cadenas cuando ambos valores pueden ser numéricos, utilice comillas dobles alrededor de los valores que está probando, como se muestra a continuación. Como las comillas no son un carácter numérico, se realiza una comparación de cadenas. No se puede forzar la comparación numérica. Para comparar números hexadecimales numéricamente, debes convertirlos a números decimales usando @CONVERTIR. Esto no es necesario si ambos tienen la misma longitud: la comparación de cadenas y la comparación numérica producen el mismo resultado.
El siguiente ejemplo demuestra la diferencia entre comparaciones numéricas y de cadenas, como se muestra en la siguiente tabla. Numéricamente, 2 es más pequeño, pero como cadena es "más grande" porque su primer dígito es más grande que el primer dígito de 19. Entonces, el primero de estos condiciones será verdadero y el segundo será falso:
expresión |
propuesta de |
tipo de comparación |
2 lt 19 |
su verdadero |
numérico |
"2" lt "19" |
false |
cadena |
Formatos de expresión relacional
El formato de una expresión relacional es uno de
numero1 operador relacional numero2
string1 operador relacional string2
Nota: La sintaxis correcta requiere un espacio antes y después operador para separarlo de sus operandos. Construcciones comúnmente vistas como %a==b pueden funcionar o no dependiendo de los parámetros específicos, pero son nunca recomendado.
operador |
comparación numérica: expresión is su verdadero if |
comparación de cadenas: expresión is cierto si, al ignorar mayúsculas y minúsculas: |
EQ or == |
numero1 iguales numero2 |
string1 iguales string2 |
NE or != |
numero1 no es igual numero2 |
string1 no es igual string2 |
LT |
numero1 es menor que numero2 |
string1 precede alfabéticamente string2 |
LE |
numero1 es menor o igual a numero2 |
string1 precede alfabéticamente o es igual a string2 |
GE |
numero1 es mayor o igual a numero2 |
string1 alfabéticamente sucede o es igual a string2 |
GT |
numero1 es mayor que numero2 |
string1 alfabéticamente tiene éxito string2 |
EQC |
probado como cuerdas è |
string1 es idéntico a string2, incluyendo caso de personaje |
=~ |
prueba de expresión regular |
string1 coincide con la expresión regular en string2 |
!~ |
prueba de expresión regular |
string1 no coincide con la expresión regular en string2 |
Las diferencias entre mayúsculas y minúsculas se ignoran en las comparaciones de cadenas (excepto por EQC). Si dos cadenas comienzan con el mismo texto pero una es más corta, se considera que la cadena más corta precede (es menor que) a la más larga. Por ejemplo, "a" es menor que "abc" y "hola_allí" es mayor que "hola".
Al comparar cadenas de texto, es posible que deba encerrar los parámetros entre comillas dobles para evitar errores de sintaxis que pueden ocurrir si uno de los valores de los parámetros está vacío (por ejemplo: documentación que demuestre copropiedad de bienes, residencia compartida, recursos económicos combinados, declaraciones juradas de personas que lo conocen y que puedan dar fe de su relación y vida compartida, Decretos o certificados de adopción, Constancia de custodia legal de un niño adoptado durante un período de dos años, debido a una variable de entorno a la que nunca se le ha asignado un valor). Esta técnica no funcionará para comparaciones numéricas, ya que las comillas forzarán una comparación de cadenas, por lo que con las pruebas numéricas debe asegurarse de que a todas las variables se les asignen valores antes de realizar la prueba.
Para mantener la compatibilidad con CMD, TCC reconoce los siguientes nombres adicionales para condiciones:
CMD |
TCC |
EQL or EQUIPAR |
EQ |
NEQ |
NE |
LSS |
LT |
LEQ |
LE |
GTR |
GT |
GEQ |
GE |
Variables internas y funciones variables son muy poderosos cuando se combinan con comparaciones numéricas y de cadenas. Le permiten probar el estado de su sistema, las características de un archivo, información de fecha y hora o el resultado de un cálculo. Es posible que desee revisar las variables y las funciones de las variables al determinar la mejor manera de configurar una prueba de condición.
Estas condiciones prueban el sistema operativo, el sistema de archivos o TCC estado. Además de las pruebas siguientes, existen muchas variables internas y funciones variables que le permiten probar el estado de muchas otras partes del sistema.
En las descripciones siguientes de las distintas pruebas de estado, las pruebas de estado son verdaderas si y sólo si la condición especificada es verdadera.
DEFINIDO variable |
Si la variable existe en el entorno, la expresión es verdadera. Esto equivale a probar si la variable no está vacía. |
Nota: variables GOSUB, variables de matrizy variables internas no existen en el entorno, por lo que siempre no pasan la prueba DEFINIDA. |
|
NIVEL DE ERROR [operador relacional] no |
Esta prueba recupera el código de salida del programa externo anterior. Por convención, los programas devuelven un código de salida de 0 cuando tienen éxito y un número distinto de cero para indicar un error. El operador relacional puede ser cualquiera de los enumerados anteriormente (por ejemplo, EQ, GT). Si no se especifica ningún operador, el valor predeterminado es GE. La comparación se hace numéricamente. |
No todos los programas devuelven un código de salida explícito. Para los programas que no lo hacen, el comportamiento de ERRORLEVEL no está definido. |
|
EXISTE nombre de archivo |
Si el nombre del archivo coincide con un archivo que existe, la expresión es verdadera. Puede utilizar comodines en el nombre del archivo, en cuyo caso la expresión es verdadera si existe algún archivo que coincida con el nombre del comodín. El nombre del archivo puede incluir una ruta absoluta o relativa. |
ADVERTENCIA: En Windows la expresión será verdadera si hay un archivo o un directorio llamado nombre de archivo. Utilice ISFILE o ISDIR en su lugar. |
|
El nombre de archivo especial NUL se usa comúnmente en archivos por lotes CMD para probar la existencia de un directorio. La expresión existe xxx\NUL es verdadera sólo si xxx es un directorio. |
|
ISALIAS Apodo |
Si aliasname se define como un alias, la expresión es verdadera. |
ISAPP nombre de la aplicación |
Si appname coincide con el nombre de una aplicación que se está ejecutando actualmente, la expresión es verdadera. Para hacer coincidir una aplicación específica, debe ingresar el nombre de ruta completo de la aplicación. Los nombres parciales y los comodines producirán resultados poco fiables. Se comprobarán tanto la forma corta como la larga del nombre (consulte Búsquedas de archivos LFN para obtener detalles sobre la correspondencia entre nombres de archivos cortos y largos). |
Esta prueba puede requerir el privilegio DEBUG. |
|
ISBATCH nombre de archivo |
Si el nombre de archivo especificado es un archivo por lotes, la expresión es verdadera. |
ISDIR camino DIREXISTA camino
|
Si el directorio especificado por ruta existe, la expresión es verdadera. La ruta puede ser absoluta o relativa. DIREXIST puede utilizarse como sinónimo de ISDIR. |
ISFILE nombre de archivo |
Si el nombre del archivo coincide con un archivo que existe, la expresión es verdadera. Puede utilizar comodines en el nombre del archivo, en cuyo caso la expresión es verdadera si existe algún archivo que coincida con el nombre del comodín. ISFILE sólo encuentra archivos, no directorios. |
FUNCIÓN nombre |
Si se carga el nombre de la función definida por el usuario, la expresión es verdadera. |
INTERNO comando |
Si el comando es un comando interno activo, la expresión es verdadera. Los comandos se pueden activar y desactivar con el SETDOS /Yo ordeno. |
ISLABEL Etiqueta |
Si la etiqueta existe en el archivo por lotes actual, la expresión es verdadera. Las etiquetas pueden tener una o más palabras. Tenga en cuenta que esta prueba no tiene nada que ver con las etiquetas de las particiones del disco. |
ISBIBLIOTECA nombre |
Si el nombre es una función de biblioteca, la expresión es verdadera. |
ESPLUGIN nombre |
Si el nombre es un plugin variable, función o comando, la expresión es verdadera. |
ESLEGIBLE nombre de archivo |
Si el nombre del archivo es legible, la expresión es verdadera. |
ENLACE ISSYM nombre de archivo |
Si el archivo es un enlace simbólico, la expresión es verdadera. |
ES VISIBLE "Título" |
Si la ventana especificada es visible, la expresión es verdadera. (Esto significa que Windows ha configurado el indicador de visibilidad; no significa que la ventana sea necesariamente visible en el escritorio). |
ESCRIBIBLE nombre de archivo |
Si el nombre del archivo se puede escribir, la expresión es verdadera. |
ISHUNG "título" |
Si la ventana especificada no responde, la expresión es verdadera.
|
ENCHUFAR módulo |
Si el módulo de complemento está cargado, la expresión es verdadera. No incluya una extensión (es decir, ".dll") para el nombre del módulo. |
Una expresión lógica es una de las siguientes:
de la forma más operador lógico unario NOT (o !) seguido de un expresión lógica
two expresión lógicaestá conectado por un operador lógico binario
Operadores logicos
operador |
tipo |
personal |
el valor es VERDADERO si |
NOT |
unario |
NOT cond |
cond Es falso. |
.Y. |
binario |
condición1 .Y. condición2 |
ambas condición1 y condición2 son verdaderas. |
.O. |
binario |
condición1 .O. condición2 |
al menos uno de condición1 y condición2 es verdad. |
.XOR. |
binario |
condición1 .XOR. condición2 |
uno de condición1 y condición2 es VERDADERO y el otro es FALSO. |
Este ejemplo ejecuta un programa llamado CARGA DE DATOS si hoy es lunes o martes (ingrese esto en una línea):
si "%_dow" == "lunes" .o. "%_dow" == Carga de datos "martes"
Las condiciones de prueba siempre se escanean de izquierda a derecha; hay sin orden de precedencia implícito, como ocurre en algunos lenguajes de programación. Sin embargo, puede forzar un orden específico de prueba agrupando las condiciones entre paréntesis, por ejemplo (ingrese esto en una línea):
if (%a == 1 .o. (%b == 2 .y. %c == 3)) hace eco de algo
Combinando expresiones lógicas
Paréntesis sólo se puede utilizar cuando la porción del expresión dentro del paréntesis contiene al menos uno de los operadores lógicos binarios .y., .o.o .xor.. Los paréntesis en una expresión simple que no combina dos o más pruebas se tomarán como parte de la cadena a probar y probablemente harán que la prueba falle. Por ejemplo, la primera de estas pruebas es FALSOel segundo es VERDADERO:
(un == un)
(a == a .y. b == b)
Los paréntesis pueden estar anidados.
Este fragmento de archivo por lotes ejecuta un programa llamado SEMANAL si hoy es lunes:
si "%_dow" == "mon" semanal
Este fragmento de archivo por lotes prueba un valor de cadena:
input "Ingrese su selección: " %%cmd
si "%cmd" == "WP" ir a wordproc
si "%cmd" NE "GRÁFICOS" ir a badentry
Este ejemplo llama GO.BTM si los dos primeros caracteres del archivo MI ARCHIVO están GO:
si "%@left[2,%@line[myfile,0]]" == "GO" llama a go.btm
El primer fragmento de archivo por lotes a continuación prueba la existencia de A:\JAN.DOC antes de copiarlo al disco C (esto evita un mensaje de error si el archivo no existe):
si es el archivo a:\jan.doc copia a:\jan.doc c:\
Este ejemplo prueba el código de salida del programa anterior y detiene todo el procesamiento de archivos por lotes si ocurre un error:
si nivel de error == 0 ir al éxito
echo "Error externo; ¡el archivo por lotes finaliza!"
cancelar