PowerShell批量文件备份脚本
自动备份指定目录到目标位置,支持增量备份、压缩、保留天数、日志记录,可配合任务计划定时执行。
详细内容
# PowerShell批量文件备份脚本
# 使用方法: .\backup.ps1 -SourcePath "C:\重要文件" -BackupPath "D:\备份"
param(
[string]$SourcePath = "C:\Users\$env:USERNAME\Documents",
[string]$BackupPath = "D:\Backup",
[int]$RetentionDays = 30,
[switch]$Compress
)
# 创建备份目录
$timestamp = Get-Date -Format "yyyyMMdd_HHmmss"
$backupDir = Join-Path $BackupPath "backup_$timestamp"
New-Item -ItemType Directory -Path $backupDir -Force | Out-Null
# 日志文件
$logFile = Join-Path $BackupPath "backup_$(Get-Date -Format 'yyyyMMdd').log"
function Write-Log {
param([string]$Message, [string]$Level = "INFO")
$logEntry = "[$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')] [$Level] $Message"
Add-Content -Path $logFile -Value $logEntry -Encoding UTF8
Write-Host $logEntry
}
Write-Log "========================================"
Write-Log "开始备份任务"
Write-Log "源目录: $SourcePath"
Write-Log "目标目录: $backupDir"
Write-Log "========================================"
# 检查源目录
if (-not (Test-Path $SourcePath)) {
Write-Log "源目录不存在: $SourcePath" "ERROR"
exit 1
}
# 统计文件
$files = Get-ChildItem -Path $SourcePath -Recurse -File -ErrorAction SilentlyContinue
$totalSize = ($files | Measure-Object Length -Sum).Sum
Write-Log "待备份文件数: $($files.Count),总大小: $([math]::Round($totalSize/1MB, 2)) MB"
# 执行备份
if ($Compress) {
# 压缩备份
$zipPath = Join-Path $BackupPath "backup_$timestamp.zip"
Write-Log "正在压缩备份..."
Compress-Archive -Path "$SourcePath\*" -DestinationPath $zipPath -Force
$zipSize = (Get-Item $zipPath).Length
Write-Log "压缩完成: $zipPath ($[math]::Round($zipSize/1MB, 2)) MB"
} else {
# 直接复制
Write-Log "正在复制文件..."
Copy-Item -Path $SourcePath -Destination $backupDir -Recurse -Force
Write-Log "复制完成"
}
# 清理过期备份
Write-Log "清理${RetentionDays}天前的备份..."
Get-ChildItem -Path $BackupPath -Directory -Filter "backup_*" | Where-Object {
$_.LastWriteTime -lt (Get-Date).AddDays(-$RetentionDays)
} | ForEach-Object {
Remove-Item $_.FullName -Recurse -Force
Write-Log "已删除过期备份: $($_.Name)"
}
# 同时清理过期压缩包
Get-ChildItem -Path $BackupPath -Filter "backup_*.zip" | Where-Object {
$_.LastWriteTime -lt (Get-Date).AddDays(-$RetentionDays)
} | ForEach-Object {
Remove-Item $_.FullName -Force
Write-Log "已删除过期压缩包: $($_.Name)"
}
Write-Log "========================================"
Write-Log "备份任务完成!"
Write-Log "========================================"
# ========== 定时任务配置 ==========
# 每天凌晨2点自动备份:
# schtasks /create /tn "每日备份" /tr "powershell -File C:\Scripts\backup.ps1" /sc daily /st 02:00