backup.ps1 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. # ============================================================================
  2. # backup.ps1 — 腾图工具箱 项目备份脚本
  3. #
  4. # 用途:按日期将「必要文件」备份到项目根目录的 bak\<日期> 目录。
  5. # - 项目源码:Go 后端(*.go)、前端源码(frontend/src、frontend/public)、
  6. # 前端入口(frontend/index.html、frontend/package.json、frontend/vite.config.js 等)
  7. # - 项目配置:go.mod / go.sum / Taskfile.yml / config.yml / README.md
  8. # - 用户配置:%APPDATA%\TengTuToolbox 下的 settings.json、ntfy_topics.json、
  9. # ntfy_nicknames.json 等(应用运行产生的真实数据)
  10. #
  11. # 备份目录:<项目根>\bak\YYYYMMDD\ (与已有 bak\20261031\ 约定一致)
  12. # 用法:直接运行,或双击 / 加入计划任务每日执行。
  13. # 例:powershell -ExecutionPolicy Bypass -File D:\My\myapp\backup.ps1
  14. #
  15. # 说明:已存在的同日备份会被覆盖(重复运行即刷新当日快照)。
  16. # ============================================================================
  17. # 项目根目录:脚本所在目录(脚本放在项目根下)
  18. $projectRoot = Split-Path -Parent $MyInvocation.MyCommand.Path
  19. # 备份目标:<项目根>\bak\<日期>
  20. $dateStr = Get-Date -Format 'yyyyMMdd'
  21. $bakRoot = Join-Path $projectRoot 'bak'
  22. $bakDir = Join-Path $bakRoot $dateStr
  23. # 用户配置目录(Wails 应用的配置与历史数据)
  24. $configDir = Join-Path $env:APPDATA 'TengTuToolbox'
  25. # 需要备份的项目源码/配置项(相对 projectRoot 的路径;存在才复制)
  26. $projectItems = @(
  27. '*.go', # Go 后端源码(含 *_test.go)
  28. 'go.mod',
  29. 'go.sum',
  30. 'Taskfile.yml',
  31. 'config.yml',
  32. 'README.md',
  33. 'frontend\src', # 前端 JS 源码
  34. 'frontend\public', # 前端静态资源
  35. 'frontend\index.html',
  36. 'frontend\package.json',
  37. 'frontend\package-lock.json',
  38. 'frontend\vite.config.js',
  39. 'frontend\tsconfig.json',
  40. 'frontend\.npmrc'
  41. )
  42. # 需要备份的用户配置文件名(相对 configDir)
  43. $configFiles = @(
  44. 'settings.json',
  45. 'settings.json.bak',
  46. 'ntfy_topics.json',
  47. 'ntfy_nicknames.json'
  48. )
  49. Write-Host "=== 腾图工具箱 备份 ===" -ForegroundColor Cyan
  50. Write-Host "项目根目录 : $projectRoot"
  51. Write-Host "备份目录 : $bakDir"
  52. Write-Host "配置目录 : $configDir"
  53. # 创建当日备份目录
  54. if (-not (Test-Path $bakDir)) {
  55. New-Item -ItemType Directory -Path $bakDir -Force | Out-Null
  56. }
  57. $copied = 0
  58. $skipped = 0
  59. # 1) 备份项目源码 / 配置
  60. Write-Host "`n[项目文件]" -ForegroundColor Yellow
  61. foreach ($item in $projectItems) {
  62. # 通配符(如 *.go)按匹配展开,普通路径按存在性处理
  63. if ($item -like '*\*' -or $item -like '*.*') {
  64. $matches = Get-ChildItem -Path (Join-Path $projectRoot $item) -ErrorAction SilentlyContinue
  65. foreach ($m in $matches) {
  66. $target = Join-Path $bakDir $m.Name
  67. Copy-Item -Path $m.FullName -Destination $target -Recurse -Force
  68. $copied++
  69. Write-Host " 已复制 : $($m.Name)" -ForegroundColor Green
  70. }
  71. if (-not $matches) { $skipped++ }
  72. } else {
  73. $src = Join-Path $projectRoot $item
  74. if (Test-Path $src) {
  75. $target = Join-Path $bakDir $item
  76. Copy-Item -Path $src -Destination $target -Recurse -Force
  77. $copied++
  78. Write-Host " 已复制 : $item" -ForegroundColor Green
  79. } else {
  80. $skipped++
  81. }
  82. }
  83. }
  84. # 2) 备份用户配置(应用真实数据)
  85. Write-Host "`n[用户配置]" -ForegroundColor Yellow
  86. if (Test-Path $configDir) {
  87. $cfgBak = Join-Path $bakDir 'config'
  88. if (-not (Test-Path $cfgBak)) { New-Item -ItemType Directory -Path $cfgBak -Force | Out-Null }
  89. foreach ($f in $configFiles) {
  90. $src = Join-Path $configDir $f
  91. if (Test-Path $src) {
  92. Copy-Item -Path $src -Destination (Join-Path $cfgBak $f) -Force
  93. $copied++
  94. Write-Host " 已复制 : config\$f" -ForegroundColor Green
  95. } else {
  96. $skipped++
  97. }
  98. }
  99. } else {
  100. Write-Host " 配置目录不存在:$configDir(跳过)" -ForegroundColor DarkGray
  101. $skipped++
  102. }
  103. Write-Host "`n完成:复制 $copied 项,跳过 $skipped 项(不存在)" -ForegroundColor Cyan
  104. Write-Host "备份位置:$bakDir" -ForegroundColor Cyan
  105. # 3) 清理旧备份:仅保留最近 30 天的 bak 日期目录
  106. Write-Host "`n[清理旧备份(保留 30 天)]" -ForegroundColor Yellow
  107. $keepDays = 30
  108. $cutoffStr = (Get-Date).AddDays(-$keepDays).ToString('yyyyMMdd')
  109. Get-ChildItem $bakRoot -Directory -ErrorAction SilentlyContinue | ForEach-Object {
  110. # 目录名为 yyyyMMdd 才按日期处理(字符串比较:yyyyMMdd 字典序=时间序)
  111. if ($_.Name -match '^\d{8}$' -and $_.Name -lt $cutoffStr) {
  112. Remove-Item $_.FullName -Recurse -Force
  113. Write-Host " 已删除 : $($_.Name)" -ForegroundColor DarkRed
  114. }
  115. }
  116. Write-Host "`n备份脚本执行完毕。" -ForegroundColor Green