批量修改文件创建时间的脚本

wen 实用脚本 3

本文目录导读:

批量修改文件创建时间的脚本

  1. Python脚本(适用于Windows)
  2. 使用方法
  3. 备用方案:使用PowerShell脚本
  4. 注意事项

我来为您提供一个批量修改文件创建时间的Python脚本,支持多种修改方式:

Python脚本(适用于Windows)

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
批量修改文件创建时间脚本
支持Windows系统(创建时间仅在Windows有效)
"""
import os
import sys
import argparse
from datetime import datetime
import win32file
import win32con
import pywintypes
def modify_file_time(file_path, create_time, modify_time=None, access_time=None):
    """
    修改文件的创建、修改和访问时间
    参数:
        file_path: 文件路径
        create_time: 创建时间 (datetime对象)
        modify_time: 修改时间 (datetime对象, 可选)
        access_time: 访问时间 (datetime对象, 可选)
    """
    try:
        # 转换为Windows时间格式
        if create_time:
            create_win = pywintypes.Time(create_time)
        else:
            create_win = None
        if modify_time:
            modify_win = pywintypes.Time(modify_time)
        else:
            modify_win = None
        if access_time:
            access_win = pywintypes.Time(access_time)
        else:
            access_win = None
        # 打开文件
        handle = win32file.CreateFile(
            file_path,
            win32con.GENERIC_WRITE,
            win32con.FILE_SHARE_READ | win32con.FILE_SHARE_WRITE,
            None,
            win32con.OPEN_EXISTING,
            win32con.FILE_ATTRIBUTE_NORMAL,
            None
        )
        # 修改时间
        win32file.SetFileTime(handle, create_win, access_win, modify_win)
        handle.close()
        return True
    except Exception as e:
        print(f"错误: 修改 {file_path} 失败 - {str(e)}")
        return False
def batch_modify(directory, create_date=None, modify_date=None, 
                 access_date=None, extension="*", recursive=False):
    """批量修改文件时间"""
    # 构建文件搜索模式
    if extension == "*":
        pattern = "*"
    else:
        if not extension.startswith("."):
            extension = "." + extension
        pattern = f"*{extension}"
    # 获取文件列表
    file_list = []
    if recursive:
        for root, dirs, files in os.walk(directory):
            for file in files:
                if pattern == "*" or file.endswith(pattern):
                    file_list.append(os.path.join(root, file))
    else:
        for file in os.listdir(directory):
            if pattern == "*" or file.endswith(pattern):
                file_path = os.path.join(directory, file)
                if os.path.isfile(file_path):
                    file_list.append(file_path)
    if not file_list:
        print("未找到符合条件的文件")
        return
    # 批量修改
    success_count = 0
    print(f"找到 {len(file_list)} 个文件,开始修改...")
    for i, file_path in enumerate(file_list, 1):
        print(f"处理 [{i}/{len(file_list)}]: {file_path}")
        if modify_file_time(file_path, create_date, modify_date, access_date):
            success_count += 1
    print(f"\n完成! 成功修改 {success_count}/{len(file_list)} 个文件")
def parse_date(date_str):
    """解析日期字符串为datetime对象"""
    if not date_str:
        return None
    try:
        # 支持多种日期格式
        formats = [
            "%Y-%m-%d %H:%M:%S",
            "%Y-%m-%d %H:%M",
            "%Y-%m-%d",
            "%Y/%m/%d %H:%M:%S",
            "%Y/%m/%d %H:%M",
            "%Y/%m/%d"
        ]
        for fmt in formats:
            try:
                return datetime.strptime(date_str, fmt)
            except ValueError:
                continue
        raise ValueError(f"无法解析日期: {date_str}")
    except Exception as e:
        print(f"日期格式错误: {e}")
        sys.exit(1)
def main():
    parser = argparse.ArgumentParser(description='批量修改文件创建时间')
    parser.add_argument('directory', help='目标目录路径')
    # 时间参数组
    time_group = parser.add_mutually_exclusive_group(required=True)
    time_group.add_argument('--create', help='设置创建时间,格式: YYYY-MM-DD HH:MM:SS')
    time_group.add_argument('--offset', type=float, help='以分钟为单位偏移当前时间(正数推迟,负数提前)')
    # 其他参数
    parser.add_argument('--modify', help='设置修改时间(可选)')
    parser.add_argument('--access', help='设置访问时间(可选)')
    parser.add_argument('--ext', default='*', help='文件后缀过滤, --ext .txt 或 --ext txt')
    parser.add_argument('-r', '--recursive', action='store_true', help='递归处理子目录')
    args = parser.parse_args()
    # 解析时间参数
    if args.create:
        create_time = parse_date(args.create)
    elif args.offset:
        from datetime import timedelta
        create_time = datetime.now() + timedelta(minutes=args.offset)
    else:
        create_time = None
    # 可选修改其他时间
    if args.modify:
        modify_time = parse_date(args.modify)
    else:
        modify_time = create_time  # 不指定时使用创建时间
    if args.access:
        access_time = parse_date(args.access)
    else:
        access_time = create_time  # 不指定时使用创建时间
    # 验证目录存在
    if not os.path.isdir(args.directory):
        print(f"错误: 目录不存在 - {args.directory}")
        sys.exit(1)
    # 执行批量修改
    batch_modify(
        args.directory,
        create_time=create_time,
        modify_time=modify_time,
        access_time=access_time,
        extension=args.ext,
        recursive=args.recursive
    )
if __name__ == "__main__":
    # 检查依赖
    try:
        import win32file
        import win32con
        import pywintypes
    except ImportError:
        print("请先安装 pywin32: pip install pywin32")
        sys.exit(1)
    main()

使用方法

安装依赖

pip install pywin32

基本用法

# 设置特定时间
python modify_time.py "D:\文件夹" --create "2023-01-15 10:30:00"
# 设置相对时间(提前3小时)
python modify_time.py "D:\文件夹" --offset -180
# 设置特定后缀的文件
python modify_time.py "D:\文件夹" --create "2023-01-15" --ext .jpg
# 递归处理子文件夹
python modify_time.py "D:\文件夹" --create "2023-01-15" -r
# 同时修改创建和修改时间
python modify_time.py "D:\文件夹" --create "2023-01-15" --modify "2023-02-20"

备用方案:使用PowerShell脚本

# batch_modify_time.ps1
param(
    [string]$Directory,
    [string]$DateTime = "2023-01-15 10:30:00",
    [string]$Extension = "*",
    [switch]$Recursive
)
# 创建目标时间
$targetTime = [datetime]::ParseExact($DateTime, "yyyy-MM-dd HH:mm:ss", $null)
# 获取文件列表
if ($Recursive) {
    $files = Get-ChildItem -Path $Directory -Filter "*$Extension" -Recurse -File
} else {
    $files = Get-ChildItem -Path $Directory -Filter "*$Extension" -File
}
foreach ($file in $files) {
    Write-Host "处理: $($file.FullName)"
    try {
        # 修改创建时间
        $file.CreationTime = $targetTime
        # 修改修改时间
        $file.LastWriteTime = $targetTime
        # 修改访问时间
        $file.LastAccessTime = $targetTime
        $file.Refresh()
        Write-Host "  ✓ 成功" -ForegroundColor Green
    }
    catch {
        Write-Host "  ✗ 失败: $_" -ForegroundColor Red
    }
}
Write-Host "`n完成!共处理 $($files.Count) 个文件"

PowerShell使用示例

# 设置特定时间
.\batch_modify_time.ps1 -Directory "D:\文件夹" -DateTime "2023-01-15 10:30:00"
# 只处理txt文件
.\batch_modify_time.ps1 -Directory "D:\文件夹" -DateTime "2023-01-15" -Extension "*.txt"
# 递归处理
.\batch_modify_time.ps1 -Directory "D:\文件夹" -DateTime "2023-01-15" -Recursive

注意事项

  1. Windows权限:修改文件时间可能需要管理员权限
  2. NTFS文件系统:创建时间仅在NTFS文件系统上有效
  3. 系统保护文件:某些系统文件可能无法修改
  4. 建议备份:批量操作前建议备份重要文件

您可以根据需要选择Python或PowerShell版本使用,如果遇到问题,请告诉我具体错误信息。

抱歉,评论功能暂时关闭!