CliWrap es una biblioteca de código abierto para .NET que simplifica la ejecución y gestión de procesos externos en aplicaciones C#.
Es decir, básicamente es un reemplazo hiper vitaminado para Process.Start(...)
con todas las opciones de gestión del proceso que podáis imaginar.
CliWrap está diseñada para ofrecer una interfaz intuitiva nos permite interactuar con la línea de comandos de manera sencilla, por ejemplo, manejando la ejecución de comandos o la captura de salida.
Características de CliWrap,
- Interfaz fluida: Proporciona una API moderna y fluida para trabajar con procesos externos, mejorando la legibilidad y mantenibilidad del código.
- Soporte para comandos: Permite la ejecución de comandos de línea de comandos y scripts, con soporte para argumentos y parámetros.
- Captura de salida: Facilita la captura y el manejo de la salida estándar y de error de los procesos, así como la entrada estándar.
- Asincronía: Soporta la ejecución asíncrona de comandos, ideal para aplicaciones que requieren operaciones no bloqueantes.
- Configuración flexible: Ofrece opciones avanzadas para la configuración de procesos, incluyendo redirección de entrada/salida y establecimiento de tiempo de espera.
Instalación de CliWrap
Para utilizar CliWrap en tu proyecto .NET, necesitas agregar el paquete correspondiente a través de NuGet. Puedes hacerlo mediante la consola del administrador de paquetes en Visual Studio o usando la CLI de .NET. Aquí tienes el comando para instalar CliWrap:
Install-Package CliWrap
Uso de CliWrap
Ejecutar un comando simple
Para ejecutar un comando de línea de comandos simple, puedes usar la clase Cli
de CliWrap. Aquí tienes un ejemplo básico que ejecuta el comando echo
:
var result = await Cli.Wrap("cmd")
.WithArguments(["echo", "Hello, CliWrap!"])
.ExecuteAsync();
Console.WriteLine($"Exit Code: {result.ExitCode}");
En este ejemplo:
Cli.Wrap("echo")
: Crea una instancia deCli
para el comandoecho
.WithArguments("Hello, CliWrap!")
: Establece los argumentos del comando.ExecuteAsync()
: Ejecuta el comando de manera asíncrona y espera su finalización.
Capturar la salida
Para capturar la salida estándar y de error del proceso, puedes configurar los manejadores de salida y error. Aquí hay un ejemplo que captura la salida y el error del comando ls
:
var result = await Cli.Wrap("cmd")
.WithStandardOutputPipe(PipeTarget.ToDelegate(Console.WriteLine))
.WithStandardOutputPipe(PipeTarget.ToDelegate(Console.Error.WriteLine))
.ExecuteAsync();
Console.WriteLine($"Exit Code: {result.ExitCode}");
En este ejemplo:
WithStandardInputPipe(PipeTarget.ToDelegate(Console.WriteLine))
: Redirige la salida estándar del comando al delegado que escribe en la consola.WithStandardErrorPipe(PipeTarget.ToDelegate(Console.Error.WriteLine))
: Redirige la salida de error del comando al delegado que escribe en la consola de errores.
O, podemos mandarlo un StringBuilder
para tener los datos en memoria.
var stdOutBuffer = new StringBuilder();
var result = await Cli.Wrap("cmd")
.WithStandardOutputPipe(PipeTarget.ToDelegate(Console.WriteLine))
.WithStandardOutputPipe(PipeTarget.ToStringBuilder(stdOutBuffer))
.ExecuteAsync();
Console.WriteLine($"Exit Code: {result.ExitCode}");
Manejar la Entrada Estándar
CliWrap también permite enviar datos a la entrada estándar del proceso. Podemos tener un proceso e ir mandándole comandos, a través de la entrada estándard. Aquí tienes un ejemplo desde un string, aunque existen otros muchos Pipes
que podemos usar.
```csharp
var result = await Cli.Wrap("cmd")
.WithStandardInputPipe(PipeSource.FromString("\ndir\n"))
.WithStandardOutputPipe(PipeTarget.ToDelegate(Console.WriteLine))
.ExecuteAsync();
Console.WriteLine($"Exit Code: {result.ExitCode}");
En este ejemplo:
WithStandardInputPipe(PipeSource.FromString(...)
: Empleamos una cadena de texto como fuente de comandos a enviar al proceso. En este caso, simplemente mandamos el comandodir
al procesocmd
.
Configuración Adicional
CliWrap permite una configuración adicional para establecer el tiempo de espera, el directorio de trabajo y otros parámetros del proceso. Aquí tienes un ejemplo de cómo establecer un tiempo de espera para la ejecución del comando:
using System;
using System.Threading.Tasks;
using CliWrap;
class Program
{
static async Task Main(string[] args)
{
var result = await Cli.Wrap("sleep")
.WithArguments("10")
.WithTimeout(TimeSpan.FromSeconds(5))
.ExecuteAsync();
Console.WriteLine($"Exit Code: {result.ExitCode}");
}
}
En este ejemplo:
WithTimeout(TimeSpan.FromSeconds(5))
: Establece un tiempo de espera de 5 segundos para el comandosleep
.