批量添加文件描述备注的脚本

wen 实用脚本 1

本文目录导读:

批量添加文件描述备注的脚本

  1. PowerShell脚本 - 使用NTFS文件属性
  2. Python脚本 - 使用元数据文件
  3. Bash脚本 - 使用扩展属性(Linux/macOS)
  4. 带GUI界面的脚本 (使用tkinter)
  5. 使用建议

PowerShell脚本 - 使用NTFS文件属性

# batch-add-file-comments.ps1
param(
    [string]$Path = ".",
    [string]$Comment = "默认备注内容"
)
# 获取文件夹下所有文件
$files = Get-ChildItem -Path $Path -File
foreach ($file in $files) {
    try {
        # 使用shell.application添加备注
        $shell = New-Object -ComObject Shell.Application
        $folder = $shell.Namespace($file.DirectoryName)
        $fileObj = $folder.ParseName($file.Name)
        # 设置备注(属性索引3通常是"备注")
        $folder.GetDetailsOf($fileObj, 3)
        $fileObj.ExtendedProperty("System.Comment") = $Comment
        Write-Host "已添加备注: $($file.Name)" -ForegroundColor Green
    }
    catch {
        Write-Host "添加备注失败: $($file.Name) - $_" -ForegroundColor Red
    }
}

使用方式:

# 给当前文件夹下所有文件添加备注
.\batch-add-file-comments.ps1 -Comment "2024年项目文件"
# 给指定文件夹添加备注
.\batch-add-file-comments.ps1 -Path "C:\MyFiles" -Comment "重要文档"

Python脚本 - 使用元数据文件

# batch_add_comments.py
import os
import json
import argparse
from datetime import datetime
def add_comments_to_files(directory, comment, metadata_file=".file_comments.json"):
    """批量添加文件备注,保存到元数据文件"""
    metadata_path = os.path.join(directory, metadata_file)
    # 读取现有元数据
    metadata = {}
    if os.path.exists(metadata_path):
        with open(metadata_path, 'r', encoding='utf-8') as f:
            metadata = json.load(f)
    # 获取所有文件
    files = [f for f in os.listdir(directory) 
             if os.path.isfile(os.path.join(directory, f)) and not f.startswith('.')]
    # 添加备注
    for filename in files:
        filepath = os.path.join(directory, filename)
        stat = os.stat(filepath)
        if filename not in metadata:
            metadata[filename] = {}
        metadata[filename]['comment'] = comment
        metadata[filename]['modified'] = datetime.now().isoformat()
        metadata[filename]['size'] = stat.st_size
        print(f"✓ 已添加备注: {filename}")
    # 保存元数据
    with open(metadata_path, 'w', encoding='utf-8') as f:
        json.dump(metadata, f, ensure_ascii=False, indent=2)
    print(f"\n备注已保存到: {metadata_path}")
    print(f"共处理 {len(files)} 个文件")
if __name__ == "__main__":
    parser = argparse.ArgumentParser(description="批量添加文件备注")
    parser.add_argument("directory", nargs="?", default=".", help="目标目录")
    parser.add_argument("-c", "--comment", required=True, help="备注内容")
    parser.add_argument("-m", "--metadata", default=".file_comments.json", 
                       help="元数据文件名")
    args = parser.parse_args()
    add_comments_to_files(args.directory, args.comment, args.metadata)

使用方式:

# 给当前目录所有文件添加备注
python batch_add_comments.py -c "项目文件2024"
# 给指定目录添加备注
python batch_add_comments.py "C:\MyFiles" -c "重要文档备份"

Bash脚本 - 使用扩展属性(Linux/macOS)

#!/bin/bash
# batch-add-comments.sh
# 使用方法
usage() {
    echo "用法: $0 [-d 目录] [-c 备注] [-f 文件类型]"
    echo "  -d: 目标目录 (默认: 当前目录)"
    echo "  -c: 备注内容 (必填)"
    echo "  -f: 文件扩展名过滤 (可选)"
    exit 1
}
# 解析参数
DIRECTORY="."
COMMENT=""
FILTER=""
while getopts "d:c:f:" opt; do
    case $opt in
        d) DIRECTORY="$OPTARG" ;;
        c) COMMENT="$OPTARG" ;;
        f) FILTER="$OPTARG" ;;
        *) usage ;;
    esac
done
# 检查必填参数
if [ -z "$COMMENT" ]; then
    echo "错误: 必须提供备注内容 (-c)"
    usage
fi
# 检查目录
if [ ! -d "$DIRECTORY" ]; then
    echo "错误: 目录不存在: $DIRECTORY"
    exit 1
fi
# 设置find命令
if [ -n "$FILTER" ]; then
    FILES=$(find "$DIRECTORY" -maxdepth 1 -type f -name "*.$FILTER")
else
    FILES=$(find "$DIRECTORY" -maxdepth 1 -type f)
fi
# 遍历文件添加备注
COUNT=0
for file in $FILES; do
    filename=$(basename "$file")
    # 使用xattr设置扩展属性 (macOS/Linux)
    if [[ "$OSTYPE" == "darwin"* ]]; then
        # macOS
        xattr -w "com.apple.metadata:comment" "$COMMENT" "$file" 2>/dev/null
    else
        # Linux
        setfattr -n "user.comment" -v "$COMMENT" "$file" 2>/dev/null
    fi
    if [ $? -eq 0 ]; then
        echo "✓ 已添加备注: $filename"
        ((COUNT++))
    else
        echo "✗ 添加失败: $filename"
    fi
done
echo "处理完成: $COUNT 个文件"

使用方式:

# 给当前目录所有文件添加备注
chmod +x batch-add-comments.sh
./batch-add-comments.sh -c "项目文件2024"
# 只给.txt文件添加备注
./batch-add-comments.sh -c "文本文件" -f txt
# 指定目录
./batch-add-comments.sh -d "/path/to/files" -c "重要文档"

带GUI界面的脚本 (使用tkinter)

# batch_comments_gui.py
import os
import json
import tkinter as tk
from tkinter import filedialog, messagebox, ttk
class BatchCommentsApp:
    def __init__(self, root):
        self.root = root
        self.root.title("批量文件备注工具")
        self.root.geometry("600x400")
        # 变量
        self.directory = tk.StringVar(value=os.getcwd())
        self.comment = tk.StringVar()
        self.filter_ext = tk.StringVar()
        # 创建界面
        self.create_widgets()
    def create_widgets(self):
        # 目录选择
        tk.Label(self.root, text="目标目录:").pack(pady=5)
        dir_frame = tk.Frame(self.root)
        dir_frame.pack(pady=5)
        tk.Entry(dir_frame, textvariable=self.directory, width=50).pack(side=tk.LEFT, padx=5)
        tk.Button(dir_frame, text="浏览", command=self.browse_directory).pack(side=tk.LEFT)
        # 备注内容
        tk.Label(self.root, text="备注内容:").pack(pady=5)
        tk.Entry(self.root, textvariable=self.comment, width=60).pack(pady=5)
        # 文件过滤
        tk.Label(self.root, text="文件类型过滤 (如: txt, 留空表示所有):").pack(pady=5)
        tk.Entry(self.root, textvariable=self.filter_ext, width=20).pack(pady=5)
        # 处理按钮
        tk.Button(self.root, text="开始添加备注", command=self.process_files,
                 bg="green", fg="white", font=("Arial", 12)).pack(pady=20)
        # 结果显示
        self.result_text = tk.Text(self.root, height=10, width=70)
        self.result_text.pack(pady=10)
        # 滚动条
        scrollbar = tk.Scrollbar(self.result_text)
        scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
        self.result_text.config(yscrollcommand=scrollbar.set)
        scrollbar.config(command=self.result_text.yview)
    def browse_directory(self):
        directory = filedialog.askdirectory()
        if directory:
            self.directory.set(directory)
    def process_files(self):
        directory = self.directory.get()
        comment = self.comment.get()
        filter_ext = self.filter_ext.get().strip()
        if not comment:
            messagebox.showerror("错误", "请输入备注内容")
            return
        if not os.path.isdir(directory):
            messagebox.showerror("错误", "目录不存在")
            return
        self.result_text.delete(1.0, tk.END)
        # 获取文件列表
        try:
            all_files = os.listdir(directory)
        except Exception as e:
            self.result_text.insert(tk.END, f"读取目录失败: {e}")
            return
        # 过滤文件
        files = []
        for f in all_files:
            filepath = os.path.join(directory, f)
            if os.path.isfile(filepath):
                if filter_ext:
                    if f.endswith(f".{filter_ext}"):
                        files.append(f)
                else:
                    files.append(f)
        if not files:
            self.result_text.insert(tk.END, "没有找到匹配的文件")
            return
        # 添加备注(使用JSON元数据文件)
        metadata_file = os.path.join(directory, ".file_comments.json")
        metadata = {}
        if os.path.exists(metadata_file):
            with open(metadata_file, 'r', encoding='utf-8') as f:
                metadata = json.load(f)
        success_count = 0
        for filename in sorted(files):
            filepath = os.path.join(directory, filename)
            stat = os.stat(filepath)
            if filename not in metadata:
                metadata[filename] = {}
            metadata[filename]['comment'] = comment
            metadata[filename]['modified'] = str(os.path.getmtime(filepath))
            metadata[filename]['size'] = stat.st_size
            self.result_text.insert(tk.END, f"✓ {filename}\n")
            self.result_text.see(tk.END)
            self.root.update()
            success_count += 1
        # 保存元数据
        with open(metadata_file, 'w', encoding='utf-8') as f:
            json.dump(metadata, f, ensure_ascii=False, indent=2)
        self.result_text.insert(tk.END, f"\n处理完成! 共添加 {success_count} 个文件的备注\n")
        self.result_text.insert(tk.END, f"备注信息保存在: {metadata_file}\n")
        messagebox.showinfo("完成", f"成功处理 {success_count} 个文件!")
if __name__ == "__main__":
    root = tk.Tk()
    app = BatchCommentsApp(root)
    root.mainloop()

使用建议

  1. 选择适合的方案

    • Windows系统:推荐使用PowerShell脚本
    • macOS/Linux:推荐使用Bash脚本
    • 跨平台:推荐使用Python脚本
    • 需要图形界面:使用tkinter GUI版本
  2. 注意事项

    • NTFS备注仅在Windows系统有效
    • 扩展属性在不同系统可能不兼容
    • 建议使用元数据文件方案实现跨平台兼容
  3. 备份建议

    • 重要文件先备份
    • 测试脚本在非重要文件上先运行

需要我详细解释某个特定脚本的工作原理或帮你定制特定需求吗?

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