背景:我做了一个事情是要自己提前创建好很多要定时执行的任务,在我不在的时候自动执行这些程序,以保证我的工作能无人值守,那么我就需要建立系统计划任务来帮我完成这件事情,当然用脑子想想如何实现,很简单,每个程序员都能想到,甚至是不是程序员的人都能想到如何去操作,但实际操作过程中会遇到很多坑,我现在就记录一下这些我遇到的坑,让大家避免跟我一样遇到后花费不必要的时间。

废话不多说,直接看方案

步骤:

先找到可以实现这个逻辑的类或者是dll,nuget包等等都可以,我下面使用的是直接使用Windows系统中的dll文件来实现

按照以下步骤做一定能达成你的目标

1.进入C:\Windows\System32\目录下,找到taskschd.dll文件,这个文件主要就是用来操作Windows计划任务的

2.将taskschd.dll引入到项目中(注意【嵌入互操作类型】属性要为false才行,否则会有报错),然后参考:https://www.cnblogs.com/tonge/p/4410066.html,如果嫌麻烦,可以直接看下面的代码

 #region Task
/// <summary>
/// delete task
/// </summary>
/// <param name="taskName"></param>
private static void DeleteTask(string taskName)
{
TaskSchedulerClass ts = new TaskSchedulerClass();
ts.Connect(null, null, null, null);
ITaskFolder folder = ts.GetFolder("\\");
folder.DeleteTask(taskName, );
} /// <summary>
/// get all tasks
/// </summary>
public static IRegisteredTaskCollection GetAllTasks()
{
TaskSchedulerClass ts = new TaskSchedulerClass();
ts.Connect(null, null, null, null);
ITaskFolder folder = ts.GetFolder("\\");
IRegisteredTaskCollection tasks_exists = folder.GetTasks();
return tasks_exists;
}
/// <summary>
/// check task isexists
/// </summary>
/// <param name="taskName"></param>
/// <returns></returns>
public static bool IsExists(string taskName)
{
var isExists = false;
IRegisteredTaskCollection tasks_exists = GetAllTasks();
for (int i = ; i <= tasks_exists.Count; i++)
{
IRegisteredTask t = tasks_exists[i];
if (t.Name.Equals(taskName))
{
isExists = true;
break;
}
}
return isExists;
} /// <summary>
/// create scheduler
/// </summary>
/// <param name="creator"></param>
/// <param name="taskName"></param>
/// <param name="path"></param>
/// <param name="interval"></param>
/// <param name="startBoundary"></param>
/// <param name="description"></param>
/// <returns></returns>
public static _TASK_STATE CreateTaskScheduler(string creator, string taskName, string path, string interval, string startBoundary, string description)
{
try
{
if (IsExists(taskName))
{
DeleteTask(taskName);
} //new scheduler
TaskSchedulerClass scheduler = new TaskSchedulerClass();
//pc-name/ip,username,domain,password
scheduler.Connect(null, null, null, null);
//get scheduler folder
ITaskFolder folder = scheduler.GetFolder("\\"); //set base attr
ITaskDefinition task = scheduler.NewTask();
task.RegistrationInfo.Author = creator;//creator
task.RegistrationInfo.Description = description;//description //set trigger (IDailyTrigger ITimeTrigger)
ITimeTrigger tt = (ITimeTrigger)task.Triggers.Create(_TASK_TRIGGER_TYPE2.TASK_TRIGGER_TIME);
tt.Repetition.Interval = interval;// format PT1H1M==1小时1分钟 设置的值最终都会转成分钟加入到触发器
tt.StartBoundary = startBoundary;//start time //set action
IExecAction action = (IExecAction)task.Actions.Create(_TASK_ACTION_TYPE.TASK_ACTION_EXEC);
action.Path = path;//计划任务调用的程序路径 task.Settings.ExecutionTimeLimit = "PT0S"; //运行任务时间超时停止任务吗? PTOS 不开启超时
task.Settings.DisallowStartIfOnBatteries = false;//只有在交流电源下才执行
task.Settings.RunOnlyIfIdle = false;//仅当计算机空闲下才执行 IRegisteredTask regTask = folder.RegisterTaskDefinition(taskName, task,
(int)_TASK_CREATION.TASK_CREATE,
null, //user
null, // password
_TASK_LOGON_TYPE.TASK_LOGON_INTERACTIVE_TOKEN,
"");
IRunningTask runTask = regTask.Run(null);
return runTask.State; }
catch (Exception ex)
{
throw ex;
} }
#endregion private static void TestTaskScheduler()
{
//创建者
var creator = "Tonge";
//计划任务名称
var taskName = "CalcTask";
//执行的程序路径
var path = "C:\\Windows\\System32\\calc.exe";
//计划任务执行的频率 PT1M一分钟 PT1H30M 90分钟
var interval = "PT1M";
//开始时间 请遵循 yyyy-MM-ddTHH:mm:ss 格式
var startBoundary = "2019-10-15T14:27:25";
var description = "this is description"; _TASK_STATE state = CreateTaskScheduler(creator, taskName, path, interval, startBoundary, description);
if (state == _TASK_STATE.TASK_STATE_RUNNING)
{
Console.WriteLine("计划任务部署成功!");
}
}

3.创建控制台程序(这个我就不用讲解了,你们懂的),直接粘贴进去即可

4.直接编译后运行,可能会遇到没有权限的问题,那么就需要用到下一个参考:https://www.cnblogs.com/babycool/p/3569183.html

5.解决管理员身份运行程序后,一定要关闭Visual Studio 工具,然后打开的时候使用管理员身份运行工具,再次编译,会发现成功了,创建的计划任务也顺利执行了

6.这时便大功告成,如有其他建议,可以留言给我,非常欢迎!

附其他参考:

https://archive.codeplex.com/?p=taskscheduler

https://blog.csdn.net/bubu05690523/article/details/41282919

https://dahall.github.io/TaskScheduler/html/R_Project_TaskScheduler.htm

https://docs.microsoft.com/zh-cn/windows/win32/taskschd/schtasks?redirectedfrom=MSDN#creating-a-task

【文中引用】https://www.cnblogs.com/tonge/p/4410066.html

【文中引用】https://www.cnblogs.com/babycool/p/3569183.html

[经验分享]C# 操作Windows系统计划任务的更多相关文章

  1. C语言操作WINDOWS系统存储区数字证书相关函数详解及实例

     C语言操作WINDOWS系统存储区数字证书相关函数详解及实例 以下代码使用C++实现遍历存储区证书及使用UI选择一个证书 --使用CertOpenSystemStore打开证书存储区. --在循环中 ...

  2. python通过操作windows系统注册表方式修改环境变量

    #coding=utf8 import os import sys from subprocess import check_call if sys.hexversion > 0x0300000 ...

  3. winform操作windows系统计算器

    winform对系统计算器的调用,启动,最大化最小化显示,在mainwindow设置topmost=true时,正常显示计算器并置顶. /// <summary> /// 获取窗体的句柄函 ...

  4. sqlserver如何读写操作windows系统的文件

    DECLARE   @object   int     DECLARE   @hr   int     DECLARE   @src   varchar(255),   @desc   varchar ...

  5. CIO必看:跨国集团采购部报表系统的建设经验分享

    CIO必看:跨国集团采购部报表系统的建设经验分享 引言 福耀集团是国内最具规模.技术水平最高.出口量最大的汽车玻璃生产供应商,产品"FY"商标是中国汽车玻璃行业第一个"中 ...

  6. ssh远程端口转发&&windows系统提权之信息收集&&网安工具分享(部分)

    一.ssh远程端口转发 背景:当我们在渗透过程中,获取到内网的一台仅有内网IP的服务器后,我们可以通过ssh隧道,将内网某个主机的端口进行远程转发 1.网络拓扑图 假设获取的服务器为web服务器,we ...

  7. windows系统快捷操作の高级篇

    上次介绍了windows系统上几个比较好用的软件和系统快捷键,虽然有些很方便,但是毕竟还是太少了,而且无法自定义专属于自己的快捷键.所以我写了这么一篇教程,主要介绍两个神器:windows平台上的au ...

  8. windows系统快捷操作の进阶篇

    上次介绍了windows系统上一些自带的常用快捷键,有些确实很方便,也满足了我们的一部分需求.但是我们追求效率的步伐怎会止步于此?这一次我将会进一步介绍windows上提升效率的方法. 一:运行 打开 ...

  9. windows系统快捷操作の基础篇

    从网上汇总了一些windows系统上常用的快捷键,结合自己的使用经验,将平时使用电脑时最常用的快捷键记录在此.注意这里罗列的是平时最常用到的,其他的一般来说不怎么用到的并不在此列,如果想要完整列表,请 ...

随机推荐

  1. Ubuntu hadoop配置之修改主机名

    1.查看主机名的方法 方法1: 在终端输入hostname 方法2: 提示符 liuhongyang@ubuntu:~$ liuhongyang:用户名 ubuntu:       主机名 ~:   ...

  2. 分布式之分布式事务、分布式锁、接口幂等性、分布式session

    一.分布式session session 是啥?浏览器有个 cookie,在一段时间内这个 cookie 都存在,然后每次发请求过来都带上一个特殊的 jsessionid cookie,就根据这个东西 ...

  3. python判断一个数是否为整数

  4. FreeSql (八)插入数据时指定列

    插入数据时指定列,和忽略列对应,未被指定的列将被忽略. var connstr = "Data Source=127.0.0.1;Port=3306;User ID=root;Passwor ...

  5. Jsp学习笔记(4)——分页查询

    核心sql i是第几页,itemNum是每页显示的数据条数 select * from ( select e.*,rownum rn from ( select * from employee whe ...

  6. android端 版本升级

    由于项目中要求实现版本升级,特写此代码,有因为这段代码基本都是通用,所以记录下来,以便下次直接拷贝... public class ApkVersionUpdate { /** apk文件下载状态:正 ...

  7. HTTP协议的运行流程

    1.HTTP协议的流程是什么样的呢? (1)http客户端发起请求,创建端口 (2)http服务器在端口监听客户端请求 (3)http服务器向客户端返回状态和内容 更详细的请参考大神:https:// ...

  8. mysql隔离级别的测试

    mysql提供四种隔离级别,以下分别对四种隔离级别进行测试,更加直观清晰的了解.具体的隔离级别以及其他相关介绍见https://www.cnblogs.com/eric-fang/p/11052304 ...

  9. Spring框架学习笔记(2)——面向切面编程AOP

    介绍 概念 面向切面编程AOP与面向对象编程OOP有所不同,AOP不是对OOP的替换,而是对OOP的一种补充,AOP增强了OOP. 假设我们有几个业务代码,都调用了某个方法,按照OOP的思想,我们就会 ...

  10. .netCore+Vue 搭建的简捷开发框架 (4)--NetCore 基础

    书接上文:上一节中,我们已经实现Services 层.(https://www.cnblogs.com/xuzhencheng/p/11424751.html) 但是具体要如何将服务依赖注入进来呢?继 ...