Questo ha richiesto un po 'di raccolta per me, quindi ecco la documentazione completa per la pianificazione di un compito da un progetto di installazione.
Una volta creato il progetto di distribuzione, sarà necessario utilizzare Custom Actions per pianificare l'attività. Walkthrough: Creating a Custom Action
Nota: La procedura dettagliata chiede di aggiungere l'output primario al nodo di installare, anche se non si ha intenzione di fare qualcosa di personalizzato durante la fase di installazione. Questo è importante, quindi non ignorarlo come ho fatto io. La classe di installazione esegue alcuni stati durante questo passaggio e deve essere eseguita.
Il passaggio successivo consiste nel passare la directory di installazione all'azione personalizzata. Questo viene fatto tramite lo CustomActionData property. Ho inserito /DIR="[TARGETDIR]\"
per il nodo di commit (programma la mia attività durante la fase di commit). MSDN: CustomActionData Property
Infine, è necessario accedere all'API di pianificazione attività oppure utilizzare Process.Start
per chiamare schtasks.exe. L'API ti fornirà un'esperienza più fluida e solida, ma sono andato con il percorso schtasks perché avevo a portata di mano la riga di comando.
Ecco il codice con cui alla fine sono arrivato. L'ho registrato come azione personalizzata per l'installazione, il commit e la disinstallazione.
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();
}
}
}
Quindi dovrei raggruppare quello script con l'installer e occuparmi di eliminarlo dopo che programma l'altro programma da eseguire. Non c'è solo un buon modo per fare in modo che l'installazione guidata lo faccia per me? – mrduclaw
puoi fare qualsiasi cosa nel componente di configurazione che potresti fare nello script. – rerun