# ============================================================================ # backup.ps1 — 腾图工具箱 项目备份脚本 # # 用途:按日期将「必要文件」备份到项目根目录的 bak\<日期> 目录。 # - 项目源码:Go 后端(*.go)、前端源码(frontend/src、frontend/public)、 # 前端入口(frontend/index.html、frontend/package.json、frontend/vite.config.js 等) # - 项目配置:go.mod / go.sum / Taskfile.yml / config.yml / README.md # - 用户配置:%APPDATA%\TengTuToolbox 下的 settings.json、ntfy_topics.json、 # ntfy_nicknames.json 等(应用运行产生的真实数据) # # 备份目录:<项目根>\bak\YYYYMMDD\ (与已有 bak\20261031\ 约定一致) # 用法:直接运行,或双击 / 加入计划任务每日执行。 # 例:powershell -ExecutionPolicy Bypass -File D:\My\myapp\backup.ps1 # # 说明:已存在的同日备份会被覆盖(重复运行即刷新当日快照)。 # ============================================================================ # 项目根目录:脚本所在目录(脚本放在项目根下) $projectRoot = Split-Path -Parent $MyInvocation.MyCommand.Path # 备份目标:<项目根>\bak\<日期> $dateStr = Get-Date -Format 'yyyyMMdd' $bakRoot = Join-Path $projectRoot 'bak' $bakDir = Join-Path $bakRoot $dateStr # 用户配置目录(Wails 应用的配置与历史数据) $configDir = Join-Path $env:APPDATA 'TengTuToolbox' # 需要备份的项目源码/配置项(相对 projectRoot 的路径;存在才复制) $projectItems = @( '*.go', # Go 后端源码(含 *_test.go) 'go.mod', 'go.sum', 'Taskfile.yml', 'config.yml', 'README.md', 'frontend\src', # 前端 JS 源码 'frontend\public', # 前端静态资源 'frontend\index.html', 'frontend\package.json', 'frontend\package-lock.json', 'frontend\vite.config.js', 'frontend\tsconfig.json', 'frontend\.npmrc' ) # 需要备份的用户配置文件名(相对 configDir) $configFiles = @( 'settings.json', 'settings.json.bak', 'ntfy_topics.json', 'ntfy_nicknames.json' ) Write-Host "=== 腾图工具箱 备份 ===" -ForegroundColor Cyan Write-Host "项目根目录 : $projectRoot" Write-Host "备份目录 : $bakDir" Write-Host "配置目录 : $configDir" # 创建当日备份目录 if (-not (Test-Path $bakDir)) { New-Item -ItemType Directory -Path $bakDir -Force | Out-Null } $copied = 0 $skipped = 0 # 1) 备份项目源码 / 配置 Write-Host "`n[项目文件]" -ForegroundColor Yellow foreach ($item in $projectItems) { # 通配符(如 *.go)按匹配展开,普通路径按存在性处理 if ($item -like '*\*' -or $item -like '*.*') { $matches = Get-ChildItem -Path (Join-Path $projectRoot $item) -ErrorAction SilentlyContinue foreach ($m in $matches) { $target = Join-Path $bakDir $m.Name Copy-Item -Path $m.FullName -Destination $target -Recurse -Force $copied++ Write-Host " 已复制 : $($m.Name)" -ForegroundColor Green } if (-not $matches) { $skipped++ } } else { $src = Join-Path $projectRoot $item if (Test-Path $src) { $target = Join-Path $bakDir $item Copy-Item -Path $src -Destination $target -Recurse -Force $copied++ Write-Host " 已复制 : $item" -ForegroundColor Green } else { $skipped++ } } } # 2) 备份用户配置(应用真实数据) Write-Host "`n[用户配置]" -ForegroundColor Yellow if (Test-Path $configDir) { $cfgBak = Join-Path $bakDir 'config' if (-not (Test-Path $cfgBak)) { New-Item -ItemType Directory -Path $cfgBak -Force | Out-Null } foreach ($f in $configFiles) { $src = Join-Path $configDir $f if (Test-Path $src) { Copy-Item -Path $src -Destination (Join-Path $cfgBak $f) -Force $copied++ Write-Host " 已复制 : config\$f" -ForegroundColor Green } else { $skipped++ } } } else { Write-Host " 配置目录不存在:$configDir(跳过)" -ForegroundColor DarkGray $skipped++ } Write-Host "`n完成:复制 $copied 项,跳过 $skipped 项(不存在)" -ForegroundColor Cyan Write-Host "备份位置:$bakDir" -ForegroundColor Cyan # 3) 清理旧备份:仅保留最近 30 天的 bak 日期目录 Write-Host "`n[清理旧备份(保留 30 天)]" -ForegroundColor Yellow $keepDays = 30 $cutoffStr = (Get-Date).AddDays(-$keepDays).ToString('yyyyMMdd') Get-ChildItem $bakRoot -Directory -ErrorAction SilentlyContinue | ForEach-Object { # 目录名为 yyyyMMdd 才按日期处理(字符串比较:yyyyMMdd 字典序=时间序) if ($_.Name -match '^\d{8}$' -and $_.Name -lt $cutoffStr) { Remove-Item $_.FullName -Recurse -Force Write-Host " 已删除 : $($_.Name)" -ForegroundColor DarkRed } } Write-Host "`n备份脚本执行完毕。" -ForegroundColor Green