OpenWebinars

Redes y Sistemas

Shell Scripting en Sistemas Windows

Descubre qué es el Shell Scripting en Windows, cómo utilizarlo y todo lo necesario par comenzar a aprovechar todas las ventajas que nos ofrece.

Jerson Martínez

Jerson Martínez

Experto DevOps

Lectura 7 minutos

Publicado el 9 de octubre de 2020

Compartir

Qué es Shell Scripting

Uno de los componentes software más importantes e incrustados en un sistema operativo, es la terminal o consola. Un tipo de maquinaria central donde se pueden ejecutar instrucciones que el sistema entiende y puede realizar. Proporcionando la capacidad de desplegar soluciones a muchas incógnitas que se presentan a diario en entornos informáticos.

Todas estas instrucciones que se le pasan al sistema por medio de comandos, puedes agruparlas en un fichero o archivo, permitiendo así, ejecutar un conjunto de órdenes para que las realice paso a paso de forma procedural. Esto te brinda cierta automatización sobre tus tareas.

El Shell Scripting requiere de tener un intérprete de comandos en el sistema, que es el que se encarga de dar lectura a tus instrucciones, verificar las ordenes y ejecutarlas ordenadamente.

Todo aquel dispositivo informático que tenga un sistema operativo, es bien visto de tener una terminal, bien puede ser de los más conocidos y usados como los de las familias Apple o GNU/Linux con su intérprete de comandos Shell Script Bash, del mismo modo, los sistemas operativos de la familia Microsoft Windows, tienen su propio intérprete de comandos llamado Shell Script Batch. En este artículo, abordaremos a profundidad sobre este último.

Si deseas capacitarte también en la terminal de GNU/Linux, te recomiendo iniciarte en el curso de Shell en Linux.

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

Shell Scripting en Sistemas Windows

El término se utiliza de forma más general para significar el modo automatizado de correr un shell de sistema operativo; en sistemas operativos concretos se denominan de otra forma como archivos de lote o batch files (desde MS-DOS en Windows 95, OS/2 y Windows NT).

En Windows existen diferentes intérpretes de comandos de forma nativa, entre ellos mencionar los más usados: Visual Basic Script (VBS), CMD o símbolo del sistema y el más popular a día de hoy PowerShell.

Todos los anteriormente mencionados, opcionalmente con interfaz de consola, con posibilidad de lectura, escritura y ejecución secuencial de instrucciones de comandos.

Procesamiento por lotes

Se refiere a Batch Processing, en español, procesando Batch o modo Batch, a la ejecución de un programa sin el control o supervisión directa del usuario, a este se le denomina procesamiento interactivo. Estos programas se caracterizan porque su ejecución no precisa ningún tipo de interacción con el usuario.

Generalmente, este tipo de ejecución se utiliza en tareas repetitivas sobre grandes conjuntos de datos, ya que sería tedioso y propenso a errores realizarlo manualmente. Estos programas que se ejecutan por lotes, suelen especificar su funcionamiento mediante scripts o guiones (procedimientos), que son las instrucciones que comentaba, en los que se indica qué se quiere ejecutar y, posiblemente, qué tipo de recursos necesita reservar.

Interfaz de línea de comandos (CLI)

Interfaz de línea de órdenes (en inglés, Command-Line Interface, CLI) es un método que permite a los usuarios dar instrucciones a algún programa informático por medio de una línea de texto simple. Los conceptos de CLI, Shell o emulador de terminal, no son lo mismo, ya que CLI es un método, mientras que Shell o terminal son programas informáticos. Sin embargo, suelen utilizarse como sinónimos.

Las CLI pueden emplearse interactivamente, escribiendo instrucciones en alguna especie de entrada de texto, o pueden utilizarse de una forma más automatizada (archivo Batch), leyendo órdenes desde un fichero de scripts. Estamos casi listos por empezar una estupenda travesía.

La CLI existe desde los comienzos de la computación, superada en la antigüedad solo por las tarjetas perforadas (es una lámina hecha de cartulina que contiene información en forma de perforaciones según un código binario) y mecanismos similares. Existen para diversos programas y OS, para diverso hardware y con distinta funcionalidad.

La contraparte de CLI es la interfaz gráfica de usuario (GUI), que ofrece una estética mejorada y una mayor simplificación, a costa de un mayor consumo de recursos computacionales, y, en general, de una reducción de la funcionalidad alcanzable. Asimismo, aparece el problema de una mayor vulnerabilidad dada su complejidad.

Su funcionamiento es muy sencillo, una CLI consiste en un espacio donde se pueden escribir órdenes (por lo general señalado como PROMPT). El usuario teclea una orden, si es el caso, se le podrían agregar parámetros a la orden y aplicar su ejecución con un Enter. De esta manera, el intérprete analizará la secuencia de caracteres y procederá a mostrar resultados.

A continuación, se muestra una imagen de la terminal (CMD o símbolo del sistema) de Windows 10, utilizando Windows Terminal.

Windows Terminal

¿Qué es lo que podría hacer con Shell Scripting?

✔ Desde instrucciones básicas de consola hasta avanzadas.

✔ Rutas de acceso; gestión de directorios y ficheros; Manejo de Instancias; máscaras y comodines.

✔ Gestión del PROMPT, teclas de funciones de la consola, tuberías, direccionamiento y desvío de comandos.

✔ Manejo de variables, manejo de cadenas; buscar, ubicar y comparar archivos.

✔ Compresión y expansión de ficheros, ordenar datos.

✔ Asignación de permisos, vínculos simbólicos.

✔ Información del sistema, apagar, reiniciar y cerrar sesión.

✔ Gestión de usuarios, procesos y de red.

✔ Escritorio remoto y programador de tareas.

✔ Gestión de servicios FTP, DNS y DHCP.

✔ Bitlocker, etiqueta de discos, unidades virtuales y optimización.

✔ Restaurar información y examinar integridad de los datos.

✔ Gestión de Backups y credenciales del sistema.

✔ Seguridad, gestión de servicios y configuración de energía.

✔ Control de tiempo, Windows To Go y Administración de Windows por medio de WMIC.

✔ Registros, CURL y SHELL.

Estas mencionadas, son solo algunas de las cosas que puedes lograr aprendiendo Shell Scripting en Sistemas Windows.

Por otro lado, si deseas conocer la contraparte de Batch, a lo que se refiere a Bash, recomiendo enteramente, iniciarte en el curso de bash scripting y automatización de procesos.

Comandos básicos

La forma de empezar con lo divertido, es, por supuesto, dándole una probada a varios comandos básicos y de uso frecuente.

Comando Descripción
✔ TITLE Fija el título de la ventana en la ventana del símbolo del sistema.
✔ HELP Proporciona información de ayuda para los comandos de Windows.
✔ CLS Borra la pantalla.
✔ DIR Muestra la lista de subdirectorios y archivos de un directorio.
✔ ECHO Muestra mensajes o activa y desactiva el eco del comando.
✔ PAUSE Suspende el proceso de un programa por lotes y muestra el mensaje: Presione una tecla para continuar…
✔ START Inicia una ventana separada para ejecutar un programa o comando especificado.
✔ REM Registra los comentarios en un archivo por lotes o en CONFIG.SYS.
✔ DATE Muestra o establece la fecha.
✔ TIME Muestra o establece la hora del sistema.
✔ COLOR Configura los colores predeterminados de primer y segundo plano de la consola.
✔ MODE Configura los dispositivos de sistema.
✔ EXIT Abandona el programa CMD.EXE (intérprete de comandos) o el script por lotes actual.

Por ejemplo, si necesitas conocer la ayuda de comandos en el sistema, ejecuta HELP, no importa si es mayúsculas o minúsculas. Por otro lado, si deseas conocer información sobre un comando en específico, ejecutarás [comando] /? o HELP [comando].

> HELP /?

Resultado:

Proporciona información de ayuda para los comandos de Windows.

HELP [comando]
    comando - muestra información de ayuda del comando especificado.

Funcionamiento

Te muestro algunas formas de crear un archivo desde la consola de Windows.

echo. 2> PrimerFichero.txt

copy NUL SegundoFichero.txt

copy /y NUL TercerFichero.txt >NUL

type NUL > CuartoFichero.txt

REM. > QuintoFichero.txt

fsutil file createnew SextoFichero.txt 0

(CD. > SéptimoFichero.txt) 2> NUL

(ATTRIB -R > OctavoFichero.txt) > NUL

Break > NovenoFichero.txt

SET x=x > DécimoFichero.txt

SET PROMPT=%PROMPT% > PruebaAlterna.txt

Si deseas una extensa explicación al respecto sobre las formas de crear archivos o ficheros, te comparto el siguiente contenido multimedia.

Funciones interesantes

Mueve todos aquellos archivos .mp4 al directorio Video y luego que finalice, continua con los archivos cuya extensión .pdf al directorio PDF y asimismo con las demás instrucciones:

move *.mp4 Video && move *.pdf PDF && move *.txt Text && move *.png Picture

Muestra el nombre del OS:

systeminfo | findstr /C:"Nombre del sistema operativo"

Muestra las direcciones IPv4 de las interfaces de red existentes:

ipconfig | findstr /C:"Dirección IPv4"

Programar el apagado del equipo después de 1 minuto:

shutdown -s -t 60

Subir de privilegios a Administrador en una sesión de consola con usuario limitado:

runas /profile /env /user:Usuario\Administrador cmd

Escriba la contraseña para Usuario\Administrador:
Intentando iniciar cmd como usuario "Usuario\Administrador" ...

:: Para realizar correctamente esta acción, se deberá habilitar 
:: el usuario Administrador del sistema y agregarle una clave.

:: Esto corresponde a un capítulo superior sobre el aumento de privilegios.

Resincronización del tiempo:

:: Iniciamos el servicio de Windows sobre la configuración del tiempo.
net start w32time

:: Se verifica el estado
w32tm /query /peers

:: Realizando resincronización del tiempo en el sistema local.
:: El protocolo que se está usando es NTP o Network Time Protocol
w32tm /resync /nowait

Crear un archivo con el mismo nombre de usuario del sistema:

echo > %username%.txt

Crear un archivo con el mismo nombre de la fecha actual del sistema

echo > %date%.txt
:: Esto no es funcional (Ya que el formato de fecha es: 00/00/00). 
:: No se pueden crear archivos con plecas. Así que hay que escaparlas.

type con >> new_file_%date:/=_%.txt

Cambiar el estilo del PROMPT:

setx PROMPT "$_$e[0;1;44mN$e[1;30;47mI$e[0;1;44mC$E[35;40m $d$s$t$h$h$h$h$h$h$_$E[1;33;40m$p$_$E[0;0m~$g$s"

Remover directorios vacíos de forma recursiva:

for /f "delims=" %i in ('dir /s /b /ad ^| sort /r') do rd "%i" 2>NUL

Matar procesos que no responden:

taskkill /f /fi "status eq Not Responding"

Añadir una IP dinámica o estática en la interfaz de red Wi-Fi:

REM Añadiendo IP estática.
netsh interface ip set address name="Wifi" source=static addr=192.168.0.2 mask=255.255.255.0 gateway=192.168.0.1 gwmetric=1

REM Añadiendo IP dinámica, por DHCP.
Netsh interface ip set address name="Wifi" source=dhcp

Agregar DNS a la interfaz de red de preferencia:

netsh interface ipv4 add dns "Red1" 10.0.0.1
netsh interface ipv4 add dns "Red1" 10.0.0.3 index=2

De forma general, he colocado estos ejemplos, por supuesto, habrá más cosas impresionantes de lo que se pueda compartir al respecto. Sígueme un poco más.

Aplicación en Shell Script Batch

En esta práctica, muestro cómo crear y habilitar una red hospedada. Aímismo, proporcionar una interfaz por la cuál el usuario pueda interactuar, hasta le punto de poder deshabilitar/detener la red hospedada en el momento que considere oportuno.

Ejecución de CreateNetwork.bat - Windows Terminal

@echo off
    title Create Network
    setlocal EnableExtensions EnableDelayedExpansion

        :Arguments (

            if /i [%1]==[/?] ( 
                goto :ModeUse 
            )

            if /i [%1]==[-start] ( 
                call :startNetwork
                exit 
            )

            if /i [%1]==[-stop] ( 
                call :stopNetwork
                exit 
            )

            if not defined [%1] goto :Init

            call :stopNetwork
            call :setNetwork %1 %2
            call :startNetwork

            exit
        )

        :Init (
            call :getUserNetwork && cls            
            call :getPassNetwork "%network_name%"

            call :stopNetwork
            call :setNetwork "%network_name%" "%network_pass%"
            call :startNetwork

            echo.
            echo 1) New Network, 2) Stop Network and Close
            goto :Finished
        )

        ::::::::::::::::::::::::::::
        ::      Network Data      ::
        ::::::::::::::::::::::::::::
        :getUserNetwork (
            set /p network_name=Network Name: 

            if ["%network_name%"]==[""] (
                cls && call :getUserNetwork
            )

            exit /b 0
        )

        :getPassNetwork (
            call :PainText 0F "Network Name, "
            call :PainText 02 " %~1"
            echo.

            call :getMaskingPassword user_password "Network Key: "

            if ["%network_pass%"]==[""] (
                cls && call :getPassNetwork "%~1"
            ) else (
                call :getSizeString "%network_pass%"                
            )

            if %CountString% LSS 8 (
                call :PainText 04 "Enter a password with at least 8 digits"
                timeout /t 10
                cls && call :getPassNetwork "%~1"
            )

            exit /b 0
        )

        :::::::::::::::::::::::::::::
        ::       Size String       ::
        :::::::::::::::::::::::::::::
        :getSizeString (
            set String=%~1
            set /a "CountString=0"

            call :getSizeStringLoop

            exit /b 0
        )

        :getSizeStringLoop (
            set "String=%String:~1%"
            set /a "CountString+=1"

            if defined String (
                goto :getSizeStringLoop
            )

            exit /b 0
        )

        ::::::::::::::::::::::::::::::
        ::     Masking Password     ::
        ::::::::::::::::::::::::::::::
        :getMaskingPassword (
            set "network_pass="

            for /f %%a in ('"prompt;$H&for %%b in (0) do rem"') do (
                set "BS=%%a"
            )

            set /p "=%~2" < nul 
        )

        :getMaskingKeyLoop (
            set "key="

            for /f "delims=" %%a in ('xcopy /l /w "%~f0" "%~f0" 2^>nul') do (
                if not defined key (
                    set "key=%%a"
                )
            )

            set "key=%key:~-1%"

            if defined key (
                if "%key%"=="%BS%" (
                    if defined network_pass (
                        set "network_pass=%network_pass:~0,-1%"
                        set /P "=!BS! !BS!" < nul
                    )
                ) else (
                    set "network_pass=%network_pass%%key%"
                    set /p "=*" < nul
                )

                goto :getMaskingKeyLoop
            )

            echo/
            set "%~1=%network_pass%"
            goto :eof
        )

        :::::::::::::::::::::::::::::::
        ::   Create Hosted Network   ::
        :::::::::::::::::::::::::::::::
        :setNetwork (
            call :PainText 09 "Hosted Network Setting"
            netsh wlan set hostednetwork mode=allow ssid="%~1" key="%~2" > nul
            call :PainText 02 " [Done]"
            echo.

            exit /b 0
        )

        :startNetwork (
            call :PainText 02 "Network Starting"
            netsh wlan start hostednetwork > nul
            call :PainText 02 "       [Done]"
            echo.

            exit /b 0
        )

        :stopNetwork (
            call :PainText 0e "Hosted Network Stoping"
            netsh wlan stop hostednetwork > nul
            call :PainText 02 " [Done]"
            echo.

            exit /b 0
        )

        :PainText (
            for /f "tokens=1,2 delims=#" %%a in ('"prompt #$H#$E# & echo on & for %%b in (1) do rem"') do (
                set "DEL=%%a"
            )

            <nul set /p ".=%DEL%" > "%~2"
            findstr /v /a:%1 /R "^$" "%~2" nul
            del "%~2" > nul 2>&1

            exit /b 0
        )

        :ModeUse (
            echo Mode Use to Create Network correctly
            echo Command: [CreateNetwork] 
            echo Arguments: 
            echo -- First parameter: [-stop (Network Stop)], [Network User] 
            echo -- Second Parameter: [Network Key]
            echo.
            echo Example: 
            echo -- CreateNetwork "My first network" "My secure key"
            echo.
            echo Author: 
            call :PainText 0e "-- Jerson A. Martinez M. (Side Master - Core Stack)"
            echo.
            exit
        )

        :Finished (
            set /p selection=Waiting answer: 

            if [%selection%]==[] (
                goto :Finished
            )

            if %selection% EQU 1 (
                goto :Init
            )

            if %selection% EQU 2 (
                call :stopNetwork
            )
            exit
        )

    endlocal
exit

Implementación

Implementación de CreateNetwork.bat - Windows Terminal

CreateNetwork [-stop , -start] [network user] [network pass] o bien, sólo hacer doble clic en el script CreateNetwork.bat

CreateNetwork -start NetworkName MyPassword

Para explicar un poco de que va este algoritmo escrito en Batch, comenzaré comentando la logística sobre algunas funciones que se están usando para que se lleve a cabo de inicio a fin el proceso de creación de la red hospedada.

La función Arguments, que recibe por parámetro la acción de detener un iniciar una red hospedada. En el caso de que no se pasen parámetros, se ejecutará como si hubiesen hecho doble clic en el script y pasará a solicitar los datos mediante el PROMPT.

La función Init inicializa las funciones de la aplicación para solicitar los datos y configurar la red hospedada.

El encargado de solicitar el nombre de la red es la función: getUserNetwork. Por otro lado, la contraseña se solicita por medio de la función: getPassNetwork. En este último, se ha agregado una característica interesante y es que la clave no es visible, por lo que se sustituyen por asteriscos, habilitando una máscara por medio de la función getMaskingPassword.

Las funciones más importantes, más allá de la estructura que pueda existir en el algoritmo con las llamadas: setNetwork, startNetwork y stopNetwork.

Establecer una red hospedada

netsh wlan set hostednetwork mode=allow ssid="NetworkName" key="NetworkPassword" > nul
netsh wlan start hostednetwork > nul

Acerca de algoritmos, este es uno de la inmensidad de los que existe y que puedes crear a partir de una idea para solucionar alguna cosa. Obviamente, como es de esperarse, nos quedamos corto de información, siempre habrá mucho que compartir.

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

Shell Scripting es un término general, que se ejecuta en diferentes entornos o sistemas operativos, estando también disponible en sistemas Windows y proponiendo características de un lenguaje interpretado, puesto en marcha para resolver cualquier actividad que no disponga de interfaz gráfica. Logramos discernir que ninguna CLI debe ser subestimada, como en los lenguajes de programación, no hay uno mejor que otro, ya que se tiene el mismo fin, solucionar un problema en específico y en dependencia del entorno, se selecciona uno que otro. En Windows, siempre tendremos disponible el CMD o Símbolo del sistema que ejecutará las instrucciones que le indiquemos, además de tener la capacidad de ejecutar archivos por lotes para aplicar temas de automatización.

Por supuesto, amigo lector, tus comentarios siempre nos vienen bien, ya sea para debatir algún tema, retroalimentar y tratar, en cualquier caso, de mejorar en comunidad.

Compartir este post

También te puede interesar

Windows vs Linux
Blog

Windows vs Linux

Si quieres conocer las ventajas e inconvenientes y las principales características de estos dos sistemas operativos, te lo contamos en este artículo.

Angel Robledano
Icono de la tecnología
Curso

Curso de PowerShell

Principiante
1 h. y 46 min.

Aprende a utilizar PowerShell desde cero con este curso de PowerShell para principiantes y saca todo el potencial...

Manuel Fco Domínguez Tienda
4.4