Condicionales If
Condicionales If
Condicionales If
tmpl=%2Fsystem%2Fapp%2Fte…
Según expresa la ayuda de if, sus principales funciones son las siguientes:
* El parámetro opcional de not expresa que una acción solo se debe llevar a cavo si la condición es falsa o desigual.
@echo off
title Preguntita
:inicio
set /p cuenta=Cuanto es 2+2 ?...
:bien
echo El resultado es correcto ;P
pause>nul
exit
:mal
echo El resultado es incorrecto. Vuelva a intentarlo.
goto inicio
El doble igual “==” establece una coincidencia (o igualdad), que si es cierta procederá a ejecutar una acción y que si no es cierta (aplicando else) hará
otra cosa, siendo “else” una función opcional que podemos omitir. Recordemos que el uso de paréntesis también se puede omitir salvo cuando se utilice
la función else.
Veamos un ejemplo:
@echo off
title Redactor
if not %var%==nikos3194 (
echo Te equivocaste ¬¬
) else (
echo Correcto! ^^
)
pause>nul
Como se puede ver, cuando colocamos paréntesis podemos acomodar las acciones como se nos antojen, pero con cuidado de que si usamos más de una
acción las precedamos de &&, ya que if no permite usar más de un comando por cada condición. (Veremos esto más adelante).
En este caso si existiera el archivo “archivo.jpg” sería eliminado, de lo contrario mostraría un mensaje de que el archivo no existe.
Una forma muy útil de usar esto es para detectar la presencia de virus en memorias y eliminar su fichero de autoreproducción “autorun.inf”:
if exist %homedrive%\autorun.inf (
echo Su unidad esta infectada!, presione una tecla para eliminar el archivo perjudicial
) else (
echo Su unidad no se encuentra infectada && pause>nul && goto EOF)
pause>nul
del /f /s /q %homedrive%\autorun.inf
Al igual que “if exist” para los archivos, también se puede usar “if defined” para las variables, permitiendo saber si una variable fue declarada
correctamente:
https://sites.google.com/site/nikos3194rfcindex/home/batch/sentencias-de-control/condicionales-if?tmpl=%2Fsystem%2Fapp%2Ftemplates%2Fp… 1/4
15/7/2019 https://sites.google.com/site/nikos3194rfcindex/home/batch/sentencias-de-control/condicionales-if?tmpl=%2Fsystem%2Fapp%2Fte…
En donde “cadena1” y “cadena2” pueden ser un número, una palabra, una variable o un conjunto de caracteres, que estará delimitado por la opción de
comparación que se halla definido, siendo el lugar de “opción” cualquiera de las siguientes opciones:
EQU: Igual (=) LSS: Menor que (<) GTR: Mayor que (>)
NEQ: No igual LEQ: Menor o igual GEQ: Mayor o igual
(≠) (≤) (≥)
El parámetro opcional /i indica que para las comparaciones no habrá distinción entre mayúsculas y minúsculas, ya que if por defecto trae la función
Case-Sensitive habilitada.
@echo off
title Menor o mayor de edad
:mayor
echo Usted es mayor de edad… Diviertase!!!
pause>nul
goto salir
:menor
echo Usted es menor de edad… Afuera!!!
pause>nul
:salir
exit
En este ejemplo comprobábamos si la variable %edad% era mayor o igual (GEQ), o menor o igual (LEQ) de 18.
Podemos ver este otro ejemplo donde se pueden utilizar GTR (mayor que) y LSS (menor que) para adivinar un número:
@echo off
:menu
echo Tenes que averiguar el numero para poder salir…
if %var%==5 goto si
if %var% LSS 5 goto menor
if %Var% GTR 5 goto mayor
:si
echo correcto!!
pause>nul
goto salir
:menor
echo elegi otro mas alto
goto menu
:mayor
echo elegi otro mas chico
goto menu
:salir
exit
Y así como se pueden hacer comparaciones con números también se pueden comparar cadenas de texto:
@echo off
title Login
:inicio
echo Introducir la contraseña:
set /p contra=
:correcto
echo CONTRASEÑA CORRECTA!
echo Usted dispone de pribilegio para ver el contenido oculto...
pause>nul
type secreto.txt
exit
:incorrecto
echo CONTRASEÑA INCORRECTA, VOLVE A INTENTARLO
goto inicio
Pero para este ultimo caso, el hecho de especificar EQU sería lo mismo que poner “==”, ya que expresa igualdad:
https://sites.google.com/site/nikos3194rfcindex/home/batch/sentencias-de-control/condicionales-if?tmpl=%2Fsystem%2Fapp%2Ftemplates%2Fp… 2/4
15/7/2019 https://sites.google.com/site/nikos3194rfcindex/home/batch/sentencias-de-control/condicionales-if?tmpl=%2Fsystem%2Fapp%2Fte…
En caso de que usáramos el parámetro /i , introducir Admin o ADMIN seria igual que admin.
If permite comprobar los valores de las variables dinámicas ErrorLevel y CmdExtVersion de manera directa.
En el apartado de Variables de Entorno y Dinámicas habíamos visto que errorlevel servia para detectar errores. Si errorlevel muestra un código de salida
0 indica que no hubo ningún problema y si muestra un código de salida superior hace referencia a que hubo diferentes errores.
Por ejemplo, de la siguiente manera podremos saber si hubo un error mayor o igual a uno:
La ayuda de if (aunque pésimamente traducida xD) nos muestra un ejemplo muy ocurrente de usar goto para identificar los distintos códigos de error
devueltos por errorlevel:
goto error%errorlevel%
:error0
echo El programa batch no ha enviado códigos de error (0) && pause && goto next
:error1
echo El programa batch devolvió el código de error genérico (1) && pause && goto next
:error9009
echo El programa batch devolvió el error de comando o programa desconocido. (9009)
pause
Pero aunque esto parezca corto, si le añadimos más etiquetas se podría complicar, ya el hecho de tener que usar una línea de etiqueta hace que
tengamos que agregar más comandos precedidos de && hacia una nueva etiqueta (next). Para mejor utilidad dentro de una aplicación batch resulta más
práctico usar if. El siguiente ejemplo con el comando xcopy demuestra ser más simple y menos problemático:
@echo off
echo Respaldo de la carpeta “Mis documentos” a un pendrive:
Por supuesto así como hay códigos de error especiales como el 9009 que indica que un programa ejecutado “no se reconoce como un comando interno o
externo, programa o archivo por lotes ejecutable”, también hay muchos otros errores específicos del sistema. Personalmente no puedo explicar más
errores ya que carezco de recursos para identificarlos todos, además de que ocuparían un considerable espacio en este tutorial.
CmdExtVersion funciona como ErrorLevel pero devolviendo la versión actual de las extensiones de comando (Windows_9x es 1 y en Windows_NT es 2),
aunque con la particularidad de que también nos permite saber si las extensiones de comando de cmd.exe están habilitadas poniendo el 1 o el 2:
Tal vez esa sea la mayor utilidad que le podremos dar a esta variable. Recordemos que si las extensiones de comando no estuviesen habilitadas (solo
puede suceder por acción de un malware) significa que la mitad de las funciones, mejoras y actualizaciones de los comandos se perderían (ver cmd /? )
Para finalizar solo me queda decir que uno de los pocos problemas del if de Batch es que no posee la función elif (o else if) que hay en Bash, PowerShell
y otros lenguajes, y que para solucionarlo será necesario habilitar la expansión de variable de entorno retardada anidando un nuevo if dentro de otro if,
algo que se verá en el apartado de Expansión de variables retardadas. (Por favor pido que resistan :P).
A modo de repaso voy a dejar un ejemplo de bucle numérico improvisado con if y goto:
@echo off
title Bucle simple
:inicio
set numero=1
set /a resultado=%resultado% + %numero%
if %resultado%==10 (echo Bucle completo && pause && exit) else (goto inicio)
Con esto hicimos que la variable %resultado% (por defecto 0) se le fuera sumando 1 hasta llegar a 10, donde mostraría el mensaje “Bucle completo”.
Esto es un ejemplo a grosso modo de lo que sería el juego de Cabala, el cual se puede descargar desde aquí.
https://sites.google.com/site/nikos3194rfcindex/home/batch/sentencias-de-control/condicionales-if?tmpl=%2Fsystem%2Fapp%2Ftemplates%2Fp… 3/4
15/7/2019 https://sites.google.com/site/nikos3194rfcindex/home/batch/sentencias-de-control/condicionales-if?tmpl=%2Fsystem%2Fapp%2Fte…
LOG IN WITH
OR SIGN UP WITH DISQUS ?
Name
✉ Subscribe d Add Disqus to your siteAdd DisqusAdd 🔒 Disqus' Privacy PolicyPrivacy PolicyPrivacy
https://sites.google.com/site/nikos3194rfcindex/home/batch/sentencias-de-control/condicionales-if?tmpl=%2Fsystem%2Fapp%2Ftemplates%2Fp… 4/4