Condicionales If

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 4

15/7/2019 https://sites.google.com/site/nikos3194rfcindex/home/batch/sentencias-de-control/condicionales-if?

tmpl=%2Fsystem%2Fapp%2Fte…

Home > Batch > 5.0 - Sentencias de control >


5.2 - Condicionales: If
La sentencia de control if es un condicional, ósea que establece una condición como: si esto se cumple, hace esto... y si no se cumple, hace esto otro. If
puede comparar cadenas, comprobar la existencia de archivos, hacer comparaciones matemáticas o reconocer valores de error entre muchas otras
cosas.

Según expresa la ayuda de if, sus principales funciones son las siguientes:

if cadena1==cadena2 (comando) / if not cadena1==cadena2 (comando)


if exist archivo (comando) / if not exist archivo (comando)
if errorlevel número (comando) / if not errorlevel número (comando)

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

Por ejemplo, una comparación de condición verdadera se da básicamente de la siguiente manera:

@echo off
title Preguntita

:inicio
set /p cuenta=Cuanto es 2+2 ?...

if %cuenta%==4 (goto bien) else (goto mal)

:bien
echo El resultado es correcto ;P
pause>nul
exit

:mal
echo El resultado es incorrecto. Vuelva a intentarlo.
goto inicio

Si analizamos el if veremos que la condición es:


if %variable%==X (una acción) else (otra acción)

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.

• Para establecer una desigualdad o diferencia se utiliza not de la siguiente manera:


if not %variable%==X acción

Veamos un ejemplo:

@echo off
title Redactor

echo Quien es el autor de este tutorial?


set /p var=

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

• Para hacer una comprobación de la existencia de un archivo se procede de la siguiente manera:

if exist archivo.jpg (del archivo.jpg) else (echo archivo.jpg no existe)


pause>nul

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

echo Listo!, presione una tecla para salir...


pause>nul

Más adelante estudiaremos el funcionamiento y la prevención de virus con más profundidad.

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:

set /P var=Ingrese una variable:


if not defined %var% (echo No ha ingresado una variable)

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…

• Comparaciones lógicas y aritméticas

Ahora bien, las comparaciones lógicas o aritméticas se forman de la siguiente manera:

if [/i] cadena1 opción cadena2 (comando)

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.

Ejemplo con números:

@echo off
title Menor o mayor de edad

echo Cuantos años tenes?


set /p edad=

if %edad% GEQ 18 goto mayor


if %edad% LEQ 18 goto menor

: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…

set /p var=pone un numero:

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=

if %contra% EQU admin (goto correcto) else (goto incorrecto)

: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:

if %contra%==admin (goto correcto) else (goto incorrecto)

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.

• Comparaciones con variables de entorno dinámicas

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:

if errorlevel GEQ 1 echo Hubo errores.

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:

xcopy "%HomeDrive%%HomePath%\Mis documentos" "E:\Backup"

if errorlevel 0 echo Los ficheros fueron copiados sin error.


if errorlevel 1 echo Hubo un error genérico o no se encontraron ficheros para copiar.
if errorlevel 2 echo El usuario presionó Ctrl+Pausa para suspender el proceso de Xcopy.
if errorlevel 3 echo Ocurrió un error de inicio en un comando. Puede no haber suficiente && echo memoria o espacio en el disco, o se utilizó un
if errorlevel 4 echo Ocurrió un error de escritura de disco.
if errorlevel 9009 echo El comando XCopy no existe o no se encuentra disponible.
pause>nul

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:

if cmdextversion 1 (echo Las extensiones de comando estan habilitadas) else (


echo Juston tenemos un problema…)

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

► Pasar al siguiente apartado.

▼ Please leave your comment here \(^o^)/

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…

1 Comment nikos3194 rfc index 


1 Login

 Recommend 2 t Tweet f Share Sort by Best

Join the discussion…

LOG IN WITH
OR SIGN UP WITH DISQUS ?

Name

tomy • a year ago


hola
△ ▽ • Reply • Share ›

✉ 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

También podría gustarte