Tag: Shell

Lanzar procesos en la consola de comandos de Windows

Si sueles realizar scripts .BAT para el intérprete de la consola de comandos de Windows, te habrás encontrado seguramente en la necesidad de lanzar procesos. Dependiendo de las necesidades que tengamos a la hora de lanzar esos procesos, diferenciaremos entre la necesidad de mantener orden de ejecución secuencial o que sea en paralelo. Léase también que cuando hablamos de un proceso podemos referirnos tanto a un ejecutable como a otro script.

Los dos comandos más habituales para lanzar procesos, son el comando CALL y el comando START. El comando START puede que sea mas flexible que el CALL cuando hablamos de  lanzar procesos, ya que puede sustituirlo en la mayoría de los casos.

El comando CALL se usa para llamar a un proceso, saltando la ejecución al proceso que se llama y ejecutándolo hasta el final. Mientras se ejecuta el proceso invocado con el CALL, la ejecución principal desde donde se invoca al proceso, queda bloqueada y sólo es reanuda cuando se termina la ejecución del proceso invocado.

Por otro lado, el comando START llama a un proceso y lo lanza en una ventana nueva (como comportamiento por defecto). Desde el momento que se invoca el proceso, éste se ejecuta en paralelo con la ejecución principal. A efectos prácticos conseguimos ejecutar en paralelo la ejecución principal con la del proceso.

Para que quede un poco más claro, puedes probar la diferencia entre ambos con el siguiente código en el que primero se ejecuta un CALL al comando ping, luego se hace lo mismo usando START sin lanzar nueva ventana y por último usando START creando nueva ventana y esperando a que termine su ejecución.

@ECHO OFF

ECHO Execution using CALL
ECHO -------------------------------------------
ECHO Main execution running...
ECHO Calling to ping...

call ping google.es
ECHO.
ECHO Continue main execution
TIMEOUT 5 > NUL
ECHO Main execution finished!
PAUSE

cls

ECHO Execution using START
ECHO -------------------------------------------
ECHO Main execution running...
ECHO Calling to ping...

start /b ping google.es
ECHO.
ECHO Continue main execution
TIMEOUT 5 > NUL
ECHO Main execution finished!
PAUSE

cls

ECHO Execution using START with waiting
ECHO -------------------------------------------
ECHO Main execution running...
ECHO Calling to ping...

start /w ping google.es
ECHO.
ECHO Continue main execution
TIMEOUT 5 > NUL
ECHO Main execution finished!
PAUSE

El primer y el tercer ejemplo son ejecuciones secuenciales, mientras que en el segundo cuando se lanza el proceso, éste se ejecuta en paralelo con la ejecución principal.

Como esto lo mejor es probarlo para poder verlo, os animo a copiarlo en un archivo de texto y renombrar la extensión a .BAT para poder ejecutarlo con doble click. Así lo podréis ejecutar tantas veces como os haga falta.

También tenéis disponible el script en Github:

test_call-VS-start.bat

Copy-Pega en la consola de comandos de Windows

La consola de comandos es una herramienta básica para todo aquel que trabaja en algún ámbito de la informática y es la forma menos recargada y rápida para ejecutar ciertas acciones en un sistema.

En el caso de Windows su interprete de comandos CMD, a veces resulta un poco engorroso cuando queremos recoger un resultado, y es que la consola no nos permite hacer algo tan simple como seleccionar y copiar. Algo a lo que todos nos hemos acostumbrado...

Existe la posibilidad de redirigir la salida usando ">" ">>" dependiendo si queremos sobrescribir el fichero o añadir información al final del mismo. Un ejemplo:

ping 127.0.0.1 > Log.txt
ping google.es >> Log.txt

Esta opción no resulta práctica cuando lo que queremos es conseguir de manera rápida la salida de un comando, para por ejemplo copiarla y pegarla en otro sitio sin pasar por un fichero.

A tal efecto puedes usar junto a un comando la siguiente pipeline:

 ping 127.0.0.1 | clip

De esta forma el output del comando queda guardado en el portapapeles de Windows y podrás pegarlo en cualquier sitio con la acción contextual "Pegar" del botón secundario del ratón o usando CTRL + V.