Utilidades CLI en C#: de la idea a la herramienta lista en una tarde

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Por qué C# es ideal para herramientas CLI y por qué es importante para un desarrollador de Python

\n

Cuando hablamos de crear utilidades de consola, lo primero que viene a la mente son Python, Bash o Go. Pero, ¿y si te dijera que C# es uno de los lenguajes más subestimados para escribir herramientas CLI rápidas, multiplataforma y atractivas? Sí, ese mismo C# que muchos asocian con formularios web y monstruos corporativos.

\n

Con el lanzamiento de .NET 6/8, C# ha incorporado una API mínima, compilación nativa (AOT) y la increíblemente conveniente biblioteca System.CommandLine. Ahora, crear una utilidad que funcione en Windows, Linux y macOS es posible en solo 15 minutos. Para estudiantes y desarrolladores que aprenden Python, esta es una excelente manera de ampliar su conjunto de herramientas y comprender cómo funcionan las utilidades CLI en otros lenguajes.

\n

En este artículo, no solo escribiremos un "Hola Mundo". Crearemos una utilidad completa para trabajar con archivos que pueda analizar argumentos, mostrar texto en color, manejar errores e incluso mostrar una barra de progreso. ¡Allá vamos!

\n\n

Configuración del proyecto: mínimo esfuerzo

\n

Lo primero que debe hacer es asegurarse de tener instalado el SDK de .NET (versión 6.0 o superior). Verificarlo es simple:

\n
dotnet --version
\n

Si todo está bien, creamos un nuevo proyecto de consola:

\n
dotnet new console -n FileGuardian\ncd FileGuardian
\n

Ya en este paso, obtenemos un esqueleto listo. Pero para una utilidad CLI real, necesitaremos una biblioteca para analizar argumentos. La agregamos:

\n
dotnet add package System.CommandLine --version 2.0.0-beta4.22272.1
\n

Listo. Ahora tenemos todo para crear una aplicación de consola profesional en C#.

\n\n

¿Por qué System.CommandLine y no el análisis manual?

\n

Muchos principiantes escriben args[0], args[1] y se encuentran con IndexOutOfRangeException. Ese es el camino del dolor. System.CommandLine ofrece:

\n
    \n
  • Análisis automático de banderas (--output, -o)
  • \n
  • Sugerencias en caso de entrada incorrecta
  • \n
  • Generación incorporada de --help
  • \n
  • Soporte para subcomandos (como en git)
  • \n
\n

Esto es imprescindible para cualquier utilidad de consola C# seria.

\n\n

Escribiendo el núcleo de la utilidad: primer comando

\n

Imagina que estamos creando una herramienta para monitorear archivos: FileGuardian. Verificará el tamaño de los archivos y advertirá si superan un límite. Suena útil, ¿verdad?

\n

Abriremos Program.cs y escribiremos lo siguiente:

\n
using System.CommandLine;\n\nvar rootCommand = new RootCommand("FileGuardian — utilidad para monitoreo de archivos");\n\nvar fileOption = new Option<FileInfo?>(\n    name: "--file",\n    description: "Ruta al archivo para analizar"\n);\nrootCommand.AddOption(fileOption);\n\nrootCommand.SetHandler((file) =>\n{\n    if (file is null || !file.Exists)\n    {\n        Console.Error.WriteLine("❌ ¡Archivo no encontrado!");\n        return;\n    }\n    \n    long sizeInBytes = file.Length;\n    double sizeInMb = sizeInBytes / (1024.0 * 1024.0);\n    \n    Console.WriteLine($"📄 Archivo: {file.Name}");\n    Console.WriteLine($"📏 Tamaño: {sizeInMb:F2} MB");\n    \n    if (sizeInMb > 100)\n        Console.WriteLine("⚠️ Atención: ¡el archivo supera los 100 MB!");\n}, fileOption);\n\nawait rootCommand.InvokeAsync(args);
\n

Ejecutamos:

\n
dotnet run -- --file somefile.txt
\n

Ya funciona. Pero esto es solo el comienzo. Agreguemos un toque especial: salida en color y una barra de progreso.

\n\n

Salida atractiva: agregando colores y emojis

\n

La consola no tiene por qué ser en blanco y negro. C# permite cambiar fácilmente los colores del texto. Crearemos una clase auxiliar:

\n
public static class ConsoleHelper\n{\n    public static void WriteSuccess(string message)\n    {\n        Console.ForegroundColor = ConsoleColor.Green;\n        Console.WriteLine($"✅ {message}"                

Blogs

Book Recommendations