背景:本地Windows系统指定目录下会有文件的修改新增,这些变化的文件需要定时的被上传到git仓库中,这样不需要每次变更手动上传了。

首先编写一个检测文件夹下文件变化并且上传git仓库的python脚本(确保你已经在E:\edc_workspace\data_edc_etl目录下初始化了Git,并且正确配置了远程仓库)

import os
import subprocess
from datetime import datetime
import logging
# 设置日志
log_file = "E:\\edc_workspace\\data_edc_etl\\upload.log"
logging.basicConfig(filename=log_file, filemode='a', format='%(asctime)s - %(message)s', level=logging.INFO)
# 文件夹路径
folder_path = "E:\\edc_workspace\\data_edc_etl"
# 上次检查时间的文件路径
last_check_file = "E:\\edc_workspace\\data_edc_etl\\last_check.txt"
def get_last_check_time():
    try:
        with open(last_check_file, 'r') as f:
            last_check_str = f.read()
        return datetime.fromisoformat(last_check_str)
    except Exception as e:
        logging.error(f"Error reading last check time: {e}")
        # 如果无法读取上次检查的时间,返回当前时间
        return datetime.now()
def set_last_check_time():
    now = datetime.now()
    with open(last_check_file, 'w') as f:
        f.write(now.isoformat())
def check_for_changes(folder_path, last_check):
    has_changes = False
    for root, dirs, files in os.walk(folder_path):
        for file in files:
            file_path = os.path.join(root, file)
            last_modified_time = datetime.fromtimestamp(os.path.getmtime(file_path))
            if last_modified_time >= last_check:
                logging.info(f"Detected change in file: {file_path}")
                has_changes = True
    return has_changes
def upload_to_git():
    try:
        os.chdir(folder_path)  # Change directory to the repo
        subprocess.run(["git", "add", "."], check=True)  # Stage changes
        subprocess.run(["git", "commit", "-m", "watchdog自动上传本地数据仓库文件"], check=True)  # Commit changes
        subprocess.run(["git", "push", "origin", "master"], check=True)  # Push changes
        logging.info("Changes pushed to git.")
    except subprocess.CalledProcessError as e:
        logging.error(f"Failed to upload to git: {e}")
if __name__ == "__main__":
    last_check = get_last_check_time()
    if check_for_changes(folder_path, last_check):
        upload_to_git()
    else:
        logging.info("No changes detected.")
    set_last_check_time()

文件手动测试OK

win10python脚本崩溃自动重启 windows跑python脚本_python

接下来配置Windows的定时任务:

1、打开【任务计划程序】
打开任务计划程序的方式有很多,打开控制面板,点击系统和安全,可以看到任务计划程序

win10python脚本崩溃自动重启 windows跑python脚本_绝对路径_02

2、打开【创建任务】窗口
创建一个文件夹用来存放你的定时任务文件,选择现有的目录也可以,但是下次你可能就很难找到新建的任务,选择新建的文件夹,右键点击“创建任务”,打开任务创建窗口。

win10python脚本崩溃自动重启 windows跑python脚本_win10python脚本崩溃自动重启_03

3、创建任务一一常规
任务名称为必填项,其他可以根据实际需要选填

win10python脚本崩溃自动重启 windows跑python脚本_开发语言_04

4、创建任务一一触发器
在"触发器"tab界面,点击"新建",打开"新建触发器"窗口

win10python脚本崩溃自动重启 windows跑python脚本_git_05

win10python脚本崩溃自动重启 windows跑python脚本_开发语言_06

下拉列表中有多种开始任务的策略,选择不同的选项,下方的填写项也会有变化。我这里就选择常用的 “按预定计划”;

其他配置根据实际需求选择配置。

5、创建任务一一操作
在"操作"tab界面,点击"新建",打开"新建操作"窗口

win10python脚本崩溃自动重启 windows跑python脚本_git_07

win10python脚本崩溃自动重启 windows跑python脚本_win10python脚本崩溃自动重启_08

程序或脚本:
方式1:直接填写 python,前提是 python 解释器 路径已配置到了 Path 环境变量;
方式2:填写 python 解释器的 绝对路径,如D:\Chen\Python\Python3.12.4\python.exe

添加参数:
填写脚本路径及脚本需要的参数
1)如果"起始于"项未填写,则脚本路径需要绝对路径;
2)如果"起始于"项填写了,则脚本路径可以填绝对路径,也可以填相对路径(相对于"起始于"给的路径);
3)脚本如果需要参数,在脚本名称后空格,然后跟传参值即可,多个参数值之间也用空格隔开。

起始于:
程序或脚本打开时的工作路径
1)如果未填写,脚本需要给出绝对路径,且脚本代码内如果有使用文件或目录的地方,也需要使用绝对路径,否则会找不到对应文件或目录;
2)如果填写了,脚本可以使用相对路径,且脚本代码内如果有使用文件或目录的地方,也可以使用相对路径;

6、创建任务一一条件
创建任务执行的条件,这里的条件与触发器是且的关系,即 触发器和条件同时满足时才会执行任务

win10python脚本崩溃自动重启 windows跑python脚本_git_09

这里有一点需要注意,如果你的脚本需要联网才能正常运行,需要勾选"只有在以下网络连接可用时才启动",并且选择对应的网络

7、创建任务一一设置
设置影响任务行为的其他设置

win10python脚本崩溃自动重启 windows跑python脚本_git_10

8、完成任务创建
设置完后,最后点击"确认",完成任务创建。

win10python脚本崩溃自动重启 windows跑python脚本_绝对路径_11

任务创建完成后,可以查看任务配置信息,如上图所示。

如果想要修改任务,可以点击右侧的"属性",打开任务编辑窗口进行相关修改。

任务会在设定的时间去执行,在"上次运行结果"可以看到最近一次任务执行的状态,会有对应的状态码及提示信息。

验证:

查看日志:

win10python脚本崩溃自动重启 windows跑python脚本_python_12

查看远程仓库:

win10python脚本崩溃自动重启 windows跑python脚本_git_13