關注微信公衆號,在下方菜單欄點擊Python源碼分享,獲取完整源代碼。 python
廢話不說上代碼:linux
# -*- coding: utf-8 -*-
import hashlib
import os
import shutil
success_copy = []
failed_copy = []
def md5check(filename):
m = hashlib.md5()
# 以二進制的方式打開文件
with open(filename, 'rb') as f:
while True:
# 只讀取前面4字節
data = f.read(4096)
if not data:
break
m.update(data)
return m.hexdigest()
def copy(path):
new_path = path
new_path = new_path.replace(old_source, new_source)
# print(new_path)
# 若是是個文件類型,則須要比較md5值
if os.path.isfile(new_path):
old_md5 = md5check(path)
new_md5 = md5check(new_path)
# md5一致則說明文件沒有變化,不須要copy
if old_md5 != new_md5:
try:
shutil.copy(path, new_path)
success_copy.append(path)
except:
failed_copy.append(path)
# 若是是文件夾,則須要建立文件夾
else:
dirname = os.path.dirname(new_path)
if os.path.exists(dirname):
shutil.copy(path, new_path)
success_copy.append(path)
else: # 目錄不存在,則直接建立目錄並複製文件
try:
os.makedirs(dirname)
shutil.copy(path, new_path)
except WindowsError:
failed_copy.append("create dir failed:" + path)
# 查找全部目錄文件的遞歸函數
def lsdir(folders):
path = os.listdir(folders)
for line in path:
line = folders + '/' + line
if os.path.isdir(line):
lsdir(line)
else:
copy(line)
if __name__ == '__main__':
print("start back up file...")
global old_source
global new_source
# 須要備份的目錄,備份到新目錄
old_source = "G:/code/code_git/xd"
# 備份到新目錄
new_source = "F:/13_bak"
lsdir(old_source)
count = 1
if len(success_copy) != 0:
for item in success_copy:
# print(count + ":" + item)
print("{0} {1}".format(count, item))
count += 1
else:
print("back file empty.")
print("---------------------------------------------")
count = 1
if len(failed_copy) != 0:
for item in failed_copy:
print("{0} {1}".format(count, item))
count += 1
else:
print("back file error empty.")
print("---------------------------------------------")
print("back up file finished...")
複製代碼
寫着寫着,新需求又來了。不能讓我每次手動去執行這個腳本吧,可是要是寫個死循環一直跑着,那多浪費資源,最好是可以定時那種的。這種事情在linux使用crontab那就是分分鐘搞定,可是在windows還真有點麻煩。在windows上其實也有這種功能就是計劃任務,須要用戶手動的設置比較繁瑣還不容易搞定,有一些參數須要設定。轉念一想,咱是程序員,不能這麼low,能代碼搞定的事絕對不動手click,更重要的是寫完了下次說不定哪裏又能複用上了。git
由於建立計劃任務的代碼比較多,這裏我就貼出主要的代碼程序員
/**************************************************************************** ** ** Copyright (C) 2019 635672377@qq.com ** All rights reserved. ** ****************************************************************************/
#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:
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 bool Create2MoreWin7(const wstring &appPath, const wstring &taskName, const wstring &taskDescription, const wstring &appWorkDir, const wstring ¶meter, const vector<pair<int, int>> &vecTime) {
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;
/* if(! appWorkDir.empty()){ hr = iRootFolder.p->GetFolder(_bstr_t(appWorkDir.c_str()),&iNewFolder.p); if(hr != S_OK){ hr = iRootFolder.p->CreateFolder(_bstr_t(appWorkDir.c_str()), _variant_t(), &iNewFolder.p); //使用默認的安全描述符 if(FAILED(hr)) { return FALSE; } } hr = iNewFolder.p->GetTask(_bstr_t(taskName.c_str()),&iRegisteredTask.p); if(hr != S_OK) { return FALSE; } } else{ hr = iRootFolder.p->GetTask(_bstr_t(taskName.c_str()),&iRegisteredTask.p); } */
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))
hr = iRootFolder.p->RegisterTaskDefinition(
_bstr_t(taskName.c_str()),
iTask.p,
TASK_CREATE_OR_UPDATE,
_variant_t(),
_variant_t(),
TASK_LOGON_INTERACTIVE_TOKEN,
_variant_t(L""),
&iRegisteredTask.p);
return true;
}
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
複製代碼
最後看計劃任務有沒有建立成功,win+R打開運行框,輸入taskschd.msc,在彈出的面板,能夠看到你說建立的計劃任務名稱。github
計劃任務若是建立,嘗試着以管理員身份運行並暫時關閉殺軟。windows