1、计划任务介绍

news2024/10/5 23:44:54

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_h


int main()
{
    result = Win7TaskScheduler::Create2MoreWin7(mAppPath,
                                                mTaskName,
                                                mTaskDescription,
                                                mAppWorkDir, 
                                                mParameter, 
                                                mVecTime,
                                                mUserName,
                                                mPassword,
                                                mode);
    return result;
}

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

3、注意事项

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

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

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

相关文章

SAR ADC系列4——比较器的Transient noise仿真--等效输入噪声

仿真出等效输入噪声 加一个快于实际工作的时钟频率&#xff1b;在输入端加一个DC的差&#xff08;比如一端是0.5VDD&#xff0c;另外一端加0.5VDD0.2MV)计算仿真时间内的correct counting number&#xff0c;比如时钟频率是200MHz&#xff0c;仿真时间是5us&#xff0c;那么应…

IMX8MM -- Yocto构建遇见的错误及解决方法:

IMX8MM Yocto构建遇见的错误及解决方法&#xff1a; 1 bison-3.0.4 error2 Opencv BB_NO_NETWORK Error &#xff1a;3 Yocto构建时出现U-boot 问题4 Yocto构建时出现Linux kernel编译问题5 wayland-native6 cross-localedef-native7 wayland-protocols8 mesa 硬件&#xff1a;…

[论文精读]Dynamic Coarse-to-Fine Learning for Oriented Tiny Object Detection

论文网址&#xff1a;[2304.08876] 用于定向微小目标检测的动态粗到细学习 (arxiv.org) 论文代码&#xff1a;https://github.com/ChaselTsui/mmrotate-dcfl 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&…

android MMKV数据持久化缓存集合

前言 最近在使用mmkv缓存的时候 发现没有集合缓存 非常不方便 自己写一个方法 MMKV public class MmkvUtils {private MmkvUtils() {throw new UnsupportedOperationException("u cant instantiate me...");}public static void init() {MMKV.initialize(LeoUtils…

C语言从入门到熟悉------第三阶段

数组 什么是数组呢&#xff1f;顾名思义数组就是很多数的组合&#xff01;那么这些数有没有什么要求呢&#xff1f;是不是不管什么数组合在一起都是数组呢&#xff1f;第一&#xff0c;这些数的类型必须相同&#xff01;第二&#xff0c;这些数在内存中必须是连续存储的。也就…

力扣思路题:重复的子字符串

注意比较j与j-i是否相同 bool repeatedSubstringPattern(char* s) {int i;int nstrlen(s);bool flag;for(int i1;i<n/2;i){if(n%i0){flagtrue;}for(int ji;j<n;j){if(s[j]!s[j-i]){flagfalse;break;}}if(flagtrue){return true;}}return false; }

Python爬虫基础学习-互联网、HTTP与HTML

互联网或者叫国际网&#xff08;Internet&#xff09;&#xff0c;是指网络与网络之间所串连成的庞大网络&#xff0c;这些网络以一组标准的网络TCP/IP协议族相连&#xff0c;连接全世界几十亿个设备&#xff0c;形成逻辑上的单一巨大国际网络。它是由从地方到全球范围内几百万…

【算法】一类支持向量机OC-SVM(2)

【算法】一类支持向量机OC-SVM&#xff08;2&#xff09; 前言纠正内容数据集创建方式适应度函数 新增内容散点图示例模型散点图展示 前言 在上则博文【算法】一类支持向量机OC-SVM&#xff08;1&#xff09; 中&#xff0c;我们提及到了蜂群算法优化一类支持向量机超参数模型…

gpt-4-all模型中转实现

最近才完成这个功能&#xff0c;相信知道这个模型的人&#xff0c;应该已经熟悉了。这是我的中转&#xff1a;openai-api Chatbox配置如下&#xff1a; 模型测试&#xff1a; 1&#xff09;图片生成 2&#xff09;文件分析&#xff0c;链接读取&#xff1a;

WWW2024 | PromptMM:Prompt-Tuning增强的知识蒸馏助力多模态推荐系统

论文&#xff1a;https://arxiv.org/html/2402.17188v1 代码&#xff1a;https://github.com/HKUDS/PromptMM 研究动机 多模态推荐系统极大的便利了人们的生活,比如亚马逊和Netflix都是基于多模态内容进行推荐的。对于研究,人们也遵循工业界的趋势,进行modality-aware的用户…

初步了解序列化和反序列化

01什么是序列化和反序列化 序列化是将对象转化为字符串以便存储的一种方式。而反序列化恰好是序列化的逆过程&#xff0c;反序列化会将字符串转化为对象供程序使用。 常见的php系列化和反系列化方式主要有&#xff1a;serialize&#xff0c;unserialize&#xff1b;json_enco…

删除元素.

C 用迭代器迭代&#xff0c;当条件成立删除元素。 class Solution { public:int removeElement(vector<int>& nums, int val) {for(std::vector<int>::iterator itnums.begin();it!nums.end();){if(*itval){itnums.erase(it);//vector删除时迭代器会失效&…

jenkins 使用k8s插件连接k8s集群

jenkins 安装k8s 插件 配置k8s节点 填写k8s 配置信息 生成秘钥 在服务器上面 查看地址 Kubernetes 服务证书 key cat /root/..kube/config 查看秘钥 对秘钥进行base64 位 加密 echo "秘钥内容" | base64 -d -----BEGIN CERTIFICATE----- MIIDITCCAgmgAwIB…

第一位 AI 程序员诞生,队友还是对手?

前几天&#xff0c;百度创始人李彦宏在采访中声称&#xff1a;“以后不会存在“程序员”这种职业了&#xff0c;因为只要会说话&#xff0c;人人都会具备程序员的能力”。 看到这话我的第一反应是“不可能&#xff0c;绝对不可能&#xff0c;程序员的工作有很大一部分是创造性的…

顺序表后续以及通讯录项目

⽬录 1. 基于动态顺序表实现通讯录项⽬ 2. 顺序表经典算法 3. 顺序表的问题及思考 正⽂开始 继上一篇 1.动态顺序表的查找 这里挺简单的如找不到就返回一个负数&#xff0c;因为索引不可能是负的这里就用来代表找不到 下面是找不到的示例 最终代码可以优化成这样 2.动态…

2024-03-13 作业

网络编程&#xff1a; 1.思维导图&#xff1a; 2.上课写的代码&#xff1a; 2.1网络字节序与主机字节序转换 运行代码&#xff1a; #include <myhead.h> int main() {int num 0x12345678;short int value 0x1234;int num_n htonl(num);int value_n htons(value);…

Window API 使用的一些注意事项

文章目录 1、LPCWSTR类型2、LPCTSTR类型3、LPCSTR类型4、LPCTSTR和LPCWSTR区别5、LPCTSTR和LPCSTR、LPCWSTR三者区别6、_T(" ")7、DWORD类型转换为std::wstring类型8、char类型转换为LPCSTR类型9、获取当前时间戳(毫秒)10、std::wstring和LPCSTR区别11、std::wstring…

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

组件提供勾选框样式、状态按钮样式及开关样式。 说明&#xff1a; 该组件从API Version 8开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 仅当ToggleType为Button时可包含子组件。 接口 Toggle(options: { type: ToggleType, is…

android studio 连接mumu模拟器调试

1、打开mumu模拟器 2、在Android Studio 中 控制台 cd 到 sdk 目录下 platform-tools 文件夹&#xff0c;有一个adb.exe 可运行程序 一般指令&#xff1a; adb connect 127.0.0.1:7555 但是这个执行在window环境下可能会报错 解决方法是在 adb 之前加 ".\", 问题…

精读《正交的 React 组件》

1 引言 搭配了合适的设计模式的代码&#xff0c;才可拥有良好的可维护性&#xff0c;The Benefits of Orthogonal React Components 这篇文章就重点介绍了正交性原理。 所谓正交&#xff0c;即模块之间不会相互影响。想象一个音响的音量与换台按钮间如果不是正交关系&#xf…