Ya vimos en un post anterior como crear tareas programadas en Windows Vista, con un Wizard que nos ofrece Windows, las tareas programadas pueden ser creadas también por líneas de comandos usando el comando schtasks o el comando at.
Vamos a crear tareas desde C#, usando una librería que encontré en CodeProject .
- Para empezar descargamos la librería, de la misma dirección podemos descargar el código fuente y la ayuda.
- Creamos un proyecto de Consola en Visual Studio, puede ser el 8, 9 o el Express cualquiera.
- Agregamos la referencia de la Dll para que se copie a nuestro proyecto:
- Ahora usamos la referencia en el código:
- Para crear una tarea como se enseña en el diseño hay que crear primero una clase ScheduleTask y luego llamar el método CreateTask y ser asignado a un objeto Task, en el código se explica mejor:
- La palabra Prueba, es el nombre que tendrá la tarea programada.
- Ahora le decimos al objeto tarea el archivo que queremos que se ejecute, podemos crear un *.bat, o un *.exe, un *.txt, lo que sea:
- Podemos agregar una descripción de la tarea:
- Como sabemos, para ejecutar una tarea necesitamos un usuario, y si es administrador mucho mejor:
- Para decirle la periocidad de la tarea, agregamos Triggers o disparadores a la tarea, podemos escoger diariamente:
- Semanalmente, podemos decirle que días queremos que se ejecute, los días van separados por | :
- Mensualmente, debemos declarar un array de enteros, con los días del mes en que queremos que se ejecute la tarea:
- Despues de haber escogido la periocidad podemos modificar el limite de duración, la prioridad, parámetros y otras cosas:
- Cuando hayamos acabado de configurar la tarea, guardamos:
using TaskScheduler;
using (ScheduledTasks Tareas = new ScheduledTasks()) { Task tarea = Tareas.CreateTask("Prueba"); }
// archivo que vamos a ejecutar, escribimos la ruta completa tarea.ApplicationName = @"C:\Windows\System32\calc.exe";
tarea.Comment = "Tarea que abre la calculadora";
// configurar la cuenta con la que se ejecutara la tarea tarea.SetAccountInformation("usuario", "password");
// agregamos el disparador, la tarea se ejecutara diariamente a las 6 y 15 pm tarea.Triggers.Add(new DailyTrigger(18, 15));
tarea.Triggers.Add(new WeeklyTrigger(18,15,DaysOfTheWeek.Saturday | DaysOfTheWeek.Sunday));
int []dias =new int[] {1,15}; tarea.Triggers.Add(new MonthlyTrigger(18,15,dias));
// limitar la duración de la tarea programada tarea.MaxRunTime = new TimeSpan(0, 15, 0); tarea.Creator = "Martín Reina"; // prioridad de la tarea tarea.Priority = System.Diagnostics.ProcessPriorityClass.Normal;
tarea.Save();
El código completo es:
using (ScheduledTasks Tareas = new ScheduledTasks()) { Task tarea = Tareas.CreateTask("Prueba"); // archivo que vamos a ejecutar, escribimos la ruta completa tarea.ApplicationName = @"C:\Windows\System32\calc.exe"; tarea.Comment = "Tarea que abre la calculadora"; // configurar la cuenta con la que se ejecutara la tarea tarea.SetAccountInformation("usuario", "password"); // limitar la duración de la tarea programada tarea.MaxRunTime = new TimeSpan(0, 15, 0); tarea.Creator = "Martín Reina"; // prioridad de la tarea tarea.Priority = System.Diagnostics.ProcessPriorityClass.Normal; // agregamos el disparador, la tarea se ejecutara diariamente a las 6 y 15 pm //tarea.Triggers.Add(new DailyTrigger(18, 15)); int []dias =new int[] {1,15}; tarea.Triggers.Add(new MonthlyTrigger(18,15,dias)); tarea.Save(); }
Si ejecutamos la aplicación y luego verificamos el Task Scheduler (Donde están las tareas guardadas):
Bien, ahora podemos comenzar a programar más tareas con muchas más opciones, borrar tareas creadas, detener tareas que se encuentren ejecutando, abrir tareas para modificarlas, listar las tareas.
Gracias por tu aportación, me ha servido de mucho
muchas graciass, me sirvio muchisimo en mi laburo,,:D
Disculpa me sale un error cuando la cuenta de usuario esta detro de un dominio algun idea para la solución?
en windows 7 donde se veria esta tarea?
Si te refieres a donde se ven las tareas de Windows o las que creamos, puedes hacer la fácil y en Inicio escribes TaskScheduler, o puedes ir a Panel de Control -> System and Security -> Administrative Tools ->Task Scheduler
tengo un problema a la hora de crear las tareas de modo que se ejecuten a intervalos regulares. El problema es que el metodo NextRunTimeAfter solo me calcula la proxima vez que se ejecutara la tarea a partir de un momento dado. Pero yo lo que deseo hacer es madarla a ejecutar cada X minutos, horas, dias, etc. Y no hay un metodo predefinido que me establesca estos intervalos regulares, Alguna sugerencia ???
Hola, si estas usando la misma Dll en la que uso en el post, puedes usar lot triggers para indicarle a la tarea que se ejecute cada día, cada mes, si es otra Dll mira si tiene algún método para adicionar Triggers que es lo que más usan para programar la tarea
Hola, estoy empezando a crear mis proyectos en c# .net y hay muchas cosas que parecen obvias pero que simplemente no las capto. Hice todo el proceso que indicas, agregue un proyecto de consola y en automatico me crea una clase. En ella puse el using para llamar la libreria y copie todo el codigo que tienes pero en esta parte … using ScheduledTasks Tareas = new ScheduledTasks() me dice que hace falta una estructura, enumeracion, delegado o clase lo mismo me dice con ….. tarea.MaxRunTime = new TimeSpan(0, 15, 0);
De antemano agradezco la ayuda.
Si descargaste y agregaste la DLL de codeproject a tu proyecto? El error que te sale, es porque falta una referencia
Casi 2 años despues me has salvado la vida. Muchas gracias.
Hola, si me faltaba agregar la DLL. Muchas gracias :D. Ahora tengo otro detalle. Al publicar la aplicación e intentar agregar una tarea me genera un error, diciendo que tengo el acceso denegado. Ya intente poner el usuario del IIS pero la tarea no se ejecuta.
De antemano, Gracias por tu ayuda.
Cuando asignas el usuario que va a ejecutar la tarea (tarea.SetAccountInformation(«usuario», «password»);) verificaste que el usuario si fuera Administrador o tuviera permisos para ejecutar el servicio de tareas programadas?.
Hola, gracias por responder tan rápido 🙂 .. Si, verifique que el usuario fuera administrador. De hecho le doy mi usuario y contraseña, publico la aplicación y al momento de agregar la tarea me manda el error. Verifico en las tareas programadas y esta la tarea pero no puede ejecutar el archivo. Entro a la tarea, a través de windows, esta con mi usuario y me vuelve a pedir la contraseña, se la doy, guardo y ejecuta sin problemas. La aplicación la consulto desde la web, le doy https:\ ruta\pagina.aspx.
Muchas gracias por tu apoyo.
Como puedo crear una tarea con una cuenta de windows que no tiene contraseña
Martin Reina, consulta, cual es el código para detener una tarea ya existente, digamos que se haya quedado pegada :S
Hola, si usas la misma librería que uso en el post, puedes obtener el listado de las tareas, luego obtener la tarea que necesitas, y llamar el método Terminate():
st = new ScheduledTasks();
ListTasks(st);
static void ListTasks(ScheduledTasks st) {
string[] taskNames = st.GetTaskNames();
foreach (string name in taskNames) {
Task t = st.OpenTask(name);
t.Terminate();
t.Close();
}
}
Hola, una duda, cuando se ejecuta el .bat o .exe para que la tarea se programe aparece ventana de confirmación o aviso alguno???
Hola, funciono muy bien la dll en windows 7 y cuando lo publico en windows server 2003 no funciona, al momento de crear la tarea me dice «instancia de objeto no establecida como instancia de un objeto» te ha pasado este error? Saludos y de antemano gracias.
como hago que se Repita cada minuto , una tarea??
hola , se puede ejecutar un metodo con lineas de codigo en vez de una tarea?
Hola, que quieres decir con un método con líneas de código?, que si puedes ejecutar un exe que contiene un método?
Hola, como puedo hacer para que se ejecute diario, cada 5 minutos?
Hola, para hacer las repeticiones, solo debes de generar un trigger y especificar durante cuanto tiempo se repetira y por cada cuanto tiempo, algo asi
Trigger ntg = new DailyTrigger(08, 00);
int duration = 720;
int intervalo = tiempo;
ntg.DurationMinutes = duration;
ntg.IntervalMinutes = intervalo;
Hola, en la creación de las tareas, ¿es posible mediante esta librería crear una carpeta donde situar las mismas?
Hola,
¿Como le indico que requiero que la tarea se inicie cuando el usuario inicie sesión en Windows?