我有一个C#控制台应用程序,我希望能够部署到远程Windows Server 2012.我还希望应用程序在某些时间间隔内执行,例如每个月的最后一天。我想Windows Scheduled Tasks是执行此操作的首选方式。
如果我可以配置调度,将其与应用程序打包并将其部署到目标服务器,只需单击一下(最好是从Visual Studio),我会很高兴。 这甚至可能是远程可能的,如果是这样,怎么样?
答案 0 :(得分:2)
您可以使用任务计划程序来实现此目的。
围绕它建立了一个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一起使用。
首先,在您的解决方案中添加一个新的Windows安装项目;您可能需要搜索它并安装模板。此安装程序项目允许您将项目部署为msi构建,以便以后安装。
创建安装程序项目后,将项目输出添加到应用程序文件夹,以及您需要的任何其他内容。
构建并部署到主机。
我建议从命令行安装,以便将结果输出到日志文件,例如:
msiexec /package "c:\path\to\file.msi" /quiet ALLUSERS=1 /log "install.log"
安装msi文件后,首次使用-CreateSchedule
参数运行它
program.exe -CreateSchedule
您还可以创建批处理文件以自动执行上述命令行任务。