本文目录导读:

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()
使用建议
-
选择适合的方案:
- Windows系统:推荐使用PowerShell脚本
- macOS/Linux:推荐使用Bash脚本
- 跨平台:推荐使用Python脚本
- 需要图形界面:使用tkinter GUI版本
-
注意事项:
- NTFS备注仅在Windows系统有效
- 扩展属性在不同系统可能不兼容
- 建议使用元数据文件方案实现跨平台兼容
-
备份建议:
- 重要文件先备份
- 测试脚本在非重要文件上先运行
需要我详细解释某个特定脚本的工作原理或帮你定制特定需求吗?