| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129 |
- # ============================================================================
- # 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
|