1、计划任务介绍

Windows计划任务介绍

1、含义:

简单点就是定时执行任务。

在许多场景下,我们定时执行一些任务。比如:定时拉取、备份文件,更新代码等等操作。

Win+R打开运行框,输入:control schedtasks,就会打开计划任务的UI。

在这里插入图片描述

2、代码介绍

虽然windows提供了schtasks程序可以创建计划任务,但是自定义程度还不是很高。

#ifndef win7taskscheduler_h
#define win7taskscheduler_h#include <vector>
#include <utility>
#include <string>#include <assert.h>#include <comdef.h>
#include <taskschd.h>#pragma comment(lib, "taskschd.lib")using std::pair;
using std::vector;
using std::wstring;
using std::to_wstring;namespace XIBAO {class Win7TaskScheduler{public:enum TaskMode:int {Normal = 1, // 普通模式,用户只有登录进去才会触发LOGON_PASSWD, // 输入用户名和密码的模式,这种模式不用登录也能触发SYSTEM  // system权限登录};public:Win7TaskScheduler() {}~Win7TaskScheduler() {}private:
class ITaskServiceHelper
{
public:ITaskServiceHelper()		{	p = NULL;	}~ITaskServiceHelper()		{	if ( p ) p->Release();	}ITaskService * p;
};class ITaskFolderHelper
{
public:ITaskFolderHelper()			{	p = NULL;	}~ITaskFolderHelper()		{	if ( p ) p->Release();	}ITaskFolder * p;
};class ITaskDefinitionHelper
{
public:ITaskDefinitionHelper()		{	p = NULL;	}~ITaskDefinitionHelper()	{	if ( p ) p->Release();	}ITaskDefinition * p;
};class IRegistrationInfoHelper
{
public:IRegistrationInfoHelper()	{	p = NULL;	}~IRegistrationInfoHelper()	{	if ( p ) p->Release();	}IRegistrationInfo * p;
};class IPrincipalHelper
{
public:IPrincipalHelper()			{	p = NULL;	}~IPrincipalHelper()			{	if ( p ) p->Release();	}IPrincipal * p;
};class ITaskSettingsHelper
{
public:ITaskSettingsHelper()		{	p = NULL;	}~ITaskSettingsHelper()		{	if ( p ) p->Release();	}ITaskSettings * p;
};class ITriggerCollectionHelper
{
public:ITriggerCollectionHelper()	{	p = NULL;	}~ITriggerCollectionHelper()	{	if ( p ) p->Release();	}ITriggerCollection * p;
};class ITriggerHelper
{
public:ITriggerHelper()			{	p = NULL;	}~ITriggerHelper()			{	if ( p ) p->Release();	}ITrigger * p;
};class IDailyTriggerHelper
{
public:IDailyTriggerHelper()			{	p = NULL;	}~IDailyTriggerHelper()			{	if ( p ) p->Release();	}IDailyTrigger * p;
};class IRegistrationTriggerHelper
{
public:IRegistrationTriggerHelper(){	p = NULL;	}~IRegistrationTriggerHelper(){	if ( p ) p->Release();	}IRegistrationTrigger * p;
};class IActionCollectionHelper
{
public:IActionCollectionHelper()	{	p = NULL;	}~IActionCollectionHelper()	{	if ( p ) p->Release();	}IActionCollection * p;
};class IActionHelper
{
public:IActionHelper()				{	p = NULL;	}~IActionHelper()			{	if ( p ) p->Release();	}IAction * p;
};class IExecActionHelper
{
public:IExecActionHelper()			{	p = NULL;	}~IExecActionHelper()		{	if ( p ) p->Release();	}IExecAction * p;
};class IRegisteredTaskHelper
{
public:IRegisteredTaskHelper()		{	p = NULL;	}~IRegisteredTaskHelper()	{	if ( p ) p->Release();	}IRegisteredTask * p;
};#define DO( action )		\if( FAILED( action ) )	\
{						\assert( FALSE );	\return FALSE;		\
}public:
static HRESULT Create2MoreWin7(const wstring &appPath,const wstring &taskName,const wstring &taskDescription,const wstring &appWorkDir,const wstring &parameter,const vector<pair<int, int>> &vecTime,const wstring &userName,const wstring &passwd,int mode)
{CoInitialize(NULL);HRESULT hr = 0;ITaskServiceHelper iService;hr = CoCreateInstance( CLSID_TaskScheduler,NULL,CLSCTX_INPROC_SERVER,IID_ITaskService,(void**)&iService.p);//  Connect to the task service.DO( iService.p->Connect( _variant_t(), _variant_t(), _variant_t(), _variant_t()) )//  Get the pointer to the root task folder.  This folder will hold the//  new task that is registered.ITaskFolderHelper iRootFolder;DO( iService.p->GetFolder( _bstr_t( L"\\") , &iRootFolder.p ) )ITaskFolderHelper iNewFolder;IRegisteredTaskHelper iRegisteredTask;ITaskDefinitionHelper iTask;BOOL bTmp = FALSE;DO( iService.p->NewTask( 0, &iTask.p ) )// DO( iService->NewTask( 0, &iTask.p ) )IRegistrationInfoHelper info;DO(iTask.p->get_RegistrationInfo(&(info.p)))if (nullptr != info.p) { (info.p)->put_Description(_bstr_t(taskDescription.c_str())); }IActionCollectionHelper iActionCollection;DO( iTask.p->get_Actions( &iActionCollection.p ) )IActionHelper iAction;DO( iActionCollection.p->Create( TASK_ACTION_EXEC, &iAction.p ) )IExecActionHelper iExecAction;//  QI for the executable task pointer.DO( iAction.p->QueryInterface( IID_IExecAction, (void**) &iExecAction.p ) )//  Set the path of the executable to notepad.exe.DO( iExecAction.p->put_Path( _bstr_t( appPath.c_str() ) ) )if(! parameter.empty()){DO( iExecAction.p->put_Arguments(_bstr_t(parameter.c_str())))}if(! appWorkDir.empty()){DO( iExecAction.p->put_WorkingDirectory(_bstr_t(appWorkDir.c_str())))}ITriggerCollectionHelper iTriggerCollection;DO( iTask.p->get_Triggers( &iTriggerCollection.p ) )ITaskSettingsHelper iTaskSettings; DO( iTask.p->get_Settings(&iTaskSettings.p) )iTaskSettings.p->put_DisallowStartIfOnBatteries(VARIANT_BOOL(FALSE));iTaskSettings.p->put_StopIfGoingOnBatteries(VARIANT_BOOL(FALSE));{for (int i = 0; i < vecTime.size(); ++i) {ITriggerHelper iTrigger;DO( iTriggerCollection.p->Create( TASK_TRIGGER_DAILY,&iTrigger.p ) )IDailyTrigger *dailyTriger = nullptr;iTrigger.p->QueryInterface(IID_IDailyTrigger, (void **)&dailyTriger);	if (nullptr != dailyTriger) {wstring triggerid = taskName + L"_" + to_wstring(i);dailyTriger->put_Id(_bstr_t(triggerid.c_str()));dailyTriger->put_DaysInterval(1);wstring strstarttime = L"2019-01-01T" + to_wstring(vecTime[i].first) + L":" + to_wstring(vecTime[i].second) + L":00";dailyTriger->put_StartBoundary(_bstr_t(strstarttime.c_str()));dailyTriger->put_EndBoundary(_bstr_t(L"2099-12-31T00:00:00"));dailyTriger->put_Enabled(true);}}}IPrincipalHelper iPrincipal;DO( iTask.p->get_Principal( &iPrincipal.p ) )DO(iPrincipal.p->put_RunLevel(TASK_RUNLEVEL_LUA))if (mode == TaskMode::SYSTEM){hr = iRootFolder.p->RegisterTaskDefinition(_bstr_t(taskName.c_str()),iTask.p,TASK_CREATE_OR_UPDATE, _variant_t(L"SYSTEM"),_variant_t(), TASK_LOGON_SERVICE_ACCOUNT,_variant_t(L""),&iRegisteredTask.p);}else if (mode == TaskMode::LOGON_PASSWD){hr = iRootFolder.p->RegisterTaskDefinition(_bstr_t(taskName.c_str()),iTask.p,TASK_CREATE_OR_UPDATE, _variant_t(userName.c_str()),_variant_t(passwd.c_str()),TASK_LOGON_PASSWORD,_variant_t(L""),&iRegisteredTask.p);}else{hr = iRootFolder.p->RegisterTaskDefinition(_bstr_t(taskName.c_str()),iTask.p,TASK_CREATE_OR_UPDATE, _variant_t(L""),_variant_t(L""),TASK_LOGON_INTERACTIVE_TOKEN,_variant_t(L""),&iRegisteredTask.p);}return hr;
}static bool Delete2MoreWin7(const wstring &taskName)
{ITaskServiceHelper iService;HRESULT hr = CoCreateInstance( CLSID_TaskScheduler,NULL,CLSCTX_INPROC_SERVER,IID_ITaskService,(void**)&iService.p );DO( iService.p->Connect(_variant_t(), _variant_t(), _variant_t(), _variant_t()))ITaskFolderHelper iRootFolder;DO( iService.p->GetFolder( _bstr_t( L"\\") , &iRootFolder.p ) )IRegisteredTaskHelper iRegisteredTask;ITaskDefinitionHelper iTask;hr = iRootFolder.p->GetTask(_bstr_t(taskName.c_str()),&iRegisteredTask.p);hr = iRootFolder.p->DeleteTask(_bstr_t(taskName.c_str()),0);return true;
}};};#endif // win7taskscheduler_hint main()
{result = Win7TaskScheduler::Create2MoreWin7(mAppPath,mTaskName,mTaskDescription,mAppWorkDir, mParameter, mVecTime,mUserName,mPassword,mode);return result;
}

这里的接口提供了删除、创建的接口。所以用起来还是非常容易上手。

3、注意事项

在执行计划任务的时候,如果你是system权限一定要注意权限的问题。很多软件在system下时获取的环境变量和正常用户获取的不一样,导致一些出乎意料的bug。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/537785.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LLM和自动驾驶强强联合 | DriveDreamer-2:自动驾驶定制视频生成世界模型!

文章链接&#xff1a;https://arxiv.org/pdf/2403.06845.pdf 项目文档&#xff1a;https://drivedreamer2.github.io/ 自动驾驶是最近几年非常火热的方向&#xff0c;那LLM和视频生成在自动驾驶领域有哪些应用呢&#xff1f;今天和大家一起学习一下最新的一篇工作————Driv…

多线程相关

JMM&#xff08;内存模型&#xff09; JMM三个特性&#xff1a; 原子性 一个或者多个操作在CPU执行的过程中不被中断的特性&#xff0c;要么全部成功&#xff0c;要么全部失败可见性 一个线程修改了共享变量的值后&#xff0c;其他线程能够立即看到这个修改有序性 程序执行的…

武汉LUG报名开启!这次我们来到了华中科技大学,3月23日(周六)来见面吧!

内容来源&#xff1a;deepin 社区 LUG 不间断&#xff0c;精彩不停歇&#xff0c;经过一个月的修整&#xff0c;2024年3月23日下午&#xff0c;我们将在华中科技大学东校区举办 3月 WHLUG&#xff0c;欢迎大家来到现场&#xff0c;和我们一起交流技术&#xff0c;分享自己学习过…

惊艳到了,每个开发人员都必须要知道的6个HTML属性!

前端训练营&#xff1a;1v1私教&#xff0c;终身辅导计划&#xff0c;帮你拿到满意的 offer。 已帮助数百位同学拿到了中大厂 offer。欢迎来撩~~~~~~~~ Hello&#xff0c;大家好&#xff0c;我是 Sunday。 说起 HTML 很多同学都会认为&#xff0c;这不就是小菜一碟吗&#xff…

大型污水处理站运维公司怎么选择

大型污水处理站运维公司的选择是关乎环境保护和城市发展的重要决策。在如今污水治理领域日益重要的背景下&#xff0c;选择一家专业的运维公司对于确保污水处理站的高效运行、提高处理效果和保护环境具有关键意义。那么&#xff0c;我们应该如何选择适合自己的大型污水处理站运…

Css基础——精灵图(sprites)和字体图标

1、精灵图 1.1、精灵图的由来 一个网页中往往会应用很多小的背景图像作为修饰&#xff0c;当网页中的图像过多时&#xff0c;服务器就会频繁地接收和发送 请求图片&#xff0c;造成服务器请求压力过大&#xff0c;这将大大降低页面的加载速度。 因此&#xff0c;为了有效地减…

腾讯云服务器地域是什么?地域选择看着一篇就够了

腾讯云服务器地域怎么选择&#xff1f;不同地域之间有什么区别&#xff1f;腾讯云哪个地域好&#xff1f;地域选择遵循就近原则&#xff0c;访客距离地域越近网络延迟越低&#xff0c;速度越快。腾讯云百科txybk.com告诉大家关于地域的选择还有很多因素&#xff0c;地域节点选择…

Python (用户登录、身份归属地查询添加异常处理、绘制多角星、电影信息提取)

任务一&#xff1a;用户登录 登录系统通常分为普通用户与管理员权限&#xff0c;在用户登录系统时&#xff0c;可以根据自身权限进行选择登录。本任务要求实现一个用户登录的程序&#xff0c;该程序分为管理员用户与普通用户&#xff0c;其中管理员账号密码在程序中设定&#…

亚太大带宽服务器怎么设置

亚太大带宽服务器怎么设置&#xff0c;要设置亚太大带宽服务器&#xff0c;您需要考虑以下几个关键步骤&#xff0c;RAK部落小编为您整理发布亚太大带宽服务器怎么设置的具体步骤。 1. 选择合适的服务提供商&#xff1a;您需要选择一个提供亚太地区大带宽服务器的服务提供商。2…

靶向性叶酸-壳聚糖 FA-Chitosan 靶向纳米药物递送材料

产品简称&#xff1a;Chitosan-FA/ FA-Chitosan/CS-FA /FA-CS/Chitosan-Folate/ Folate-Chitosan/CS-Folate /Folate-CS 产品中文名称&#xff1a;壳聚糖-叶酸 / 叶酸-壳聚糖 分子量&#xff1a;可以根据要求定制 保存条件&#xff1a; -20干燥保存 有效期&#xff1a; 一年…

西门子PLC常用底层逻辑块分享_单/双输出电机

文章目录 前言一、功能概述二、单输出电机程序编写1.创建自定义数据类型2.创建FB功能块“单输出电机”3.编写程序 三、双输出电机程序编写1.创建自定义数据类型2.创建FB功能块“双输出电机”3.编写程序 前言 本文分享一个自己编写的电机控制逻辑块。 一、功能概述 手动状态、…

python 爬取人民新闻

基础信息获取&#xff1a; 要闻url&#xff1a;https://www.gov.cn/yaowen/liebiao/home.htm 下一页的url&#xff1a;https://www.gov.cn/yaowen/liebiao/home_1.htm 基础代码&#xff1a; import re import openpyxl import requests from lxml import etree import osdef …