Utilitários CLI em C#: da ideia à ferramenta pronta em uma noite

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Por que C# é ideal para ferramentas CLI e por que isso é importante para um desenvolvedor Python

\n

Quando falamos sobre criar utilitários de console, a primeira coisa que vem à mente são Python, Bash ou Go. Mas e se eu dissesse que C# é uma das linguagens mais subestimadas para escrever ferramentas CLI rápidas, multiplataforma e elegantes? Sim, esse mesmo C# que muitos associam a formulários web e monstros corporativos.

\n

Com o lançamento do .NET 6/8, o C# ganhou uma API mínima, compilação nativa (AOT) e uma biblioteca incrivelmente conveniente chamada System.CommandLine. Agora, criar um utilitário que funciona no Windows, Linux e macOS pode ser feito em apenas 15 minutos. Para estudantes e desenvolvedores que estão aprendendo Python, esta é uma ótima maneira de expandir seu kit de ferramentas e entender como os utilitários CLI funcionam em outras linguagens.

\n

Neste artigo, não vamos apenas escrever um "Hello World". Vamos criar um utilitário completo para trabalhar com arquivos, capaz de analisar argumentos, exibir texto colorido, tratar erros e até mesmo mostrar uma barra de progresso. Vamos lá!

\n\n

Configuração do projeto: mínimo esforço

\n

A primeira coisa a fazer é garantir que você tenha o .NET SDK instalado (versão 6.0 ou superior). Verifique facilmente:

\n
dotnet --version
\n

Se estiver tudo certo, crie um novo projeto de console:

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

Já nesta etapa, obtemos um esqueleto pronto. Mas para um utilitário CLI de verdade, precisaremos de uma biblioteca para análise de argumentos. Adicione-a:

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

Pronto. Agora temos tudo para criar um aplicativo de console profissional em C#.

\n\n

Por que System.CommandLine e não análise manual?

\n

Muitos iniciantes escrevem args[0], args[1] e pegam IndexOutOfRangeException. Esse é o caminho da dor. System.CommandLine oferece:

\n
    \n
  • Análise automática de flags (--output, -o)
  • \n
  • Dicas em caso de entrada incorreta
  • \n
  • Geração embutida de --help
  • \n
  • Suporte a subcomandos (como no git)
  • \n
\n

Isso é indispensável para qualquer utilitário de console C# sério.

\n\n

Escrevendo o núcleo do utilitário: primeiro comando

\n

Imagine que estamos criando uma ferramenta para monitoramento de arquivos — FileGuardian. Ela verificará o tamanho dos arquivos e alertará se eles excederem o limite. Parece útil, certo?

\n

Abra o Program.cs e escreva o seguinte:

\n
using System.CommandLine;\n\nvar rootCommand = new RootCommand("FileGuardian — utilitário para monitoramento de arquivos");\n\nvar fileOption = new Option<FileInfo?>(\n    name: "--file",\n    description: "Caminho para o arquivo a ser analisado"\n);\nrootCommand.AddOption(fileOption);\n\nrootCommand.SetHandler((file) =>\n{\n    if (file is null || !file.Exists)\n    {\n        Console.Error.WriteLine("❌ Arquivo não encontrado!");\n        return;\n    }\n    \n    long sizeInBytes = file.Length;\n    double sizeInMb = sizeInBytes / (1024.0 * 1024.0);\n    \n    Console.WriteLine($"📄 Arquivo: {file.Name}");\n    Console.WriteLine($"📏 Tamanho: {sizeInMb:F2} MB");\n    \n    if (sizeInMb > 100)\n        Console.WriteLine("⚠️ Atenção: o arquivo excede 100 MB!");\n}, fileOption);\n\nawait rootCommand.InvokeAsync(args);
\n

Execute:

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

Já está funcionando. Mas isso é só o começo. Vamos adicionar um toque especial — saída colorida e barra de progresso.

\n\n

Saída bonita: adicionando cores e emojis

\n

O console não precisa ser preto e branco. C# permite alterar facilmente as cores do texto. Vamos criar uma classe 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