viernes, 19 de diciembre de 2014

Ejercicios Simples

Con los comandos ya presentados podemos hacer un montón de cosas. Ahora jugaré un poco con ellos e inventaré algunas cosas, ¡a ver que tal sale!


Lo primero que se me vino a la mente son los ejercicios que nos hacen en informática cuando empiezas con Java. Son unos calculos matemático muy básico y a medida que avanzaos se les agrega más complejidad.

Partiré con la suma y resta:

   
        @Echo off
       
        REM Lo primero que se debe hacer para sumar o restar es crear una o más variables
        REM que guarden resultados o los dígitos a evaluar.
        REM El comando Set tiene permitido guardar y evaluar números enteros, hexadecimales y octales.
       
        Set numero_entero_1=128
        Set numero_entero_2=896
       
        REM Ahora necesitamos un comando que evalue y los sume.
        REM En este mismo comando "Set" tenemos un modificador ("/A") que nos permite hacer eso.
        REM Usaremos "Set /A" para realizar la evaluacón, pero la guardaremos en otra variable.
       
        Set /A suma=%numero_entero_1% + %numero_entero_2%
        Set /A resta=%numero_entero_1% - %numero_entero_2%
       

        REM Ya tenemos la suma y resta de 128 y 896, pero necesitamos un comando que los saque por pantalla.
        REM Aquí entra "Echo" y "Pause". Este último es para que la consola no se cierre luego de completar la acción.
       
        Echo La suma de %numero_entero_1% y %numero_entero_2% es : %suma%
        Echo. (Lo que hace "echo" aquí es un salto de línea, y solo poniendo un punto delante del comando lo hace)
        Echo La resta de %numero_entero_1% y %numero_entero_2% es: %resta%
        Pause
       
Para la multiplicación y división es lo mismo, pero encontramos una piedra de tope en la división ya que CMD trabaja sólo con números enteros.

        @Echo off
       
        REM Al igual que en el ejercicio anterior lo primero es crear las variables, pero esta vez harémos
        REM que el usuario ingrese los números a evaluar usando el modificador "/P" en Set.
       
        Set /P numero_entero_1=Ingresa el primero numero:
        Set /P numero_entero_2=Ingresa el segundo numero:
       
        REM Ahora los evaluamos usando "Set /A" nuevamente.
       
        Set /A multiplicacion=%numero_entero_1% * %numero_entero_2%
        Set /A division=%numero_entero_1% / %numero_entero_2%
       
        REM Nuevamente usaremos "Echo" para sacar los resultados en pantalla.
       
        Echo La multiplicacion de %numero_entero_1% y %numero_entero_2% es : %multiplicacion%
        Echo.
        Echo la division de %numero_entero_1% y %numero_entero_2% es : %division%
        Pause
       
    Nota: A causa de la limitación de CMD al dividir, éste sólo nos mostrará el valor entero.
        Ejemplo: "1000 / 14 = 74,42" y la consola nos mostrará "1000 / 14 = 74"
       
Existen algunas formas de hacer que se muestren algunos decimales por ejemplos esta:

        @Echo off
        MODE con cols=46 lines=20
        Title Division
        :Inicio
        Echo numero 1:
        Set /P num1=
        Set decimales=%num1%
        Echo numero 2:
        Set /P num2=
        Set decimales2=%num2%

        REM Desglosado
        Echo.
        Echo.

        Set /A entero=%num1%/%num2%
        Set /A decimales*=10000
        Set /A decimales2*=100
        Set /A decimal=%decimales%/%decimales2%
        For /F "tokens=* delims=%entero%" %%a IN ("%decimal%") DO (
        Set decimal2=%%a
        )
        Echo Entero=%entero%
        Echo Decimal=%decimal2%
        Echo.
        Echo
Resultado: %entero%,%decimal2%
       
    Nota: Esta forma funciona sólo con numeros enteros positivos. Además solo puede ser la division de un número mayor por uno menos.
          A base de esto se puede mejorar mucho el código. Simplemente lo que hace es "agrandar" los números para poder tener más dígitos positivos
          y así poder trabajar con ellos pasándolos a decimales.
         
Otros ejercicios sin evaluaciones matemáticas podrían ser relacionados al mismo sistema operativo:

        @Echo off & Title Buscador de objetos
        Setlocal enabledelayedexpansioin
        :Inicio
        Cls
        CD
%userprofile%
        For /D %%a IN (*) DO (Echo %%a)
        Echo --------------------- Directorios disponibles---------------------
        Echo.
        Echo.
        Echo
Escriba el directorio que desee recorrer:
        Set /P opcion=
        CD %opcion%
        If %errorlevel%==1 Goto Inicio
        Echo.
        Echo
Escriba la extension de el(los) archivo(s) a buscar:
        Set /P opcion2=
        Echo.
        Set
count=0
        For /R %%b IN (*.%opcion2%) DO (
        Set encontrado=%%b
        For /F "tokens=3-13 delims=\" %%c IN ("%%b") DO (
        Set encontrados=%%c   %%d   %%f   %%g   %%h   %%i   %%j   %%k   %%l 
        )
        Call:Funcion_1
        )
        Echo Total archivos encontrados:%count%
        Pause
        Goto
Inicio

        :Funcion_1
        Echo Encontrado: %encontrados%
        Set /A count=%count%+1
       
Ahora al revez, primero digo lo que el programa debe mostrar y luego doy el código que lo realiza.
       
        -Programa que lea dos números ingresados por el usuario y muestre por pantalla el mayor de ambos.
        -Programa que lea tres números ingresados por el usuario y muestre el menor de los tres.
        -Programa que lea 5 números ingresados por el usuario y muestre los que son pares.
        -Programa que muestra la tabla de multiplicar hasta 10 de un número ingresado por el usuario.
        -Programa que muestre por pantalla el mensaje escrito por el usuario con la respectiva fecha y hora.

       
        NOTA: Todo se puede realizar con los comandos básico ya mencionados.
              ¡Respuestas en el próximo post!

martes, 16 de diciembre de 2014

Presentación en Batch


Al momento hacer un programa la presentación del mismo es importante ya que si lo usamos a menudo y lo dejamos siendo solo un montón de comandos se volverá tosco y enredado a la vista.
Como bien sabemos, CMD no tiene muchas formas ni herramientas para "adornarlo" o mejorarlo visualmente, pero con un poco de imaginación se pueden lograr algunos cambios.

Pondremos en practica los comando básicos ya mencionados en otros post y jugaremos un poco con ellos para ver si sale algo interesante.

Antes de empezar me gustaría poner la leyenda de los colores usados en palabras explícitas.

    Leyenda:
            Palabras color Amarillo=Palabras Claves
            Palabras color Azul Claro=Variables
            Palabras color Verde=Comentarios
            Signos en color Verde Claro=Simbología operacional
            Palabras color Naranjo sobre Café=Etiquetas
            Palabras color Morado Claro=Comandos

Existe un comando en CMD que nos permite cambiar los colores de los caracteres en pantalla y del fondo.
El comando es "Color" y es muy fácil de usar.

        Sintáxis:
                Color [opción de colores]
                   
                    Opciones:
                            0 = Negro       8 = Gris
                            1 = Azul        9 = Azul claro
                            2 = Verde       A = Verde claro
                            3 = Aguamarina  B = Aguamarina claro
                            4 = Rojo        C = Rojo claro
                            5 = Púrpura     D = Púrpura claro
                            6 = Amarillo    E = Amarillo claro
                            7 = Blanco      F = Blanco brillante
                           
                Ejemplo: Color 0B  (Así lo tengo yo por defecto)

Hay otra forma de cambiar el color de los caracteres y por separado. El problema de este código es que hace más lenta la ejecución de los comandos.
El autor de esta función es desconocido.


        REM
        Set /P ".=Este texto se imprime antes del primero de color " <nul
        Call :ColorText 0A "Este es el texto con color Verde"
        Set /P ".= Este texto va en medio de los dos texto de color " <nul
        Call :ColorText 0C "Este es el texto con color rojo" end
        Echo. Y esto es el texto despus de los textos de color.
        Echo.
        Pause
        Exit

        REM Esta es la función que convierte el texto a color.
        REM Se recomienda no modificarla y no convertirá más los textos.
        :ColorText [%1 = Color] [%2 = Text]
        Set /P ".=.">"%~2"<nul
        Findstr /V /A:%1 /R "^$" "%~2" nul 2>nul
        Set /P ".=   "<nul
        If "%3"=="end" Set /P ".= "<nul
        Del "%~2">nul 2>nul
        Exit /b
       
    Explicaré un poco esta función para aquellos que quieran darse el trabajo de programar algo usándola.
   
    Los comandos que se usan aquí son:
                                    Set (Explicado en un post anterior)
                                    Call (Explicado en un post anterior)
                                    Echo (Explicado en un post anterior)
                                    Pause = Este comando hace una pausa en la ejecución de comandos hasta que el usuario presione una tecla.
                                    Exit = Este comando cierra la CMD, pero si está habilitado el modificador "/B" solo termina una instrucción.
                                    Etiqueta ":ColorText" (Explicado en un post anterior)
                                    Findstr (Buscador avanzado de archivos u objetos)
                                    If (Explicado en un post anterior)
                                    Del = Comando que elimina un o más archivos indicados por el usuario mediante una ruta.
                                   
    La función mostrada arriba es algo compleja de explicar para aquellos que recién se insertan en Batch, así que intentaré explayarme lo mejor posible.
   
    Voy a referirme a esta función como "Colorear".
    Lo primero que hace es capturar con "Set /P" los textos que serán impresos con el color DEFAULT de la consola y con "Call:ColorText" los que van a ser coloreados.
    Como se puede apreciar después de "Call:ColorText" va un código Hexadecimal por ejemplo "0A" que sería el color Verde según la tabla de color ya mencionada.
    Otro punto a destacar es que luego de la última frase, palabra, caracter o letra que va a ser pintado viene un agregado que dice "end", bueno, esto hace que la función se detenga y no siga conviertiendo a color.
    En la etiqueta ":ColorText" se ve que hay un contenido dentro de paréntesis de corchete, y es porque a la etiqueta se le han añadido don variables (%1 que es el color en este caso y %2 que es el texto), las cuales adquieren los datos desde la misma etiqueta.
    El comando Findstr busca con "/V" que no coincidan, luego adquiere los colores en Hexadecimal de la variable "%1" y con "/R" añade la búsqueda por expresiones regulares (opciones) para capturar el inicio(^) y final($) de la línea en el texto "%2".
    El comando "If" compara una tercera variable deducible por la consola (%3) la cual busca si existe "end" en el texto para dar el termino a la función. Con el comando "Del" se borra el archivo en donde guarda información la(s) variable(s), y este se crea en el directorio donde fue abierta la aplicación.
    Por último se usa el comando "Exit /B" para volver a la línea de instrucciones que estaba antes de ser llamada la función.
   

Existen programas apartes que se pueden ejecutar como comandos en la consola. Uno de ellos es Colous.exe y es el más usado en el ambiente gráfico de CMD.
No puedo poner links ni nada por el estilo. Lo que sí puedo hacer es mencionar a la persona que creó aquel programa, y su nombre es "Bolivianito" al cual se le agradece mucho darse el trabajo de seguir actualizando tal herramienta.


        Ejemplos de consolas modificadas mediante comandos:
               
Bandera Chile
Uso de la función "colorear" (Click para ver imagen en grande)

CMD se ha vuelto loca!
Uso de comandos simples. (Locura)

lunes, 15 de diciembre de 2014

Funciones y Variables importantes (Básicas)

La consola de comandos de Windows posee una gran variedad de funciones y utilidades dentro el sistema.
Batch no es considerado un lenguaje de programación ya que solo consiste en línea de ordenes que se pueden ejecutar en solo este sistema operativo.
A pesar de todo logra llevar a cabo grandes funciones.

A mi parecer la imaginación es muy importante, ya sea en un lenguaje de programación como Java, C, C# o en Batch.


Para comenzar con las funciones debo primero mencionar que los archivos por lotes ejecutados con la consola de Windows son muy limitados y sensibles en cuanto a simbología, tamaños, etc, por lo que a veces se hace difícil la tarea de llevar a cabo un programa y es aquí cuando entra la imaginación a juego.

Variables:
    Existen muchas variables en Windows tanto internas de la consola como del Sistema operativo en sí llamadas variables de entorno.
    Las variables que se tienen en el sistema operativo se pueden observar en:

        1.- "Equipo/Propiedades/Configuración avanzada del sistema/Variables de entorno"
        2.- "Abrimos "ejecutar" presionando la tecla Windows + R juntas y escribimos "systempropertiesadvanced.exe" y damos Enter"
        3.- "Mediante la consola de comandos escribimos el comando "Set" y presionamos Enter.


Listado de algunas variables de entorno:
    ALLUSERSPROFILE=C:\ProgramData
    APPDATA=C:\Users\[Nombre usuario]\AppData\Roaming
    CommonProgramFiles=C:\Program Files\Common Files
    CommonProgramFiles(x86)=C:\Program Files (x86)\Common Files
    CommonProgramW6432=C:\Program Files\Common Files
    COMPUTERNAME=[Nombre del PC]
    ComSpec=C:\Windows\system32\cmd.exe
    FP_NO_HOST_CHECK=NO
    HOMEDRIVE=C:
    HOMEPATH=\Users\[Nombre usuario]
    JAVA_HOME=C:\Program Files\Java\jre1.8.0_25\bin
    LOCALAPPDATA=C:\Users\[Nombre usuario]\AppData\Local
    LOGONSERVER=\\[Nombredel PC]-PC
    NUMBER_OF_PROCESSORS=8 (Varia según tu procesador)
    OS=Windows_NT
    Path=C:\ProgramData\Oracle\Java\javapath;C:\Program Files\Common Files\Microsoft Shared\Windows Live;C:\Program Files (x86)\Common Files\Microsoft Shared\Windows Live;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\Windows Live\Shared
    PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC
    PROCESSOR_ARCHITECTURE=AMD64
    PROCESSOR_IDENTIFIER=AMD64 Family 21 Model 2 Stepping 0, AuthenticAMD
    PROCESSOR_LEVEL=21
    PROCESSOR_REVISION=0200
    ProgramData=C:\ProgramData
    ProgramFiles=C:\Program Files
    ProgramFiles(x86)=C:\Program Files (x86)
    ProgramW6432=C:\Program Files
    PROMPT=$P$G
    PSModulePath=C:\Windows\system32\WindowsPowerShell\v1.0\Modules\
    PUBLIC=C:\Users\Public
    SESSIONNAME=Console
    SystemDrive=C:
    SystemRoot=C:\Windows
    TEMP=C:\Users\[Nombre usuario]\AppData\Local\Temp
    TMP=C:\Users\[Nombre usuario]\AppData\Local\Temp
    USERDOMAIN=[Nombredel PC]
    USERNAME=[Nombre usuario]
    USERPROFILE=C:\Users\[Nombre usuario]
    windir=C:\Windows
   
Otras variables:
    Time=Muestra la hora del sistema.
    Date=Muestra la fecha del sistema.
    Random=Muestra un número al azar entre 0 y 32767.
    CD=Ruta actual. (Si se ejecuta desde la consola arrojará el contenido de %UserProfile%)
    ErrorLevel=Muestra el nivel de error actual.
    CmdExtVersion=Muestra en qué estado de extensión está la consola (apagado o encendido)

Modificadores de consola:
    MODE:
        Este pseudo comando tiene varias funciones, pero la mayoría son para usuario avanzados por lo que nos centraremos en dos.
        MODE CON COLS=[Número de columnas] LINES=[Número de líneas] (Modifica la ventana de la consola)
        MODE CON RATE=[Velocidad del teclado] DELAY=[retraso antes de escribir]

    Title: Asigna un título a la ventana de la consola.

    Setlocal:
        Este se divide en dos opciones.
        "Setlocal enableextensions / disableextensions" que habilitan o deshabilitan las extensiones en la consola.
        "Setlocal enabledelayedexpansion / disabledelayedexpansion" que habilitan o deshabilitan las expansiones de las variable de entorno.

Funciones básicas:
    EOF= End of file. Termina un llamado de comando dentro de la consola.
    EOL= End of line. Indica el término de la función de un comando.
    CLS= Limpia la pantalla.
    CALL= Llama un comando o variable externo o interno en la consola actual y lo ejecuta, por decirlo de alguna manera, en segundo plano.
    Goto= Es muy parecido al comando "Call". Va a una etiqueta o variable designada por el usuario.
   
    Etiquetas:
        Las etiquetas se designan de la siguiente forma.
        [:NombreDeEtiqueta]

    El ejemplo más visto en internet de las etiquetas es algo así:
       
        @Echo off & CLS
        :Inicio
        Echo Hola, soy Codex y me gustan las manzanas. (Verdadero/Falso)
        Set /P respuesta=
        If %respuesta%==verdadero Call:Funcion_1
        If %respuesta%==falso Call:Funcion_2
        If NOT DEFINED %respuesta%  Goto Inicio
        Exit
        :Funcion_1
        Echo Si! Felicidades!
        GOTO:EOF
        :Funcion_2
        Echo Te haz equivocado, me gustan mucho las manzanas.
        GOTO:EOF

Introducción a programar en Bacth

Comandos básicos en Batch



Echo:
    El comando más conocido dentro del área de la consola de Windows es "echo" y su función es muy simple, imprimir en algo en la consola.

    Se me pueden dar otros usos, como por ejemplo Exportar un resultado a un archivo de texto.


Su sintáxis es la siguiente:
    Echo ["texto",%variable%]
    Echo off: Deshabilita el eco en la consola evitando mostrar el proceso de cada comando.
Para guardar el contenido en un texto plano se usa la siguiente sintáxis:
    Echo hola, ¿como estas?>[ruta,nombre archivo,extension(opcional)]

Ejemplos:
    Echo Esto es un texto normal.
    Echo La hora actual es: %time%.
    Echo Resultado de una variable>%userprofile%\Resultado.txt
  -------------------------------------------------------------------------------------------------------------------------------------

Set:
    El comando "set" es otro comando muy utilizado y es vital para programar en Batch.
    Su función es guardar algo (variable, numeros, caracteres, etc) en una variable, la cual podemos usar, modificar o eliminar a nuestro antojo.
    El comando "set" posee dos modificadores: "/A" que se usa para realizar evaluaciones matemáticas como sumar, restar, etc ; "/P" que se ultiliza para el ingreso de texto mediante el teclado.

Su sintáxis es la siguiente:
    Set [modificador, nombre de variable,signo "=", valor de variable]
   
Ejemplos:
    Set NumDeManzanas=1
    Set /A NumDeManzanas=%NumDeManzanas%+1 (El restultado es 2)
    Set /P Resultado=Cuantas manzanas hay?:

    NOTA: Cuando se usa el modificador "/P" es opcional agregar un texto luego de la variable.
        Ejemplo: Set /P Resultado=
             Set /P Resultado=[texto opcional]
    Ambas formas funcionan sin dar error.

-------------------------------------------------------------------------------------------------------------------------------------

If:
    El comando "If" es utilizado para realizar comparaciones, ya sea de variables, numeros o caracteres.
    A este comando se le pueden añadir varias funciones por medios de modificadores y es muy completo.
    "If" es utlizado también para la comprobación de archivos lo cual es muy útil al momento de programar algunas cosas.

    Los modificadores al comando son: "/I" que compara omitiendo mayúsculas y minúsculas; "NOT" hace que funcione el comando si la condición es falsa; "EXIST" Comprueba la existencia de un archivo.
   
    Operadores de comparación:
                EQU - igual (Se puede utilizar también "==")
                NEQ - no igual
                LSS - menor que
                LEQ - menor que o igual
                GTR - mayor que
                GEQ - mayor que o igual

Su sintáxis es la siguiente:
    Comparación de variables
    If [variable, operador de comparacion, variable, comando a realizar si se cumple la comparación]

    Comprobación de archivos
    If [modificador Exist, ruta, comando a realizar si se comple el requisito]

Ejemplos:
    If %NumDeManzanas% == %NumDeNaranjas% Echo Hay la misma cantidad de Manzanas que de Naranjas.
    If %NumDeManzanas% GTR 3 Echo Tienes muchas manzanas, me regalas una?
    If Exist C:\Windows Echo Tienes el sistema operativo Windows instalado.
    If NOT Exist C:\Windows Echo No tienes el sistema operativo Windows instalado.
--------------------------------------------------------------------------------------------------------------------------------------

For:
    El comando "For" es uno de los comandos más útiles y completos de Batch y por lo que he visto en la red es uno de los que más le cuesta usar a la gente.
    Este comando realiza una dicha cantidad de tareas según se requiera, desde recorrer un directorio buscando un archivo hasta hacer una bucle con otro "For", entre otras cosas.

    Los modificadores de "For" son los siguientes: "/D" recorre directorios dados por nosotros; "/R" recorre desde el directorio dado por nosotros hasta la última carpeta dentro del mismo ordenadamente;
    "/L" forma un ciclo de sucesiones numéricas; "/F" recorre un archivo o variable, lo abre y lo lee, mostrando la primera línea o palabra de contenido. A este modificador se le pueden agregar más funciones (opciones):
   
    eol:      Se asigna un caracter (solo uno) para seperar lo que es comentario del texto a utilizar.

    skip:     Asigna el número de línea que el comando se saltará antes de leer el contenido.

    delims:   Asigna delimitadores para separar el contenido.

    tokens:   En esta opción se especifica que parte del contenido queremos mostrar seleccionando la "posición" del mismo a la vez que son guardador en variables alfabéticas.

    usebackq  Esta opción es algo extraña para mi. Lo que hace es cambiar la simbología del ingreso de comandos, ruta, texto. (Es la forma en que reconoce esas entradas)
            Ejemplo: Para ingresar la búsqueda en un comando se utiliza las comillas simples ('comando') y con esta opción queda así (`comando`)
                 Para ingresar la búsqueda en un archivo se utiliza solo los paréntesis (nombre de archivo) y con esta opción queda así ("nombre archivo")
                 Para ingresar la búsqueda en un texto se ultiliza las doble comillas ("texto") y con esta opción queda así ('texto')
                Es algo extraño, por lo menos para mi, que exista esta opción.

Su sintáxis es la siguiente:
    Normal
    For [variable de una letra anteponiendo % (%a), IN, (conjunto o listado de archivos), DO, comando a realizar en el conjunto]

    Modificadores
    For [/D, variable de una letra anteponiendo % (%a), IN, (conjunto o listado de directorios), DO, (comando a realizar en el conjunto)]
    For [/R, Ruta, variable de una letra anteponiendo % (%a), IN, (conjunto o listado de archivos), DO, (comando a realizar en el conjunto)]
    For [/L, variable de una letra anteponiendo % (%a), IN, (número de inicio, aumento o disminución, número final), DO, (comando a ralizar en cada aumento o disminución)]
    For [/F, opciónes, variable de una letra anteponiendo % (%a), IN, ('comando', archivo, o "texto"), DO, (comando a realizar)]

Ejemplos:
    For %a IN (primero segundo tercero cuarto) DO (Echo Este es %a contenido)

    For /D %a IN (mu*) DO (Echo Los directorios que empiecen con "mu" en esta ruta son los siguientes: %a)
    For /R %tmp% %a IN (*.txt) DO (Echo usted tiene los siguientes archivos de texto en esta ruta: %a)
    For /L %a IN (1,1,100) DO (Echo Mira, se contar hasta 100: %a)

    For /F %a IN ("%time%") DO (Echo La hora es :%a)
    For /F "eol=x" %a IN ("Contenido x Comentario") DO (Echo %a)
    For /F "tokens=1-7,10* delims=" %a IN ("Hola, soy Codex y me gustan las peras o las manzanas") DO (Echo %a %b %c %d %e %f %g %h %i)

    Nota: Para guardar el contenido del "For" en una variable en un archivo por lotes (".Bat", ".Cmd" o ".Com") se usa doble %. Ejemplo: %%a, %%b, %%c, etc.