如何在Windows上部署和启动带有计划任务的控制台应用程序?

时间:2016-01-14 09:21:57

标签: c# deployment scheduled-tasks console-application

我有一个C#控制台应用程序,我希望能够部署到远程Windows Server 2012.我还希望应用程序在某些时间间隔内执行,例如每个月的最后一天。我想Windows Scheduled Tasks是执行此操作的首选方式。

如果我可以配置调度,将其与应用程序打包并将其部署到目标服务器,只需单击一下(最好是从Visual Studio),我会很高兴。 这甚至可能是远程可能的,如果是这样,怎么样?

2 个答案:

答案 0 :(得分:2)

您可以使用任务计划程序来实现此目的。

Task Scheduler

围绕它建立了一个nuget包 https://www.nuget.org/packages/TaskScheduler/ 在此查找详细文档 https://github.com/dahall/taskscheduler

using (TaskService ts = new TaskService())
  {
     // Create a new task definition and assign properties
     TaskDefinition td = ts.NewTask();
     td.RegistrationInfo.Description = "Does something";

     // Create a trigger that will fire the task at this time every other day
     td.Triggers.Add(new MonthlyTrigger { RunOnLastDayOfMonth = true });

     // Create an action that will launch Notepad whenever the trigger fires
     td.Actions.Add(new ExecAction("your.exe", "c:\\test.log", null));

     // Register the task in the root folder
     ts.RootFolder.RegisterTaskDefinition(@"Test", td);

  }

答案 1 :(得分:0)

我知道这已经有一年了,但这是一个你可以遵循的概念。就像我说的那样,这是一个概念,因为我无法一直验证,因为我的工作岗位如何被锁定;我最终得到了一个" Access is Denied"错误。

在你的程序中,添加@Vishnu Prasad上面提到的using {}块:

if(args != null && args.Contains("-CreateSchedule"))
{
    using (TaskService ts = new TaskService())
    {
        // Get the company name 
        FileVersionInfo versionInfo = FileVersionInfo.GetVersionInfo(Assembly.GetEntryAssembly().Location);
        string companyName = versionInfo.CompanyName;

        // Set the program path
        string folderPath = string.Format(@"{0}\{1}", Environment.SpecialFolder.ProgramFiles.ToString(), companyName);
        string programPath = string.Format(@"{0}\program.exe", folderPath);

        // Create a new task definition and assign properties
        TaskDefinition td = ts.NewTask();
        td.RegistrationInfo.Description = "The program does what it does";

        // Set trigger and action and other properties...
        td.Principal.RunLevel = TaskRunLevel.Highest;

        // Create a trigger that will fire at the end of the month, every month
        td.Triggers.Add(new MonthlyTrigger { RunOnLastDayOfMonth = true });

        // Create an action that will launch the program whenever the trigger fires
        td.Actions.Add(new ExecAction(programPath, "'arg a' 'arg b' 'etc'", null));

        ts.RootFolder.RegisterTaskDefinition("TheTaskName", td);
    }

    // Don't let the program perform any other functions that aren't needed
    Exit();
}

以下过程与Visual Studio 2012一起使用。

  1. 首先,在您的解决方案中添加一个新的Windows安装项目;您可能需要搜索它并安装模板。此安装程序项目允许您将项目部署为msi构建,以便以后安装。

  2. 创建安装程序项目后,将项目输出添加到应用程序文件夹,以及您需要的任何其他内容。

  3. 构建并部署到主机。

  4. 我建议从命令行安装,以便将结果输出到日志文件,例如:

    msiexec /package "c:\path\to\file.msi" /quiet ALLUSERS=1 /log "install.log"

    安装msi文件后,首次使用-CreateSchedule参数运行它 program.exe -CreateSchedule

    您还可以创建批处理文件以自动执行上述命令行任务。