
先把前提说清楚:**Ditto 没有官方 REST API,也没有对外发布的 SDK**,它的产品文档里也没把命令行参数整理成章节。但如果你去看它的命令行解析实现,会发现 Ditto.exe 确实认一组参数,而且剪贴项历史放在一个标准 SQLite 数据库里。这两件事加起来,足够把"剪贴板"接进你的自动化流程。
本文只写我实际验证过的部分;参数在不同构建之间可能有增删,落地前请先在自己机器上确认。
| 参数 | 作用 |
| /Connect | 让 Ditto 重新连接剪贴板,恢复记录 |
| /Disconnect | 断开剪贴板连接,停止记录新内容 |
| /open | 打开主面板 |
| /close | 关闭主面板 |
| /exit | 退出 Ditto 进程 |
| /PlainTextPaste | 把当前剪贴板内容按纯文本粘贴 |
| /paste:<剪贴项 ID> | 直接粘贴指定 ID 的剪贴项 |
| /edit:<剪贴项 ID> | 打开指定剪贴项的编辑窗口 |
| <导出文件路径> | 传入一个导出的 .dto 文件即导入该剪贴项(安装程序注册了 .dto 关联) |
两个关键行为:**参数大小写不敏感**;/Connect、/Disconnect、/open、/close 这类是发给**已在运行的实例**,新起的进程处理完就退出,不会变成第二个常驻程序。
落地前用三步自测:/open 能弹出面板 → /Disconnect 后复制几段文字,面板里不新增记录 → /Connect 后复制,记录恢复。三步都对,说明参数在你的构建上可用。
最实用的场景不是"多记录",而是**在特定时段不记录**:共享屏幕、录屏、演示、讲解时把密码或客户信息复制进剪贴板,是最典型的翻车点。用参数做成两组动作即可:
$ditto = "C:\Program Files\Ditto\Ditto.exe"
# 进入共享/录屏/演示前:断开剪贴板,停止记录
& $ditto /Disconnect
# 结束后:恢复记录
& $ditto /Connect把它包成"开始共享"和"结束共享"两个 .ps1,或者挂到快捷键上,比事后翻数据库逐条删记录靠谱得多。需要"重载配置"时,用 /exit 优雅退出后再启动一次,比在托盘菜单里点更省事,适合写进部署脚本。
剪贴项历史存在一个 SQLite 文件里,默认位于 %APPDATA%\Ditto\ 目录下,路径可以在"设置数据库路径"里改(便携版则在程序目录)。核心两张表:
Main:一条记录一行。lID 是剪贴项 ID(/paste: 用的就是它),mText 是文本内容,bIsGroup 区分分组条目,lParentID 表示归属分组,stickyClipOrder 是固定剪贴项排序,clipOrder 是普通排序;Data:按剪贴板格式存的数据块,strClipBoardFormat 是格式名(文本、图片、文件路径等),ooData 是二进制内容;Types、CopyBuffers、MainDeletes 等辅助表。**两条纪律**:第一,**不要在 Ditto 运行时直接写数据库**——进程持有连接,外部改动有损坏风险;第二,读取也要绕一步,退出 Ditto 后复制一份副本再只读打开:
import os, sqlite3, shutil
src = os.path.join(os.environ["APPDATA"], "Ditto", "Ditto.db")
shutil.copy2(src, "ditto\_copy.db") # 建议在 Ditto 退出后复制,保证一致性
con = sqlite3.connect("ditto\_copy.db")
rows = con.execute(
"select lID, substr(mText, 1, 60) from Main "
"where mText is not null and bIsGroup = 0 "
"order by clipOrder desc limit 10"
).fetchall()
for r in rows:
print(r)拿这批 ID 就能反向驱动 /paste:<ID>,把"某几条固定内容"变成脚本里的一键粘贴。封装成一个函数大致是这样:
function Paste-DittoClip([int]$ClipId, [string]$DittoExe = "C:\Program Files\Ditto\Ditto.exe") {
& $DittoExe "/paste:$ClipId" # 粘贴到当前前台窗口
}**注意**:/paste:<ID> 是粘贴到**当时的前台窗口**,所以调用前要先让目标窗口获得焦点;ID 也会随数据库重建而变化,适合"查一次、用一次",不适合当长期常量。
数据库是唯一真正值钱的东西,用任务计划做每日快照即可(做之前先让 Ditto 退出,避免复制到写入中途的文件):
# backup\_ditto.ps1
$ditto = "C:\Program Files\Ditto\Ditto.exe"
& $ditto /exit
Start-Sleep -Seconds 2
$dst = "D:\backup\ditto\$(Get-Date -Format yyyyMMdd)"
New-Item -ItemType Directory -Path $dst -Force | Out-Null
robocopy "$env:APPDATA\Ditto" $dst /MIR /R:1 /W:1
Start-Process $ditto # 备份完把 Ditto 拉起来schtasks /Create /TN "DittoDBBackup" /TR "powershell -NoProfile -ExecutionPolicy Bypass -File D:\scripts\backup\_ditto.ps1" /SC DAILY /ST 12:30如果不想中断使用,就用程序自带的"备份数据库"功能,它知道什么时候该冻结写入。
GUI 自动化(AutoHotkey、模拟按键这类)当然能把 Ditto 的界面点一遍,但它做不了两件事:**按内容检索**和**按格式取数据**。判断标准很简单:
我的实际分工是:**数据侧用数据库与命令行参数,交互侧保留人工的 Ctrl+` 与回车**。真正值得自动化的只有"敏感时段关记录""每日备份""固定片段一键粘贴"这三类,其余交给肌肉记忆更快。
/open、/Disconnect 都是命令式动作,返回值只有成功与否,别指望它输出 JSON 做健康检查;/paste:<ID> 依赖 lID,重建数据库或清理记录后 ID 会变,脚本里不要把它当长期常量硬编码。如果你准备照着做,建议按这个顺序,每步都能独立验证:
/open 弹面板、/Disconnect 不记录、/Connect 恢复);lID,用 /paste:<ID> 验证一次粘贴是否落到目标窗口;每一步都留了退路:参数无非是暂停记录、备份无非是多一份副本、粘贴失败最多重按一次热键,都不影响你原来的使用习惯。
把上面这几块拼起来,一个够用的剪贴板自动化就成型了:**平时靠热键和分组管理,敏感时段用参数关闭记录,数据靠 SQLite 备份兜底,跨进程联动交给脚本钩子。** 不需要 API 也能跑得起来。
本文为技术实践分享。文中命令行参数与数据库结构来自对该程序实现的核对,未见于其产品文档,不同版本之间可能存在差异,落地前请在本机先行验证;自动化脚本涉及系统行为,请自行评估风险,作者不对因此产生的数据损失承担责任。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。