Расписание задачи Vista из программы установки

Я развертываю приложение C# с помощью проекта мастера установки в Visual Studio 2008.

Как проще всего настроить Windows для запуска моего приложения через регулярные промежутки времени (например, каждые 8 ​​часов)? Я предпочитаю, чтобы это планирование происходило во время установки приложения, чтобы упростить настройку для конечного пользователя.

Спасибо!


person mrduclaw    schedule 21.11.2009    source источник


Ответы (2)


Запланированное задание — ваш путь. Взгляните на эту страницу, чтобы узнать, как настроить задачу с помощью скрипт.

person rerun    schedule 21.11.2009
comment
Тогда мне придется связать этот скрипт с установщиком и позаботиться об его удалении после того, как он запланирует запуск другой программы. Разве нет хорошего способа, чтобы мастер установки сделал это за меня? - person mrduclaw; 21.11.2009
comment
вы можете делать все в компоненте установки, что и в скрипте. - person rerun; 22.11.2009

Мне потребовалось некоторое время на сборку, поэтому вот полная документация по планированию задачи из проекта установки.

После создания проекта развертывания вам потребуется использовать Пользовательские действия, чтобы запланировать задачу. Пошаговое руководство. Создание пользовательского действия

Примечание. В пошаговом руководстве вам будет предложено добавить основной вывод в узел «Установка», даже если вы не планируете выполнять какие-либо действия на этапе «Установка». Это важно, поэтому не игнорируйте это, как я. Класс установщика выполняет некоторое управление состоянием на этом шаге, и его необходимо запустить.

Следующим шагом является передача каталога установки пользовательскому действию. Это делается с помощью свойства CustomActionData. Я ввел /DIR="[TARGETDIR]\" для узла фиксации (я планирую свою задачу на этапе фиксации). MSDN: свойство CustomActionData

Наконец, вам потребуется либо получить доступ к API планирования задач, либо использовать Process.Start для вызова schtasks.exe. API даст вам более плавный и надежный опыт, но я выбрал маршрут schtasks, потому что у меня была удобная командная строка.

Вот код, который я в конечном итоге получил. Я зарегистрировал его как настраиваемое действие для установки, фиксации и удаления.

using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Configuration.Install;
using System.Linq;
using System.Security.Permissions;
using System.Diagnostics;
using System.IO;


namespace MyApp
{
    [RunInstaller(true)]
    public partial class ScheduleTask : System.Configuration.Install.Installer
    {
        public ScheduleTask()
        {
            InitializeComponent();
        }

        [SecurityPermission(SecurityAction.Demand)]
        public override void Commit(IDictionary savedState)
        {
            base.Commit(savedState);

            RemoveScheduledTask();

            string installationPath = Context.Parameters["DIR"] ?? "";
            //Without the replace, results in c:\path\\MyApp.exe
            string executablePath = Path.Combine(installationPath, "MyApp.exe").Replace("\\\\", "\\");

            Process scheduler = Process.Start("schtasks.exe",string.Format("/Create /RU SYSTEM /SC HOURLY /MO 2 /TN \"MyApp\" /TR \"\\\"{0}\\\"\" /st 00:00", executablePath));
            scheduler.WaitForExit();
        }

        [SecurityPermission(SecurityAction.Demand)]
        public override void Uninstall(IDictionary savedState)
        {
            base.Uninstall(savedState);
            RemoveScheduledTask();
        }

        private void RemoveScheduledTask() {
            Process scheduler = Process.Start("schtasks.exe", "/Delete /TN \"MyApp\" /F");
            scheduler.WaitForExit();
        }
    }
}
person AaronSieb    schedule 10.05.2011
comment
Счет! Хороший ответ, сэкономил полдня ;-) - person quentin-starin; 26.10.2011