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.
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.
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.
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.
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.
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.
✔ 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.
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.
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.
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.
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.
@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
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.
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.
También te puede interesar
Si quieres conocer las ventajas e inconvenientes y las principales características de estos dos sistemas operativos, te lo contamos en este artículo.
Aprende a utilizar PowerShell desde cero con este curso de PowerShell para principiantes y saca todo el potencial...
¿Quieres utilizar PowerShell de forma más avanzada? Con este curso de PowerShell para administradores dominarás el uso de...