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

废话不多说,直接看方案

步骤:

先找到可以实现这个逻辑的类或者是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. Intellij IDEA在maven项目中添加外部Jar包运行

    一. 问题概述 我们知道Intellij IDEA是非常好用的Java语言开发的集成环境.提供了非常多实用的功能,包括了智能代码助手.代码自动提示.代码重构.各种插件等,当然也集成了maven 正常情 ...

  2. Docker搭建disconf环境,三部曲之一:极速搭建disconf

    Docker下的disconf实战全文链接 <Docker搭建disconf环境,三部曲之一:极速搭建disconf>: <Docker搭建disconf环境,三部曲之二:本地快速构 ...

  3. Go语言基础之网络编程

    现在我们几乎每天都在使用互联网,我们前面已经学习了如何编写Go语言程序,但是如何才能让我们的程序通过网络互相通信呢?本章我们就一起来学习下Go语言中的网络编程. 关于网络编程其实是一个很庞大的领域,本 ...

  4. 【原创】(四)Linux内存模型之Sparse Memory Model

    背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: Kernel版本: ...

  5. Docker下kafka学习三部曲之二:本地环境搭建

    在上一章< Docker下kafka学习,三部曲之一:极速体验kafka>中我们快速体验了kafka的消息分发和订阅功能,但是对环境搭建的印象仅仅是执行了几个命令和脚本,本章我们通过实战来 ...

  6. pageable多字段排序问题

    Sort sort = new Sort(Sort.Direction.DESC, "createdate") .and(new Sort(Sort.Direction.AES, ...

  7. WTM送书活动:向更遥远的星辰大海起航~

    是的,没错~ 这一篇不是大老刘写的.哈哈~ 啥?  你想知道为啥? 大老刘为了你们不加班,熬夜改BUG,姑娘不乐意了... 然后... 后面请自行脑补~ 哎~生活还要继续鸭.... 那么,接下来由我陪 ...

  8. 微信小程序点击控制元素的显示与隐藏

    微信小程序点击控制元素的显示与隐藏 首先我们先来看一下单个点击效果 我们来看一下wxml中的代码: <view class="conten"> <view cla ...

  9. 在Typora中使用Markdown

    在Typora中使用Markdown 记:准备正式开始在博客园写博客,故学习Markdown语法,为写博客做好准备.以前也在CSDN写过一些,但广告太多,个人更喜欢博客园的简洁. 1. 标题 (#)标 ...

  10. 论文阅读 | DeepDrawing: A Deep Learning Approach to Graph Drawing

    作者:Yong Wang, Zhihua Jin, Qianwen Wang, Weiwei Cui, Tengfei Ma and Huamin Qu 本文发表于VIS2019, 来自于香港科技大学 ...