¿Por qué C# no es solo para sitios web y juegos?
\n\nCuando escuchas «automatización», la mayoría recuerda Python o Bash. Y es justo: son ligeros, de scripting, «para pobres». Pero, ¿qué pasa si eres un desarrollador .NET que no quiere aprender una nueva sintaxis para un solo script? ¿O tu proyecto ya está en C# y arrastrar dependencias de Python para analizar registros es un infierno?
\n\nBienvenido al mundo de la automatización de tareas en C#. No es solo «escribir una aplicación de consola». Es una herramienta completa que puede trabajar con el sistema de archivos, el registro, objetos COM, GUI e incluso ejecutar comandos de PowerShell. Y todo esto, con tipado estricto, IntelliSense y sin sorpresas.
\n\nEn este artículo analizaremos 5 escenarios concretos que podrás aplicar hoy mismo. Sin rodeos: solo código y casos reales.
\n\n1. Trabajo con archivos: limpiar registros, archivar proyectos
\n\nEl dolor más común de cualquier desarrollador son las carpetas de registros desbordadas, archivos basura y la necesidad de respaldar compilaciones. La automatización en C# de operaciones con archivos se hace en 5 líneas.
\n\nEjemplo: eliminar archivos más antiguos de N días
\n\nusing System.IO;\n\nstring path = @"C:\\Logs\\";\nint daysOld = 30;\n\nvar oldFiles = Directory.GetFiles(path, "*.*", SearchOption.AllDirectories)\n .Where(f => File.GetLastWriteTime(f) < DateTime.Now.AddDays(-daysOld));\n\nforeach (var file in oldFiles)\n{\n File.Delete(file);\n Console.WriteLine($"Eliminado: {file}");\n}\n\n\nCambiamos SearchOption.AllDirectories por TopDirectoryOnly — y el script solo funciona en la raíz. Agregamos try-catch — y está listo para producción.
Ejemplo: archivar carpeta con fecha
\n\nusing System.IO.Compression;\n\nstring source = @"C:\\Projects\\MyApp\\bin\\Release";\nstring zipPath = $@"C:\\Backups\\MyApp_{DateTime.Now:yyyy-MM-dd}.zip";\n\nZipFile.CreateFromDirectory(source, zipPath);\nConsole.WriteLine($"Archivo creado: {zipPath}");\n\n\nEste código se puede colocar en el Programador de tareas de Windows (Task Scheduler) — y olvidarse de las copias de seguridad manuales. Automatización en C# en acción.
\n\n2. Trabajo con el registro: cambiar configuraciones del sistema
\n\nA veces es necesario escribir una clave de registro para todos los usuarios o, por el contrario, eliminar una entrada de virus. C# a través de Microsoft.Win32 lo hace de forma segura y sin archivos BAT.
using Microsoft.Win32;\n\n// Establecer valor\nRegistryKey key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\\MyCompany", true);\nif (key == null)\n{\n key = Registry.LocalMachine.CreateSubKey(@"SOFTWARE\\MyCompany");\n}\nkey.SetValue("InstallPath", @"C:\\Program Files\\MyApp");\nkey.Close();\n\n\nPara HKEY_CURRENT_USER usamos Registry.CurrentUser. Importante: para HKLM se necesitan permisos de administrador — ejecute la aplicación como administrador.
3. PowerShell desde C#: cruzando dos mundos
\n\nA veces es más fácil escribir un comando de PowerShell que implementarlo en C#. Por ejemplo, obtener la lista de programas instalados o reiniciar un servicio. La biblioteca System.Management.Automation permite realizar scripting en C# invocando comandos de PS.
Instale el paquete NuGet:
\nInstall-Package Microsoft.PowerShell.SDK\n\nEjemplo: reiniciar un servicio
\n\nusing System.Management.Automation;\n\nusing (PowerShell ps = PowerShell.Create())\n{\n ps.AddScript("Restart-Service -Name 'Spooler' -Force");\n var results = ps.Invoke();\n \n if (ps.HadErrors)\n {\n foreach (var error in ps.Streams.Error)\n {\n Console.WriteLine($"Error: {error.Exception.Message}");\n }\n }\n else\n {\n Console.WriteLine("Servicio reiniciado.");\n }\n}\n\n\nDe esta manera obtienes la flexibilidad de PowerShell y la seguridad de C#. Ideal para la automatización de Windows en cor