本文目录导读:

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系统有效
- 扩展属性在不同系统可能不兼容
- 建议使用元数据文件方案实现跨平台兼容
-
备份建议:
- 重要文件先备份
- 测试脚本在非重要文件上先运行
需要我详细解释某个特定脚本的工作原理或帮你定制特定需求吗?
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播