Для этого потребовалось некоторое поручение, так что вот полная документация для планирования задачи из проекта установки.
После создания вашего проекта развертывания вам нужно будет использовать Custom Actions, чтобы запланировать выполнение задачи. Walkthrough: Creating a Custom Action
Примечания: прохождение игра просит вас, чтобы добавить первичный выход на Install узел, даже если вы не планируете делать что-нибудь на заказ в течение этапа Установки. Это важно, поэтому не игнорируйте его, как я. В этом шаге класс установщика выполняет некоторые функции управления состоянием и должен запускаться.
Следующим шагом является переход каталога установки к пользовательскому действию. Это делается через CustomActionData property. Я ввел /DIR="[TARGETDIR]\"
для узла фиксации (я планирую свою задачу во время шага фиксации). MSDN: CustomActionData Property
Наконец, вам необходимо либо обратиться к 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();
}
}
}
Тогда мне придется связать этот сценарий с установщиком и позаботиться о его удалении после того, как он планирует запустить другую программу. Существует не просто хороший способ, чтобы Мастер установки сделал это для меня? – mrduclaw
вы можете сделать что-либо в компоненте настройки, который вы могли бы сделать в скрипте. – rerun