Visual Studio 2008 で Setup Wizard プロジェクトを使用して C# アプリケーションを展開しています。
Windows でアプリケーションを定期的に (たとえば 8 時間ごとに) 実行するようにスケジュールする最も簡単な方法は何ですか? エンドユーザーのセットアップを簡素化するために、アプリケーションのインストール中にこのスケジューリングが行われることをお勧めします。
ありがとう!
Visual Studio 2008 で Setup Wizard プロジェクトを使用して C# アプリケーションを展開しています。
Windows でアプリケーションを定期的に (たとえば 8 時間ごとに) 実行するようにスケジュールする最も簡単な方法は何ですか? エンドユーザーのセットアップを簡素化するために、アプリケーションのインストール中にこのスケジューリングが行われることをお勧めします。
ありがとう!
これにはいくつかの準備が必要だったので、セットアップ プロジェクトからタスクをスケジュールするための完全なドキュメントを次に示します。
展開プロジェクトを作成したら、カスタム アクションを使用してタスクをスケジュールする必要があります。チュートリアル: カスタム アクションの作成
注:このウォークスルーでは、インストール ステップでカスタムを行う予定がない場合でも、プライマリ出力をインストール ノードに追加するよう求められます。これは重要なので、私のように無視しないでください。インストーラー クラスは、このステップでいくつかの状態管理を行い、実行する必要があります。
次のステップは、インストール ディレクトリをカスタム アクションに渡すことです。これはCustomActionData プロパティを介して行われます。コミット ノードに入力/DIR="[TARGETDIR]\"
しました (コミット ステップ中にタスクをスケジュールします)。MSDN: CustomActionData プロパティ
最後に、タスク スケジューリング API にアクセスするか、schtasks.exeProcess.Start
を呼び出す必要があります。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();
}
}
}
スケジュールされたタスクはあなたの方法です。スクリプトを使用してタスクをセットアップする方法については、このページをご覧ください。