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://xiahunao.cn/news/2871275.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

大胆投资自己

> Keep Thinking 保持思考 1. 关于投资 首先需要做到 “ 精明 ” 的活着&#xff0c;如何做到精明呢&#xff1f; 所谓精明&#xff0c;也即清醒认识到自己当前所处的阶段&#xff0c;清楚知道下一步的应该朝哪一个方向努力&#xff01;人生就是一场长跑&#xff0c; 我们…

如何订阅Midjourney

Midjourney介绍 Midjourney作为目前AI绘画领域效果卓越且备受青睐的工具&#xff0c;对于新用户而言&#xff0c;可能无法享受到免费试用的机会。因此&#xff0c;为了持续利用这款软件进行绘画创作&#xff0c;用户需要购买会员资格并开通订阅服务。那么&#xff0c;关于midj…

【Godot 4.2】常见几何图形、网格、刻度线点求取函数及原理总结

概述 本篇为ShapePoints静态函数库的补充和辅助文档。ShapePoints函数库是一个用于生成常见几何图形顶点数据&#xff08;PackedVector2Array&#xff09;的静态函数库。生成的数据可用于_draw和Line2D、Polygon2D等进行绘制和显示。因为不断地持续扩展&#xff0c;ShapePoint…

ping和telnet的区别

ping是ICMP协议&#xff0c;只包含控制信息没有端口&#xff0c;用于测试两个网络主机之间网络是否畅通 telnet是TCP协议&#xff0c;用于查看目标主机某个端口是否开发。 总结&#xff1a;ping是物理计算机间的网络互通检查&#xff0c;telnet是应用服务间的访问连通检查&am…

HTML5:七天学会基础动画网页(end)

想了想还是有一点东西还没说&#xff0c;当然这块内容也比较简单&#xff0c;就是当我们有一段完整素材时&#xff0c;如下: 我在网上随便找的素材&#xff0c;当然我们平时在使用素材时要注意尊重他人的著作权&#xff0c;不管是字体图片还是别的&#xff0c;不然后面不小心侵…

滑动窗口最大值(leetcode hot100)

给你一个整数数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。 示例 1&#xff1a; 输入&#xff1a;nums [1,3,-1,-3,5,3,6,7], k 3 输…

【白嫖】100%中奖阿里云实物键盘、游戏机、苹果15

1.扫描下方二维码或者直接点击链接跳转 [阿里云-通义灵码] (https://developer.aliyun.com/topic/lingma/activities/202403?taskCode14508&recordIdb0e97482e51e08068012bbb1eb743a15#/?utm_contentm_fission_1%20%20%E3%80%8C%E9%80%9A%E4%B9%89%E7%81%B5%E7%A0%81%20…

Linux:系统初始化,内核优化,性能优化(2)

优化ssh协议 Linux&#xff1a;ssh配置_ssh配置文件-CSDN博客https://blog.csdn.net/w14768855/article/details/131520745?ops_request_misc%257B%2522request%255Fid%2522%253A%2522171068202516800197044705%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fb…

拼多多商品详情接口数据采集

拼多多商品详情接口数据采集是一个相对专业的任务&#xff0c;通常涉及到使用API接口或第三方采集工具等技术手段。以下是一些基本步骤和注意事项&#xff0c;供您参考&#xff1a; 请求示例&#xff0c;API接口接入Anzexi58 申请开发者账号&#xff1a;如果您打算使用API接口…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:Web)中篇

onBeforeUnload onBeforeUnload(callback: (event?: { url: string; message: string; result: JsResult }) > boolean) 刷新或关闭场景下&#xff0c;在即将离开当前页面时触发此回调。刷新或关闭当前页面应先通过点击等方式获取焦点&#xff0c;才会触发此回调。 参数…

【回归预测】基于SSA-BP(麻雀搜索算法优化BP神经网络)的回归预测 多输入单输出【Matlab代码#69】

文章目录 【可更换其他算法&#xff0c;获取资源请见文章第6节&#xff1a;资源获取】1. BP神经网络2. 麻雀搜索算法3. SSA-BP神经网络模型的构建4. 部分代码展示5. 仿真结果展示 【可更换其他算法&#xff0c;获取资源请见文章第6节&#xff1a;资源获取】 1. BP神经网络 BP&…

【开源】SpringBoot框架开发就医保险管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 科室档案模块2.2 医生档案模块2.3 预约挂号模块2.4 我的挂号模块 三、系统展示四、核心代码4.1 用户查询全部医生4.2 新增医生4.3 查询科室4.4 新增号源4.5 预约号源 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVue…

训练YOLOv8m时AMP显示v8n

在训练Yolov8模型时&#xff0c;使用AMP&#xff08;Automatic Mixed Precision&#xff09;可以加速训练过程并减少显存的使用。AMP是一种混合精度训练技术&#xff0c;它通过将模型参数的计算转换为低精度&#xff08;如半精度&#xff09;来提高训练速度&#xff0c;同时保持…

《LeetCode热题100》笔记题解思路技巧优化_Part_3

《LeetCode热题100》笔记&题解&思路&技巧&优化_Part_3 &#x1f60d;&#x1f60d;&#x1f60d; 相知&#x1f64c;&#x1f64c;&#x1f64c; 相识&#x1f622;&#x1f622;&#x1f622; 开始刷题链表&#x1f7e2;1. 相交链表&#x1f7e2;2. 反转链表&…

第四章:数据操作Ⅰ 第十三节:与MySQL联动

我们可以使用MySQL数据库来保存R的数据&#xff0c;或者可以借助数据框的强大功能协助R进行数据处理 一、MySOL安装和测试 MYSQL安装教程&#xff1a;https://blog.csdn.net/m0_52559040/article/details/121843945 注意&#xff1a;在选择账户界面时&#xff0c;我们除了要设置…

JavaScript 中实现请求并发控制

文章目录 浏览器并发请求限制数&#xff08;图&#xff09;实现代码三方插件 假设有 30 个待办任务要执行&#xff0c;而我们希望限制同时执行的任务个数&#xff0c;即最多只有 3 个任务能同时执行。当正在执行任务列表 中的任何 1 个任务完成后&#xff0c;程序会自动从 待办…

虚拟机 VMware下载及安装

centos官网&#xff1a;CentOS Mirror 虚拟机vmware官网&#xff1a;VMware 官网 一直点下一步就好了&#xff0c;有些配置按需修改即可 创建新的虚拟机 处理内核总数不能大于自己主机的逻辑处理器 安装操作系统&#xff1a;引入centos镜像 然后就可以点击开启此虚拟机&#xf…

Mysql的行级锁

MySQL 中锁定粒度最小的一种锁&#xff0c;是 针对索引字段加的锁 &#xff0c;只针对当前操作的行记录进行加锁。 行级锁能大大减少数据库操作的冲突。其加锁粒度最小&#xff0c;并发度高&#xff0c;但加锁的开销也最大&#xff0c;加锁慢&#xff0c;会出现死锁。行级锁和存…

从政府工作报告探究计算机行业发展

从政府工作报告探计算机行业发展 政府工作报告作为政府工作的全面总结和未来规划&#xff0c;不仅反映了国家整体的发展态势&#xff0c;也为各行各业提供了发展的指引和参考。随着信息技术的快速发展&#xff0c;计算机行业已经成为推动经济社会发展的重要引擎之一。因此&…

STM32第九节(中级篇):RCC(第一节)——时钟树讲解

目录 前言 STM32第九节&#xff08;中级篇&#xff09;&#xff1a;RCC——时钟树讲解 时钟树主系统时钟讲解 HSE时钟 HSI时钟 锁相环时钟 系统时钟 SW位控制 HCLK时钟 PCLKI时钟 PCLK2时钟 RTC时钟 MCO时钟输出 6.2.7时钟安全系统(CSS&#xff09; 小结 前言 从…